为流星推荐的nginx配置

时间:2013-08-01 20:14:50

标签: nginx meteor

我的meteor app的网站配置包含如下所示的指令:

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 个答案:

答案 0 :(得分: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,可在web.browser目录中找到。静态服务这些文件,不要将它们写入访问日志,并告诉客户端它们可以永久缓存。

因为主css和js文件是在每个bundle操作之后唯一命名的,所以这应该是安全的。

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

最后,不要忘记在你的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得到了一个不错的分数。

更新2014年9月17日:

更新了meteor 0.9.2.1的路径

答案 1 :(得分:9)

我对其他答案进行了一些更新和改进。具体地,

  • 需要为IP address detection中完成的Meteor的新this file设置X-Forwarded-For标头。似乎没有使用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。