RTFM.WIKI

Ordnung muß sein. Ordnung über alles (18+)

Инструменты пользователя

Инструменты сайта


Боковая панель


Навигация


Линкшэринг


WTF?!

Написать в спортлото

Донат Данкинс


Добавить новую страницу

Вы не можете добавлять страницы
linux:nginx:index

Содержание

Меню категории NGINX

Nginx Config Formatter

Редирект на https://foobar.com

server {
    listen 80;
    server_name foobar.com www.foobar.com
    return 301 https://www.foobar.com$request_uri;
}
server {
    listen 443 ssl;
    server_name foobar.com;

    ssl_certificate     /etc/nginx/ssl/www.foobar.com.crt;
    ssl_certificate_key /etc/nginx/ssl/www.foobar.com.key;

    return 301 https://www.foobar.com$request_uri;
}

server {
    listen 443 ssl;
    server_name www.foobar.com;
    root /var/www/html

    ssl_certificate     /etc/nginx/ssl/www.foobar.com.crt;
    ssl_certificate_key /etc/nginx/ssl/www.foobar.com.key;
}

Генератор конфига

Много соединений в TIME_WAIT

Apache (backend) nginx (frontend)

В netstat сотни/тысячи коннектов в состоянии TIME_WAIT

Скорее всего это нормально если включён keepalive

Применять с осторожностью

echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse

Или добавить в /etc/sysctl.conf

net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1
net.ipv4.tcp_fin_timeout=15
net.ipv4.ip_local_port_range = 10240 65000

monit

https://mmonit.com/wiki/Monit/Nginx

server {
  listen 80;
  server_name monit.domain.com;
  location / {
    proxy_pass 127.0.0.1:2812;
    proxy_set_header Host $host;
  }
}

fastcgi_intercept_errors

ondemand или dynamic

Как быть с пулами в php-fpm, если сайтов больше 2-x? A better way to run PHP-FPM

Во-первых пул это просто набор процессов. Это не какой-то отдельный процесс.
При политике ondemand воркеры создаётся только тогда когда приходит запрос. Через несколько секунд (задаётся в настройках) после завершения обработки запроса (если не поступит нового запроса который можно передать воркеру) воркер убивается.
При dynamic демон всегда поддерживает некоторое заданное количество воркеров в пуле, и распределяет запросы между ними. Если для обработки запросов не хватает воркеров то демон создаёт дополнительных (вплоть до некоторого конфигурируемого значения). Когда потребность в дополнительных воркерах отпадает демон убивает лишние, так что-бы осталось нужное количество.
Профит от повторного использования воркеров в том что не тратится время на повторное создание процесса. Но если у тебя тормозной код то на его фоне ты этого времени всё-равно не заметишь.
На сколько я понимаю это происходит как-то так. Попаболь в том что воркеры не особо спешат освобождать память использованную для обработки запроса (кстати я не в курсе баг это или какая-то непонятная фича). По этому если твоё приложение на обработку каждого запроса тратит (например) 100 мб памяти и у тебя есть 3 воркера, каждый из которых за свою жизнь получил хотя-бы один запрос, то у тебя в системе будет висеть три процесса каждый из которых выжирает по 100 мб памяти, даже если запросов в тот пул сейчас нет вообще. Побаболь наступает тогда когда у тебя есть куча малопосещаемых сайтов с жадным до памяти кодом. У меня используется dynamic для пулов которые без запросов не остаются, и ondemand для малопосещаемых сайтов.

Перенаправление на SSL-адрес (HTTPS) с нестандартным портом

via http://www.f-notes.info/nginx:ssl_non-stadard_port

error_page 497 https://$server_name:8443$request_uri;

Начиная с версии 1.9.11 введена поддержка динамических модулей

# yum install nginx-module-geoip command

Добавляем в самое начало файла /etc/nginx/nginx.conf

load_module "modules/ngx_http_geoip_module.so";

Примеры использования модуля - http://nginx.org/en/docs/http/ngx_http_geoip_module.html

http://blog.ls20.com/optimizing-nginx-config-for-your-website-or-blog/

