为Meteor推荐的Nginx配置

26

我的Meteor应用程序的站点配置具有以下类似的指令:

server {
  listen 443;
  server_name XXX;

  ssl on;
  ssl_certificate XXX;
  ssl_certificate_key XXX;

  location / {
    proxy_pass http://localhost:3000;
    proxy_set_header X-Real-IP $remote_addr;  # http://wiki.nginx.org/HttpProxyModule
    proxy_http_version 1.1;  # recommended for keep-alive connections per http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_http_version
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
  }
}

我觉得我应该告诉nginx来提供static_cacheable的内容并设置expires头为max。我应该怎么做?这里还有其他需要添加的东西吗?

2个回答

26

虽然我不是nginx专家,但现在我感觉我对如何做到这一点有了更好的理解。随着我认识的更多,我会更新这个答案。

我原来问题的一个可能解决方案是:

location ~* "^/[a-z0-9]{40}\.(css|js)$" {
  root /home/ubuntu/app/bundle/programs/web.browser;
  access_log off;
  expires max;
}

这段话的意思是:包含斜杠后跟40个字母数字字符+ .js或.css后缀名的此站点的任何URL都可以在web.browser目录中找到。静态地提供这些文件,不要将它们写入访问日志,并告诉客户端可以永久缓存它们。

由于主要的CSS和JS文件根据每次打包操作具有唯一的名称,因此这样做应该是安全的。

我将在这里维护一个完整版本的示例。还值得注意的是,我正在使用支持WebSockets的最新版本的nginx,如此处所述

最后,请不要忘记在您的nginx配置中完全启用gzip。我的gzip部分看起来像:

gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

做完这些后,我能够在 pagespeed 上获得一个不错的分数。

更新 9/17/2014:

更新了meteor 0.9.2.1的路径。


1
如果允许缓存所有的 css/js 文件,当您在 client 目录中更改 Meteor 文件时,用户的副本是否仍将更新(例如热代码重新加载)? - Nyxynyx
1
是的。每次打包您的应用程序时,它都会创建一组新的具有唯一名称的CSS和JS文件。 - David Weldon
@AndrewMao 这个配置假设应用程序已经被捆绑。您需要修改路径并删除 expires 头文件,以使其在开发模式下正常工作,但这应该是可能的。 - David Weldon
1
@AndrewMao 很好 - 高兴你弄好了。我没将gzip设置添加到摘要中,因为它们确实属于主nginx.conf的不同部分,而不是站点配置。我认为真正的解决方案是我在博客中介绍我如何在生产中使用它。当我这样做时,我会从答案中添加一个链接。 - David Weldon
1
我建议如果它们来自同一实例,也可以添加jpg或png资源。 - mirageglobe
显示剩余5条评论

9
我对其他答案进行了一些更新和改进,具体来说:
  • 需要设置X-Forwarded-For头以便于Meteor在IP地址检测时使用this file。看起来没有使用X-Real-IP
  • /nginx_status路径可用于监视通过代理传输的流量量。

我稍微调整了一下配置,得到了以下结果。请根据需要编辑您的字段。

首先是压缩,这可以显著加快加载时间。请注意,gzip_buffers指令通常会自动计算默认值,使用系统的内存页面大小:

gzip on;                                                                                                                                                  
gzip_disable "msie6";                                                                                                                                     
gzip_min_length 1100;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

服务器配置本身:
server {
    listen 443 ssl;
    server_name my.domain.com;

    ssl on;
    ssl_certificate /etc/ssl/nginx/certificate.crt;
    ssl_certificate_key /etc/ssl/nginx/certificate.key;

    access_log /var/log/nginx/localhost.ssl_access_log main;
    error_log /var/log/nginx/localhost.ssl_error_log info;

    # Forward to meteor server                                                                                                                        
    location / {
         proxy_pass http://localhost:3000;
         proxy_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection "upgrade";
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    # copied from http://blog.kovyrin.net/2006/04/29/monitoring-nginx-with-rrdtool/
    location /nginx_status {
         stub_status on;
         access_log off;
         allow 192.168.0.0/24;
         deny all;
    }
}

最后,正如Dan所提到的,您需要在Meteor中设置HTTP_FORWARDED_COUNT环境变量,以正确地从反向代理后面获取客户端IP。


谢谢Andrew。我发现另一个好的资源是h5bp/server-configs-nginx - David Weldon
感谢更新;已删除我的评论。我还测试了X-Real-IP和X-Forwarded-For,只有后者被Meteor读取。这符合[livedata_server](https://github.com/meteor/meteor/blob/devel/packages/ddp-server/livedata_server.js#L824)代码的预期。 - Dan Dascalescu
环境变量HTTP_FORWARDED_COUNT仍然需要吗?http://www.meteorpedia.com/read/nginx是否最新? - Liko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接