Подтвердить что ты не робот

Рекомендуемая конфигурация nginx для метеора

Конфигурация сайта для моего приложения 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. Как именно я это делаю? Есть ли другие вещи, которые я должен добавить здесь?

4b9b3361

Ответ 1

Хотя я не эксперт 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 уникально названы после каждой операции с пакетом, это должно быть безопасно.

Я буду поддерживать полную версию этого примера здесь. Также стоит отметить, что я использую недавнюю сборку nginx, которая поддерживает WebSockets, как описано здесь здесь.

Наконец, не забудьте полностью включить gzip в вашей конфигурации nginx. Моя секция 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:

Обновлены пути для метеора 0.9.2.1

Ответ 2

Я сделал некоторые обновления и улучшения для другого ответа. В частности,

  • заголовок X-Forwarded-For должен быть установлен для Meteor new обнаружение 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;
    }
}

Наконец, как отметил Дан, вам нужно будет установить переменную среды HTTP_FORWARDED_COUNT в Meteor, чтобы правильно подобрать IP-адреса клиента из-за обратного прокси.