TCP_CORK/TCP_NOPUSH и TCP_NODELAY

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

Да, в Линкусе TCP_CORK (tcp_nopush) и TCP_NODELAY взаимоисключающие, но nginx проявляет недюженный интеллект, пытаясь совместить преимущества обеих опций.

"tcp_nopush on" полезно для sendfile(), он в этом случае выводит данные полными пакетами. После того, как весь запрос обработан, TCP_CORK/TCP_NOPUSH выключается, что приводит в сбросу последнего неполного пакета.

"tcp_nodelay on" полезно для keep-alive. nginx включает TCP_NODELAY только по окончании запроса, после которого соединение переходит в состоянии keep-alive. До этого nginx выводит данные вызовами writev() достаточно большими порциями для заполнения пакета ("postpone_output 1460"), поэтому данные должны уходить без задержек и TCP_NODELAY не нужен. А вот с последним неполным пакетом может случится небольшая задержка, если соединение не закрывается. Для этого и нужно включить TCP_NODELAY.

В Линуксе обработка этих двух опций

tcp_nopush on;

   tcp_nodelay      on;

такова:

1) если данные будут выводить комбинацией writev(заголовок)/sendfile(), то проверяется, не было ли уже включен TCP_NODELAY. Если было, то TCP_NODELAY выключается и включается TCP_CORK. По окончании передачи TCP_CORK выключается. Включать TCP_NODELAY не нужно, так как выключание TCP_CORK сбрасывает данные.

2) если при переходе в keep-alive TCP_CORK не была включена, то включается TCP_NODELAY, чтобы сбросить неполный пакет.

Кстати, возможно, для "proxy_buffering off" имеет смысл включать TCP_NODELAY до отдачи ответа.

Игорь Сысоев http://sysoev.ru

Блокируем реферальный спам

https://fadeit.dk/blog/post/nginx-referer-spam-blacklist

http://lonegoatuk.tumblr.com/post/107307494431/google-analytics-referral-spambot-list

http://stackoverflow.com/questions/457447/how-to-block-referral-spam-using-nginx/33578063#33578063

В этом нам поможет ngx_http_map_module

https://www.nginx.com/resources/wiki/start/topics/examples/refererspam/

map $http_referer $bad_referer {
    hostnames;
    default                         0;
    .semalt.com                     1;
    .kambasoft.com                  1;
    .savetubevideo.com              1;
    .descargar-musica-gratis.net    1;
    .7makemoneyonline.com           1;
    .baixar-musicas-gratis.com      1;
    .iloveitaly.com                 1;
    .iloveitaly.co                  1;
    .ilovevitaly.ru                 1;
    .fbdownloader.com               1;
    .econom.co                      1;
    .buttons-for-website.com        1;
    .buttons-for-your-website.com   1;
    .free-share-buttons.com         1;
    .srecorder.co                   1;
    .darodar.com                    1;
    .priceg.com                     1;
    .blackhatworth.com              1;
    .adviceforum.info               1;
    .hulfingtonpost.com             1;
    .best-seo-offer.com             1;
    .best-seo-solution.com          1;
}


if ($bad_referer) {
 return 444;
}

https://webcache.googleusercontent.com/search?q=cache:rCWGp-PNnrsJ:https://tushev.org/articles/linux-bsd/32/using-dynamic-geoip-module-with-nginx-centos+&cd=2&hl=ru&ct=clnk&gl=ru&client=safari

stub http://nginx.org/en/docs/http/ngx_http_stub_status_module.html

https://biz0n.ru/2015/11/06/nginx-блокировка-ботов/

Active connections — количество открытых соединений
server accepts handled requests — Сервер принял 352 соединения, обработал 352 соединения и обработал 886 запроса
Reading — количество запросов, заголовки которых nginx читает в данный момент
Writing — количество запросов, тело которых читает nginx + количество запросов для которых nginx отдает данные
Waiting — количетсво keep-alive соединений, расчитывается как: waiting = active — reading — writing

gzip

