26

我的流星应用程序的站点配置具有如下所示的指令:

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. 我该怎么做呢?我还应该在这里添加其他内容吗?

4

2 回答 2

26

虽然我不是 nginx 专家,但我觉得我现在对如何做到这一点有了更好的理解。当我发现更多时,我会更新这个答案。

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

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

其中说:可以在web.browser目录中找到包含斜线后跟 40 个字母数字字符 + .js 或 .css 的该站点的任何 URL。静态服务这些文件,不要将它们写入访问日志,并告诉客户端它们可以被永久缓存。

因为主要的 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上获得了不错的分数。

2014 年 9 月 17 日更新:

更新了流星 0.9.2.1 的路径

于 2013-08-04T03:56:50.653 回答
10

我对另一个答案进行了一些更新和改进。具体来说,

  • X-Forwarded-For需要为在此文件中完成的 Meteor的新IP 地址检测设置标头。似乎没有使用。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。

于 2014-06-30T18:56:39.827 回答