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;
  }
}

のコンテンツを提供し、ヘッダーを にstatic_cacheable設定するように nginx に指示する必要があるように感じます。どうすれば正確にそれを行うことができますか?ここに追加する必要があるものは他にありますか?expiresmax

4

2 に答える 2

26

私は nginx の専門家ではありませんが、これを行う方法をよりよく理解しているように感じます。詳細がわかり次第、この回答を更新します。

私の元の質問に対する1つの可能な解決策はこれです:

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でまともなスコアを得ることができました。

2014 年 9 月 17 日更新:

meteor 0.9.2.1 のパスを更新しました

于 2013-08-04T03:56:50.653 に答える
10

他の回答にいくつかの更新と改善を加えました。具体的には、

  • このファイルで行われるMeteor の新しいIP アドレス検出のためにX-Forwarded-Forヘッダーを設定する必要があります。使用されているようには見えません。X-Real-IP
  • この/nginx_statusパスを使用して、プロキシを通過するトラフィックの量を監視できます。

私はこれを少しいじって、次の構成を考え出しました。フィールドを適切に編集します。

1 つ目は、読み込み時間を大幅に短縮する圧縮です。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 に答える