http://nginx.org/ru/docs/http/ngx_http_gzip_module.html

wp-login.php

location /wp-login.php {

  allow ip;
  deny all;

}

How to set MaxClients in Apache/prefork

http://tweaked.io/guide/nginx/

nginx

https://github.com/ngx/ngx-conf

Гид по заголовкам кэширования HTTP для начинающих

fpm

https://tresnet.ru/archives/1313

Apache vs Nginx: Расставим точки над ё.

ssl


не работает htaccess при использовании mod_rpaf

Конфигурация

Примеры для Wordpress, Joomla, Drupal

Wordpress

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

       # конфигурация nginx для гипотетического пользователя хостинга username для сайта номер "один"
       #
       # параметр listen и proxy_pass генерируется нашей системой автоматически по внутренним параметрам
       server {
                listen 192.168.0.1:80;               # IP-адрес сервера
                proxy_buffer_size         8k;       # параметр изменяется в панели управления
                client_max_body_size   16m;    # параметр изменяется в панели управления
                client_body_buffer_size 512k;

                # кэш имён файлов для disable_symlinks
                open_file_cache          max=1000 inactive=20s; 
                open_file_cache_valid    30s;
                open_file_cache_min_uses 2;
                open_file_cache_errors   on;

                # имена сайта
                server_name example.com;
                server_name www.example.com

                # отключение лишних журналов
                access_log  off;
                log_not_found off;

                # корневая папка для статических файлов
                root /home/username/www/site1/public_html;
                index index.html;

                # запрет символьных ссылок на "чужие" файлы
                # если файл находится внутри папки /home/username/www/site1/public_html , 
                # то эту часть не проверять по соображением производительности
                disable_symlinks if_not_owner from=/home/username/www/site1/public_html;
                
                # обработать запрос, не соответствующий уточнениям ниже
                location / {
                        access_log /home/username/www/site1/logs/nginx-access.log;
                        charset utf-8;
                        source_charset utf-8;
                        try_files $uri @apache;
                }

                # запретить доступ к системным файлам
                location ~ /\. {
                        deny all;
                }

                # запретить доступ к скриптам .php в каталогах, использующихся для заливки файлов
                location ~* /(?:uploads|files)/.*\.php$ {
                        deny all;
                }

                # отдать напрямую favicon.ico
                location = /favicon.ico {
                        access_log /home/username/www/site1/logs/nginx-access.log;
                }
                
                # отдать напрямую robots.txt
                location = /robots.txt {
                        allow all;
                        access_log /home/username/www/site1/logs/nginx-access.log;
                }

                # попытаться отдать файл с одним из расширений напрямую минуя apache
                location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                        access_log /home/username/www/site1/logs/nginx-access.log;
                        charset utf-8;
                        source_charset utf-8;
                        expires 24h;
                }

                # запретить все прямые обращения к несуществующим файлам .php
                location ~ \.php$ {
                        try_files $uri =404;
                        proxy_pass  http://127.0.0.1:11111;
                }
                
                # передать запрос к apache
                location @apache {
                        proxy_pass  http://127.0.0.1:11111;
                }

        }

