流星推荐的 nginx 配置
Posted
技术标签:
【中文标题】流星推荐的 nginx 配置【英文标题】:recommended nginx configuration for meteor 【发布时间】:2013-08-02 22:40:22 【问题描述】:我的流星应用程序的站点配置具有如下所示的指令:
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
。我该怎么做呢?我还应该在这里添加其他内容吗?
【问题讨论】:
【参考方案1】:我对另一个答案进行了一些更新和改进。具体来说,
X-Forwarded-For
标头需要为 Meteor 的新 IP address detection 设置,这是在 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。
【讨论】:
谢谢安德鲁。我发现的另一个好资源是h5bp/server-configs-nginx。 感谢更新;删除了我的评论。我还测试了 X-Real-IP 和 X-Forwarded-For,只有后者被 Meteor 读取。正如预期的基于livedata_server 代码。 Env var HTTP_FORWARDED_COUNT 是否仍然需要? meteorpedia.com/read/nginx 是最新的吗?【参考方案2】:虽然我不是 nginx 专家,但我觉得我现在对如何做到这一点有了更好的理解。当我弄清楚更多时,我会更新这个答案。
我原来的问题的一个可能的解决方案是:
location ~* "^/[a-z0-9]40\.(css|js)$"
root /home/ubuntu/app/bundle/programs/web.browser;
access_log off;
expires max;
其中说:此站点的任何 URL 包含一个斜线,后跟 40 个字母数字字符 + .js 或 .css,都可以在 web.browser
目录中找到。静态服务这些文件,不要将它们写入访问日志,并告诉客户端它们可以永久缓存。
因为主要的 css 和 js 文件在每个 bundle 操作之后都是唯一命名的,所以这样做应该是安全的。
我将维护此示例的完整版本here。还值得注意的是,我正在使用最近构建的支持 WebSockets 的 nginx,如 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 日更新:
更新了流星 0.9.2.1 的路径
【讨论】:
如果您允许缓存所有css
/js
文件,当您更改 @987654329 中的 Meteor 文件时,用户的副本是否仍会更新(如热代码重新加载) @目录?
是的。每次你捆绑你的应用程序时,它都会创建一对具有唯一名称的新 css 和 js 文件。
在站点上与实时用户一起部署时,您如何处理保持 websocket 连接处于活动状态?我收到 502 Bad Gateway 错误,当前用户必须重新加载应用程序。
@AndrewMao 很好 - 很高兴你能成功。我没有将 gzip 设置添加到要点中,因为它们确实属于主 nginx.conf 的不同部分,而不是站点配置。我认为真正的解决方案是让我在博客上写下我是如何在生产中做到这一点的。当我这样做时,我会从答案中添加一个链接。
我建议也添加 jpg 或 png 资源?如果它们是从同一个实例中提供的。以上是关于流星推荐的 nginx 配置的主要内容,如果未能解决你的问题,请参考以下文章