Joomla

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

       # конфигурация nginx для гипотетического пользователя хостинга username для сайта номер "один"
       #
       # параметр listen и proxy_pass генерируется нашей системой автоматически по внутренним параметрам
       server {
                listen 192.168.0.1:80;               # IP-адрес сервера
                proxy_buffer_size         8k;       # параметр изменяется в панели управления
                client_max_body_size   16m;    # параметр изменяется в панели управления
                client_body_buffer_size 512k;

                # кэш имён файлов для disable_symlinks
                open_file_cache          max=1000 inactive=20s; 
                open_file_cache_valid    30s;
                open_file_cache_min_uses 2;
                open_file_cache_errors   on;

                # имена сайта
                server_name example.com;
                server_name www.example.com

                # отключение лишних журналов
                access_log  off;
                log_not_found off;

                # корневая папка для статических файлов
                root /home/username/www/site1/public_html;
                index index.html;

                # запрет символьных ссылок на "чужие" файлы
                # если файл находится внутри папки /home/username/www/site1/public_html , 
                # то эту часть не проверять по соображением производительности
                disable_symlinks if_not_owner from=/home/username/www/site1/public_html;
                
                # обработать запрос, не соответствующий уточнениям ниже
                location / {
                        access_log /home/username/www/site1/logs/nginx-access.log;
                        charset utf-8;
                        source_charset utf-8;
                        try_files $uri @apache;
                }

                # запретить доступ к файлам репозиториев, если они случайно оказались в публичном месте
                location ~ /\.svn {
                        deny all;
                }
                location ~ /\.git {
                        deny all;
                }
                location ~ /\.hg {
                        deny all;
                }

                # запретить доступ к файлам .htaccess и .htpasswd
                location ~ /\.ht {
                        deny all;
                }

                # избыточный запрет вызова исполняемых файлов из несоответствующих каталогов
                location ~* /(images|cache|media|logs|tmp)/.*\.(php|pl|py|jsp|asp|sh|cgi)$ {
                        return 403;
                }

                # попытаться отдать файл с одним из расширений напрямую минуя apache
                location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                        access_log %%sitedir%%/logs/nginx-access.log;
                        charset utf-8;
                        source_charset utf-8;
                        expires 24h;
                }

                # запретить все прямые обращения к несуществующим файлам .php
                location ~ \.php$ {
                        try_files $uri =404;
                        proxy_pass  http://127.0.0.1:11111;
                }
                
                # передать запрос к apache
                location @apache {
                        proxy_pass  http://127.0.0.1:11111;
                }

        }

Drupal

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

       # конфигурация nginx для гипотетического пользователя хостинга username для сайта номер "один"
       #
       # параметр listen и proxy_pass генерируется нашей системой автоматически по внутренним параметрам
       server {
                listen 192.168.0.1:80;               # IP-адрес сервера
                proxy_buffer_size         8k;       # параметр изменяется в панели управления
                client_max_body_size   16m;    # параметр изменяется в панели управления
                client_body_buffer_size 512k;

                # кэш имён файлов для disable_symlinks
                open_file_cache          max=1000 inactive=20s; 
                open_file_cache_valid    30s;
                open_file_cache_min_uses 2;
                open_file_cache_errors   on;

                # имена сайта
                server_name example.com;
                server_name www.example.com

                # отключение лишних журналов
                access_log  off;
                log_not_found off;

                # корневая папка для статических файлов
                root /home/username/www/site1/public_html;
                index index.html;

                # запрет символьных ссылок на "чужие" файлы
                # если файл находится внутри папки /home/username/www/site1/public_html , 
                # то эту часть не проверять по соображением производительности
                disable_symlinks if_not_owner from=/home/username/www/site1/public_html;
                
                # обработать запрос, не соответствующий уточнениям ниже
                location / {
                        access_log /home/username/www/site1/logs/nginx-access.log;
                        charset utf-8;
                        source_charset utf-8;
                        try_files $uri @apache;
                }

                # запретить махинации с php
                location ~ \..*/.*\.php$ {
                        return 403;
                }
                # запретить доступ к резервным копиям извне
                location = /backup {
                        deny all;
                }

                # запретить доступ к файлам репозиториев, если они случайно оказались в публичном месте
                location ~ /\.svn {
                        deny all;
                }
                location ~ /\.git {
                        deny all;
                }
                location ~ /\.hg {
                        deny all;
                }

                # запретить доступ к файлам .htaccess и .htpasswd
                location ~ /\.ht {
                        deny all;
                }

                # отдать напрямую favicon.ico
                location = /favicon.ico {
                        access_log /home/username/www/site1/logs/nginx-access.log;
                }
                
                # отдать напрямую robots.txt
                location = /robots.txt {
                        allow all;
                        access_log /home/username/www/site1/logs/nginx-access.log;
                }

                # попытаться отдать файл с одним из расширений напрямую минуя apache
                location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                        access_log /home/username/www/site1/logs/nginx-access.log;
                        charset utf-8;
                        source_charset utf-8;
                        expires 24h;
                }

                # попытаться отдать кэш изображений напрямую
                location ~ ^/sites/.*/files/imagecache/ {
                        try_files $uri @apache;
                }
                
                # попытаться отдать стили напрямую
                location ~ ^/sites/.*/files/styles/ {
                        try_files $uri @apache;
                }

                # запретить все прямые обращения к несуществующим файлам .php
                location ~ \.php$ {
                        try_files $uri =404;
                        proxy_pass  http://127.0.0.1:11111;
                }
                
                # передать запрос к apache
                location @apache {
                        proxy_pass  http://127.0.0.1:11111;
                }

        }

Рецепт конфигурации nginx общего назначения

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

       # конфигурация nginx для гипотетического пользователя хостинга username для сайта номер "один"
       #
       # параметр listen и proxy_pass генерируется нашей системой автоматически по внутренним параметрам
       server {
                listen 192.168.0.1:80;               # IP-адрес сервера
                proxy_buffer_size         8k;       # параметр изменяется в панели управления
                client_max_body_size   16m;    # параметр изменяется в панели управления
                client_body_buffer_size 512k;

                # кэш имён файлов для disable_symlinks
                open_file_cache          max=1000 inactive=20s; 
                open_file_cache_valid    30s;
                open_file_cache_min_uses 2;
                open_file_cache_errors   on;

                # имена сайта
                server_name example.com;
                server_name www.example.com

                # отключение лишних журналов
                access_log  off;
                log_not_found off;

                # корневая папка для статических файлов
                root /home/username/www/site1/public_html;
                index index.html;

                # запрет символьных ссылок на "чужие" файлы
                # если файл находится внутри папки /home/username/www/site1/public_html , 
                # то эту часть не проверять по соображением производительности
                disable_symlinks if_not_owner from=/home/username/www/site1/public_html;
                
                # обработать запрос, не соответствующий уточнениям ниже
                location / {
                        proxy_pass  http://127.0.0.1:11111;
                }

                # запретить доступ к файлам репозиториев, если они случайно оказались в публичном месте
                location ~ /\.svn {
                        deny all;
                }
                location ~ /\.git {
                        deny all;
                }
                location ~ /\.hg {
                        deny all;
                }

                # запретить доступ к файлам .htaccess и .htpasswd
                location ~ /\.ht {
                        deny all;
                }

                # попытаться отдать файл с одним из расширений напрямую минуя apache
                location ~* \.(swf|zip|rar|arj|cab|exe|dll|ico|jpg|jpeg|gif|bmp|png|mp3|avi|mov|mpg|mpeg|txt|amr|mmf|wml|wbmp|mid|midi|3gp|js|css|htm|html?)$
                        access_log /home/username/www/site1/logs/nginx-access.log;
                        charset utf-8;
                        source_charset utf-8;
                        try_files $uri @apache;
                }

                # передать запрос к apache
                location @apache {
                        proxy_pass  http://127.0.0.1:11111;
                }

        }

Правильная отдача заголовков при технических работах на сайте

(via http://www.zagirov.name/correct-return-header-on-service)

Есть ситуация: проводятся какие-то технические работы на сайте и нужно сайт правильно закрыть. Это нужно чтобы поисковики знали, что сайт не доступен, а не добавляли страницы в индекс или помечали страницы как удалённые.

server {
    listen 80 default;
    server_name _;
    root /var/www/default/www;
    charset utf-8;
    error_page 404 403 =503 /503.html;
    location = /503.html {
        add_header Retry-After "Sun, 27 Feb 2011 23:59:59";
    }
}

Строка error_page 404 403 =503 /503.html означает, что перенаправляем все запросы с ошибками 404 и 403 на файл 503.html, попутно меняя код ответа на 503. И при запросе файла 503.html отдаём заголовок Retry-After, чтобы поисковики знали, когда можно опять запросить страницу. Вместо даты можно указать количество секунд перед следующей попыткой. В файле 503.html можно написать что-нибудь осмысленное для пользователей и даже встроить флэш-игру, чтобы не было скучно.

apache и nginx: сайт по умолчанию

Re: listen 80 / listen *:80 / listen x.x.x.x:80 применительно к default server

nginx:

server {
    listen       80 default_server;
    server_name  _;
}

Если у директивы есть параметр default_server, то сервер, в котором описана эта директива, будет сервером по умолчанию для указанной пары адрес:порт. Если же директив с параметром default_server нет, то сервером по умолчанию будет первый сервер, в котором описана пара адрес:порт.

До версии 0.8.21 этот параметр назывался просто default. (http://nginx.org/ru/docs/http/ngx_http_core_module.html#listen)

apache:

<VirtualHost _default_:*>
    DocumentRoot /var/www/default
    ErrorLog /var/www/default/error_log
</VirtualHost>

Схема frontend-backend

Другое

PHP-FPM

Безопасность

Прочее полезное

Как убедиться, что работает gzip_static

Нашёл здесь - https://stackoverflow.com/questions/2460821/how-can-i-check-that-the-nginx-gzip-static-module-is-working

Находим PID

# ps ax | grep nginx
 1071 ?        Ss     0:01 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
17947 pts/0    S+     0:00 grep --color=auto nginx
18315 ?        S      0:25 nginx: worker process

Запускаем trace

# strace -p 18315 2>&1 | grep gz
open("/home/admin/web/foobar.com/public_html/uploads/posts/2017-01/1485714800-275451094.jpg.gz", O_RDONLY|O_NONBLOCK|O_LARGEFILE) = 34
open("/home/admin/web/foobar.com/public_html/uploads/posts/2017-01/1485714801-2083693483.jpg.gz", O_RDONLY|O_NONBLOCK|O_LARGEFILE) = 34
open("/home/admin/web/example.com/public_html/uploads/posts/2016-11/thumbs/1480346913_09b7vuxzf2vgwqd.jpg.gz", O_RDONLY|O_NONBLOCK|O_LARGEFILE) = -1 ENOENT (No such file or directory)

Устанавливая Xcache перестает работать phpMyAdmin

/etc/apache/conf.d/phpmyadmin.conf
php_admin_value xcache.cacher Off
php_admin_value xcache.stat Off
php_admin_value xcache.optimizer Off

Как определить количество рабочих процессов, задаваемых параметром worker_processes?

via http://www.httpd.kiev.ua/tips/nginx/number-of-worker-processes/

Ответ автора nginx Игоря Сысоева:

Если весь сайт помещается в память сервера, к диску обращений нет, и это выделенный сервер для nginx, то 1. Не будет лишних переключений контекста. Если нужно ходить на диск, то 5-10 - это позволит обрабатывать соединения процессами, незаблокироваными на диске.

Кроме этого необходимо понаблюдать за состоянием процессов nginx в работе в часы пик. Командой ps посмотреть состояние рабочих процессов (worker process):

# ps ax -o %cpu,vsz,wchan,command | grep "nginx\|PID"

%CPU   VSZ WCHAN  COMMAND
0,0  1428 pause  nginx: master process /usr/local/nginx/sbin/nginx
0,0  2284 -      nginx: worker process (nginx)
0,0  2128 kqread nginx: worker process (nginx)

Если один из рабочих процессов находится в состоянии ожидания "kqread" в колонке "WCHAN", то значит их количество достаточно. Ну а если уж все они постоянно находятся в этом состоянии, то их количество можно сократить до одного.

И не забывайте контролировать логи ошибок nginx, если количество соединений превысит значение, которое в может обслужить nginx текущим количеством процессов, то в логах это будет соответствующее сообщение.

Раздельный error log для каждого виртуального хоста

via http://wiki.nginx.org/SeparateErrorLoggingPerVirtualHost

error_log logs/main_error.log;
 
events {
  worker_connections 1024;
}
 
http {
  error_log logs/http_error.log error;
  server {
    server_name one.org;
    access_log logs/one.access;
    error_log logs/one.error error;
  }
 
  server {
    server_name two.org;
    access_log logs/two.access;
    error_log logs/two.error error;
  }
}

Закрываем сайт на обслуживание

Варианты

1) в location /

## System Maintenance (Service Unavailable)
if (-f $document_root/system_maintenance.html ) {
error_page 503 /system_maintenance.html;
return 503;
}

(if нежелателен - там куча ограничений, нюансов и оно довольно сильно грузит сервер, IfIsEvil)

2) try_files closed.html @apache =503;
(проблема в том, что в таком варианте код ответа при обслуживании будет 200). Хотя можно сделать отдельный location closed.html и в нем выставить код ответа 503, по желанию оттуда же отдать и саму страницу. Можно написать как

try_files /maintenance.html $uri $uri/ @wordpress;

но если индекса нет и апач перекидывает на какую-то внутреннюю страницу с рядом опций - могут быть проблемы, если такой файл вдруг появится, а это не предусмотрено системой. Плюс, если была встроенная фильтрация на бэкенде - так ее можно обойти. Ну и 2 лишние проверки получаем.

С другой стороны, для простых движков этот вариант будет быстрее и если вся статика не вынесена по отдельным location, автоматом начнётся раздача статики. Но снова безопасность, надо тогда создавать location на потенциально опасные места и там запрещать, обязательно. В частности на .ht, .svn, .git, служебные области. В общем, лучше первая версия этого варианта.

3) через переменную и if

set $Maintenance = off;
if ($Maintenance = 'on') ...
но см выше про if.

4) выделить блок, закрывающий сайт на обслуживание в отдельный файл maint.conf, сделать 2 файла maint-on.conf и maint-off.conf, и вешать симлинк на нужную версию файла с именем maint.conf и потом делать reload. Можно не симлинком а копированием. Самый быстрый способ, но требует немного кодинга.

via http://dragonflybsd.blogspot.ru/2012/10/nginx.html

favicon.ico

По стандарту, "картинка (иконка) сайта" должна быть. Поэтому в еррлоги активно пишется на каждый запрос, что favicon.ico not found. Можно для nginx создать секцию

location /favicon.ico {
    root ...
    log_not_found off;
    access_log off;
}

Есть опция empty_gif

location /favicon.ico {
    empty_gif;
    access_log off;
}

Таким образом будет отдаваться прозрачный гиф 1х1px на все запросы иконки.

А теперь объединим.

 location /favicon.ico {
    access_log off;
    try_files $uri @emptygif;
}
location @emptygif {
    internal;
    empty_gif;
}

via

Модули

ngx_http_autoindex_module

http://wiki.nginx.org/HttpAutoindexModule

Модуль ngx_http_autoindex_module выдаёт листинг каталога. Обычно запрос попадает к модулю ngx_http_autoindex_module, когда модуль ngx_http_index_module не нашёл индексный файл. Содержание Пример конфигурации

Директивы

  • [#autoindex autoindex]
  • [#autoindex_exact_size autoindex_exact_size]
  • [#autoindex_localtime autoindex_localtime]

Пример конфигурации

: location  /  {
: autoindex  on;
: }

autoindex

syntax: autoindex [on|off]
default: autoindex off
context: http, server, location

Директива разрешает или запрещает вывод листинга каталога.

autoindex_exact_size

syntax: autoindex_exact_size [on|off]
default: autoindex_exact_size on
context: http, server, location

Директива определяет, как выводить размеры файлов в листинге каталога — точно, или округляя до килобайт, мегабайт и гигобайт.

autoindex_localtime

Extended status module

Модуль ngx_http_limit_conn_module

Ошибки

nginx: [warn] 4096 worker_connections exceed open file resource limit: 1024

/etc/security/limits.conf

* soft nofile 65536
* hard nofile 65536

http://averus.org/archives/1240

https://www.centos.org/forums/viewtopic.php?f=13&t=49017

could not build the server_names_hash

http://nginx.org/ru/docs/http/ngx_http_core_module.html#server_names_hash_bucket_size

could not build the server_names_hash, you should increase server_names_hash_bucket_size: 32
    http {

    ...snip...
    server_names_hash_bucket_size 64;
    ...snip...

    }

413 Request Entity Too Larget

Ошибка появляется при загрузке файлов больше 1 мегабайта. Одна из причин — это дефолтные настройки nginx, а точнее параметра client_max_body_size, который по умолчанию равен 1m

Директива client_max_body_size задаёт максимально допустимый размер тела запроса клиента, указываемый в строке "Content-Length" в заголовке запроса. Если размер больше заданного, то клиенту возвращается ошибка "Request Entity Too Large" (413). Следует иметь в виду, что браузеры не умеют корректно показывать эту ошибку.

Подробнее здесь http://nginx.org/ru/docs/http/ngx_http_core_module.html#client_max_body_size

Решение
Изменить размер client_max_body_size

upstream sent too big header while reading response header from upstream, client

Что такое proxy_buffer_size и proxy_buffers.

Исправляется добавлением двух последних строк в конфиг Nginx:

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

proxy_buffers 8 16k;
proxy_buffer_size 32k;

А если по-русски, то proxy_buffer_size предназначен для хранения, прочтенного с бэкэнда хидера:

proxy_buffer_size and fastgci_buffer_size set buffer to read the whole of
response header from backend or fastcgi server.

То есть, если Вы уже выставили 32к, а ошибка все равно появляется, то нужно тюнить дальше.
Если же просто увеличить 32к до 64к, то можно получить вот такую ошибку:

Restarting nginx: [emerg]: "proxy_busy_buffers_size" must be less than the size of all
"proxy_buffers" minus one buffer in /etc/nginx/nginx.conf:34017

Итого, если указанных в самом верху настроек мало, корректируем так:

proxy_buffers 8 32k;
proxy_buffer_size 64k;

И еще. fastcgi paramaters that appear to be currently working

fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on

Ошибки 404/403 apache+nginx HTTP/1.0 HTTP/1.1

Небольшая заметка на тему косяка в апаче (это всё-таки он игнорирует то, что ему передали HTTP/1.0, и отдаёт с HTTP/1.1)

В качестве обхода проблемы (особенно если используется не Apache) по идее также должна помочь установка nginx >= 1.1.4 или chunked_transfer_encoding off.

http://habrahabr.ru/blogs/nginx/135662/

414 Request URI Too Large

nginx via https://ruhighload.com/post/414+Request+URI+Too+Large

large_client_header_buffers 4 16k # изменение количества и размера буферов

Здесь 16k байт и будет желаемым размером URL-адреса, а 4 — количеством желаемых буферов

apache

Увеличиваем размер для limit request line и limit request field size.

LimitRequestLine      102400
LimitRequestFieldSize 102400

504 SSL_do_handshake() failed

via http://dragonflybsd.blogspot.com/2012/04/nginx-504-ssldohandshake-failed.html

При проксировании https даже без сертификатов (чисто прокси) при реальной работе ловили

SSL_do_handshake() failed (SSL: error:1408C095:SSL routines:SSL3_GET_FINISHED:digest check failed) while SSL handshaking to upstream

и 502 Bad Gateway.

Как ни странно, гугл дал всего 4 страницы, из которой только 1 была с решением:

proxy_ssl_session_reuse off;

Помогло. Непонятно, что это было и почему… Проверять можно было через openssl s_client -connect www.test.com:81 -state -ssl3 -no_ssl2 -no_tls1 в несколько потоков.

Самое просто решение - почистить куки. Если же сервер наш, можно подкрутить настройки серверов:

для nginx это

large_client_header_buffers 4 8k;

Можно выставить например 16к, но дальше будет ошибка

Your browser sent a request that this server could not understand.
Size of a request header field exceeds server limit.

Потому что надо увеличить эти же значения и для apache

LimitRequestFieldSize 8190

Можно выставить

LimitRequestFieldSize 16380

via

could not build the server_names_hash, you should increase server_names_hash_bucket_size: 32

server_names_hash_bucket_size 64;

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
 
linux/nginx/index.txt · Последние изменения: 2019/05/30 14:11 (внешнее изменение)