Nginx

Материал из RSU WiKi
Перейти к: навигация, поиск
Tower of babel.png外國 language!
В статье используется несколько языков. Необходимо использовать один. Совсем неплохо, если это будет русский.
Nginx.gif
nginx (engine x) (по-русски произносится как э́нджин-э́кс) — веб-сервер и почтовый прокси-сервер, работающий на Unix-подобных операционных системах (тестировалась сборка и работа на FreeBSD, OpenBSD, Linux, Solaris, Mac OS X). Начиная с версии 0.7.52 появилась бинарная сборка под Microsoft Windows [1].

Содержание

Установка

Nginx

В SLES (ppc64[2]) качаем src.rpm, собираем командой:

rpmbuild --rebuild --target=ppc nginx.src.rpm

Ставим:

rpm -Uvh /usr/src/packages/RPMS/ppc/nginx*

В OpenSUSE:

zypper in nginx

php5-fastcgi

Устанавливаем модуль php5-fastcgi:

zypper in php5-fastcgi

/usr/share/doc/packages/php5/README.FastCGI

Ставим в /etc/php5/fastcgi/php.ini следующий параметр:

cgi.fix_pathinfo = 0;

Это закроет веб-сервер от узявимости Zero-day exploit, выполнения кода злоумышленников [3] [4].

Настраиваем php на работу через unix-socket [5].

Запустить для проверки работоспособности можно командой:

/usr/bin/php-cgi -q -b /tmp/php-fastcgi.socket

Однако для работы нам потребуется пакет spawn-fcgi (openSuSE SLES 11). Скачиваем src.rpm и компилируем командой:

rpmbuild --rebuild spawn-fcgi-1.6.3-3.1.src.rpm

Ставим:

rpm -Uvh /usr/src/packages/RPMS/ppc64/spawn-fcgi-1.6.3-3.1.ppc64.rpm

Делаем init-скрипт [6] [7]:

/etc/init.d/php5-fcgi

#!/bin/sh
#
#     SUSE system startup script for daemon php-cgi (through spawn-cgi)
#     Copyright (C) 1995--2005  Kurt Garloff, SUSE / Novell Inc.
#
# /etc/init.d/php5-fcgi
#   and its symbolic link
# /(usr/)sbin/rcphp5-fcgi
#
# System startup script for php5-fcgi daemon
#
### BEGIN INIT INFO
# Provides:          php5-fcgi
# Required-Start:    $syslog $network
# Should-Start: $time ypbind sendmail
# Required-Stop:     $syslog
# Should-Stop: $time ypbind sendmail
# Default-Start:     3 5
# Default-Stop:      0 1 2 6
# Short-Description: spawn-fcgi daemon providing php-fastcgi
# Description:       start php-fastcgi with unix-socket
#	in /tmp/php-fastcgi.socket for nginx web server
### END INIT INFO

# Check for missing binaries (stale symlinks should not happen)
# Note: Special treatment of stop for LSB conformance

FCGI_BIN=/usr/bin/spawn-fcgi
test -x $FCGI_BIN || { echo "$FCGI_BIN not installed"; 
	if [ "$1" = "stop" ]; then exit 0;
	else exit 5; fi; }

FCGI_PARAMS=" -f /usr/bin/php-cgi -s /tmp/php-fastcgi.socket -C 10 -u wwwrun -g www"

. /etc/rc.status

# Reset status of this service
rc_reset

case "$1" in
    start)
	echo -n "Starting FCGI "
	## Start daemon with startproc(8). If this fails
	## the return value is set appropriately by startproc.
	/sbin/startproc $FCGI_BIN$FCGI_PARAMS

	# Remember status and be verbose
	rc_status -v
	;;
    stop)
	echo -n "Shutting down FCGI "
	## Stop daemon with killproc(8) and if this fails
	## killproc sets the return value according to LSB.

	/sbin/killproc -TERM $FCGI_BIN
        /usr/bin/killall php-cgi

	# Remember status and be verbose
	rc_status -v
	;;
    try-restart|condrestart)
	## Do a restart only if the service was active before.
	## Note: try-restart is now part of LSB (as of 1.9).
	## RH has a similar command named condrestart.
	if test "$1" = "condrestart"; then
		echo "${attn} Use try-restart ${done}(LSB)${attn} rather than condrestart ${warn}(RH)${norm}"
	fi
	$0 status
	if test $? = 0; then
		$0 restart
	else
		rc_reset	# Not running is not a failure.
	fi
	# Remember status and be quiet
	rc_status
	;;
    restart)
	## Stop the service and regardless of whether it was
	## running or not, start it again.
	$0 stop
	$0 start

	# Remember status and be quiet
	rc_status
	;;
    force-reload)
	## Signal the daemon to reload its config. Most daemons
	## do this on signal 1 (SIGHUP).
	## If it does not support it, restart the service if it
	## is running.

	echo -n "Reload service FCGI "
	## if it supports it:
	/sbin/killproc -HUP $FCGI_BIN
	#touch /var/run/FCGI.pid
	rc_status -v

	## Otherwise:
	#$0 try-restart
	#rc_status
	;;
    reload)
	## Like force-reload, but if daemon does not support
	## signaling, do nothing (!)

	# If it supports signaling:
	echo -n "Reload service FCGI "
	/sbin/killproc -HUP $FCGI_BIN
	#touch /var/run/FCGI.pid
	rc_status -v
	
	## Otherwise if it does not support reload:
	#rc_failed 3
	#rc_status -v
	;;
    status)
	echo -n "Checking for service FCGI "
	## Check status with checkproc(8), if process is running
	## checkproc will return with exit status 0.

	# NOTE: checkproc returns LSB compliant status values.
	/sbin/checkproc $FCGI_BIN
	# NOTE: rc_status knows that we called this init script with
	# "status" option and adapts its messages accordingly.
	rc_status -v
	;;
    probe)
	## Optional: Probe for the necessity of a reload, print out the
	## argument to this init script which is required for a reload.
	## Note: probe is not (yet) part of LSB (as of 1.9)

	test /etc/FCGI/FCGI.conf -nt /var/run/FCGI.pid && echo reload
	;;
    *)
	echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload|probe}"
	exit 1
	;;
esac
rc_exit

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

Как ограничить количество запросов по типу User Agent?

Статьи Nginx - how to limit requests by User Agent[8] ngx_http_map_module[9]

http {
    map $http_user_agent $limit_bots {
        default '';
        ~*(google|bing|yandex|msnbot|Feedfetcher-Google) $binary_remote_addr;
    }
    limit_req_zone $limit_bots zone=bots:10m rate=1r/m;
    server {
        location / {
            limit_req zone=bots burst=5 nodelay;
        }
    }
}

Конфигурационный файл nginx

# cat /etc/nginx/sites-available/all
 server {
         listen 80 default;
 
         access_log /var/log/nginx/all.access.log;
 
         location / {
            proxy_pass         http://127.0.0.1:8080/;
            proxy_redirect     off;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            client_max_body_size       50m;
            client_body_buffer_size    128k;
            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;
            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;

#           allow 172.16.0.0/12;
#           allow 91.203.180.0/22;
#           allow 212.26.245.116/32;
#           deny all;

        }
 }

IPv6

Основная статья: Внедрение IPv6

В default.conf:

server {
        listen 80 default;
        listen [::]:80 default ipv6only=on;

В остальных:

server {
    listen       80;
    listen       [::]:80;
    server_name  www.example.com;

SSL / HTTPS

Генерируем необходимые SSL-ключи [10]:

mkdir /etc/nginx/ssl && cd /etc/nginx/ssl
openssl genrsa -out www.example.com.key 1024 
openssl req -new -x509 -key www.example.com.key -out www.example.com.crt
server {
    server_name www.example.com;
    listen       443;
    listen       [::]:443;

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

Блокировка сканеров уязвимостей

Усложним жизнь скрипт-кидди и заблокируем популярные сканеры по UA[11][12]:

if ( $http_user_agent ~* (nmap|nikto|wikto|sf|sqlmap|bsqlbf|w3af|acunetix|havij|appscan) ) {
    return 403;
}

Перенаправления (301/302)

NGINX REDIRECT WWW.EXAMPLE.COM REQUESTS TO EXAMPLE.COM OR VICE VERSA

Add following configuration directive if you want to redirect www.example.com to example.com

server {
    server_name  www.example.com;
    rewrite ^(.*) http://example.com$1 permanent;
}

server {
    server_name  example.com;
    Put here your domain hosting configuration.
}

Add following configuration directive if you want to redirect example.com to www.example.com

server {
    server_name  example.com;
    rewrite ^(.*) http://www.example.com$1 permanent;
}

server {
    server_name  www.example.com;
    Put here your domain hosting configuration.
}

Из корня в папку

if ($request_uri = /) {
    rewrite ^ http://www.example.com/SomeSubdir/ permanent; #301 redirect
}

Logrotate

/etc/logrotate.d/nginx
------------------------------------------------------------------------------

/var/log/nginx/*log {
    daily
    rotate 9
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

Отдача статики при проксировании на backend

        # Static files location                                                                                           
        location ~*^.+\.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|js|ico)$         
        {                                                                                                                 
            root   /srv/www/vhosts/www.example.com/;                                                                       

            expires 720h;

            # Userdirs with "~"                                                                         
            location ~ /~([a-zA-Z0-9]*)/(.*) {                                                                            
                root /home/;                                                                                            
                rewrite ^/~([a-zA-Z0-9]*)/(.*)$ /$1/public_html/$2 break;                                                 
            }
        }

Второй вариант, отправляющий все неизвестные запросы на BackEnd:

#Make nginx serve static content
location ~*
^.+\.(html|htm|css|xml|rss|gif|jpeg|jpg|js|atom|mml|txt|jad|wml|htc|png|tif|tiff|wbmp|ico|jng|bmp|jar|war|ear|hqx|doc|pdf|ps|eps|ai|rtf|xls|ppt|wmlc|xhtml|cco|jardiff|jnlp|run|pl|pm|prc|pdb|rar|rpm|sea|swf|sit|tcl|tk|der|pem|crt|xpi|zip|bin|exe|dll|deb|dmg|eot|iso|img|msi|msp|msm|mid|midi|kar|mp3|ra|3gpp|3gp|mpeg|mpg|mov|flv|mng|asx|asf|wmv|avi|rar)$
{
    root /var/www/DevVmPhp;

    expires 720h;

    #Try to handle unavailable files with Apache
    error_page 400 401 402 403 404 405 406 = @fallback;
}

location @fallback {
    proxy_pass 127.0.0.1:80;
    expires -1;
}

Работа с AWStats

Основная статья: AWStats

Если в nginx стоит regexp для самостоятельной отдачи статики из директории веб-сервера, у awstats отваливаются картинки и css, лечится вот так:

# AWStats static files location                                                                                
location ^~ /awstatsclasess/ {                                                                                 
    alias /usr/local/awstats/wwwroot/classes/;
    expires     720h;
}                                                                                                              
location ^~ /awstatscss/ {                                                                                     
    alias /usr/local/awstats/wwwroot/css/;
    expires     720h;
}
location ^~ /awstatsicons/ {                                                                                   
    alias /usr/local/awstats/wwwroot/icon/;
    expires     720h;
}
location ^~ /js/ {
    alias /usr/local/awstats/wwwroot/js/;
    expires     720h;
}

Запрет доступа к директории не из локальной сети

location /files/ {                                                                                        
            allow 127.0.0.1/32;
            allow 172.16.0.0/12;
            deny all;                                                                                                 
}

Защита файлов от прямых ссылок

По примерам из статей [13] [14].

Для изображений:

server {
    ...
    
    location ~ \.(jpg|gif|png)$ {
        valid_referers none blocked server_names ~\.google\. images.yandex.ru;
	if ($invalid_referer) {
	    rewrite ^(.*)$ /img/invalid_referer.png redirect;
	}
    }
}

Для загружаемых файлов:

server {
    ...
    
    location /download/ {
        valid_referers none blocked server_names;
	if ($invalid_referer) {
	    rewrite ^(.*)$ /download.html redirect;
	}
    }
}

Ограничение числа одновременных сессий

limit_zone  ftp  $binary_remote_addr  10m;

server {
     location / {                                                                                                  
            root   /srv/ftp/;                                                                                         
            index  index.html index.htm;                                                                              
                                                                                                                      
            # Concurrent connections limit for downloading                                                            
            limit_conn   ftp  2;                                                                                      
     }
}

Apache UserDir

location ~ ^/~(.+?)(/.*)?$ {
     alias /home/$1/public_html$2;
     index  index.html index.htm;
     autoindex on;
}

Настраиваем nginx для Retracker.local

Основная статья: Retracker.local

Ретрекер (retracker, также встречается термин псевдотрекер) — технология оптимизации обмена битторрент (bittorrent) трафиком внутри локальных сетей[15][16]. Ретрекер позволяет установить прямое соединение по протоколу битторрент между абонентами одного оператора (или нескольких операторов, имеющих соглашение об обмене локальным трафиком), каждый из которых использует внутренний (локальный) IP-адрес. Технически ретрекер представляет собой простейший bittorrent трекер, как правило, анонимный, работающий внутри адресного пространства локальной сети интернет-провайдера. Использование ретрекера позволяет пирам обмениваться трафиком на повышенной скорости, используя внутреннюю адресацию локальной сети провайдера, так как доступ к локальной сети у многих российских интернет-провайдеров разрешён на более высокой скорости, нежели доступ в интернет. Кроме того, использование ретрекера снижает нагрузку на магистральные каналы связи за счет того, что абонентам не нужно скачивать по отдельности одни и те же данные.

Важно не путать ретрекеры с обычными локальными трекерами локальных сетей. Ретрекер не ставит задачи обмена торрент-файлами, систематизации торрент-файлов, поиска и так далее. Ретрекер служит исключительно средством повышения скорости обмена данными между пирами[17].

Настраиваем nginx для WordPress через FastCGI [18]

Основная статья: WordPress
server {
    listen       192.0.32.10:80;                # your server's public IP address
    server_name  example.com;                   # your domain name
    root         /srv/www/vhosts/blog.example.com/;  # absolute path to your WordPress installation

    try_files $uri $uri/ /index.php;

    location ~ \.php$ {
        include        fastcgi_params;
        fastcgi_pass unix:/tmp/php-fastcgi.socket;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    }
}

Подробности:

Как настроить nginx для MediaWiki через FastCGI?

  • Настройка MediaWiki на nginx.org[19]
  • Настройка nginx на mediawiki.org[20]
Основная статья: MediaWiki

Рабочий конфигурационный файл

server {
    listen       80;
    listen       [::]:80;
    server_name  wiki.example.org;

    access_log  /var/log/nginx/wiki.example.org-access_log;

    root /srv/www/vhosts/wiki.example.org;

    location / {
        index index.php;
        error_page 404 = @mediawiki;
    }

    location @mediawiki {
        rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&$2 last;
    }
    
    # Fixing nginx 0day exploit
    # http://forum.nginx.org/read.php?2,88845,page=3
    location ~ \..*/.*\.php$ {
        return 403;
    }

    location ~ \.php?$ {
        include /etc/nginx/fastcgi_params;
        fastcgi_pass unix:/tmp/php-fastcgi.socket;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

В конец файла LocalSettings.php MediaWiki добавляем:

# Parameter to deal with nginx fcgi setup
$wgScriptPath       = "";
$wgArticlePath      = "/wiki/$1";
$wgUsePathInfo      = true;

Ошибка 404 при входе и отправке изменений

Включите error_log в /etc/nginx/vhosts.d/wiki.example.org.conf

server {
 ...
 error_log   /var/log/nginx/wiki.example.org-error_log;
 ...
}

Выполните команду и повторите отправку данных, предварительно внеся любое изменение

tail -f /var/log/nginx/wiki.example.org-error_log | grep ваш_ip_адрес

Если в логе фигурирует ошибка, то это наш случай

upstream sent too big header while reading response header from upstream

Для ее устранения воспользуйтесь советом со stackoverflow.com[21] и добавьте следующие строки в файл /etc/nginx/nginx.conf

http {
 ...
 proxy_buffer_size  128k; 
 proxy_buffers  4 256k; 
 proxy_busy_buffers_size  256k;
 ...
}

Статья Модуль ngx_http_proxy_module[22]

  • proxy_buffers количество размер — директива задаёт число и размер буферов для одного соединения, в которые будет читаться ответ, получаемый от проксируемого сервера
  • proxy_buffer_size размер — директива задаёт размер буфера, в который будет читаться первая часть ответа, получаемого от проксируемого сервера. Эта часть ответа небольшая. В ней, как правило, находится заголовок. По умолчанию размер буфера равен размеру одного буфера в директиве proxy_buffers, однако его можно сделать меньше
  • proxy_busy_buffers_size размер - при включённой буферизации ответов проксируемого сервера, ограничивает суммарный размер буферов, которые могут быть заняты для отправки ответа клиенту, пока ответ ещё не прочитан целиком. Оставшиеся буферы тем временем могут использоваться для чтения ответа и, при необходимости, буферизации части ответа во временный файл. По умолчанию размер ограничен величиной двух буферов, заданных директивами proxy_buffer_size и proxy_buffers.

и в файл /etc/nginx/vhosts.d/wiki.example.org.conf

location ~ \.php?$ {
 ...
 fastcgi_buffer_size 128k;
 fastcgi_buffers 4 256k;
 fastcgi_busy_buffers_size 256k;
 ...
}

Статья Модуль ngx_http_fastcgi_module[23]. Директивы аналогичны директивам из ngx_http_proxy_module и используются для настройки буферизации ответов FastCGI-сервера.

Настраиваем nginx для Drupal через FastCGI

Статья по настройке Drupal: Drupal

Пишем конф. файл виртуального хоста с drupal. За основу берем конфигурационный файл из статьи http://wiki.nginx.org/Drupal, добавляем в него поддержку drupal-модуля Boost[24] из примеров [25] [26].

Итоговый конф. файл:

#
# php5-fcgi config via unix-socket. No apache2 at all!
#

server {
    listen       80;
    listen       [::]:80;
    server_name  www.example.com;

    access_log  /var/log/nginx/www.example.com-access_log;

    root /srv/www/vhosts/www.example.com;

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

    location = /robots.txt {
        allow all;
        log_not_found off;
    }

    # Very rarely should these ever be accessed outside of your lan
    location ~* \.(txt|log)$ {
        allow 172.16.0.0/12;
        deny all;
    }

    # Fixing nginx 0day exploit
    # http://forum.nginx.org/read.php?2,88845,page=3
    location ~ \..*/.*\.php$ {
        return 403;
    }

    location / {
        # remove trailing slashes
        rewrite ^/(.*)/$ /$1 permanent;
        try_files $uri @cache;
    }
    
    location @cache {
        if ( $request_method !~ GET ) {
            return 405;
        }
        if ($http_cookie ~ "DRUPAL_UID") {
            return 405;
        }
        error_page 405 = @drupal;
        expires epoch;
        add_header Cache-Control "must-revalidate, post-check=0, pre-check=0";
        charset utf-8;
        try_files /cache/normal/$host${uri}_$args.html /cache/$host${uri}_$args.html @drupal;
    }

    location @drupal {
        # This is cool because no php is touched for static content
        try_files $uri @rewrite;
    }

    location @rewrite {
        # Some modules enforce no slash (/) at the end of the URL
        # Else this rewrite block wouldn't be needed (GlobalRedirect)
        rewrite ^/(.*)$ /index.php?q=$1;
    }

    location @uncached {
        access_log  off;
        expires  max; # max if using aggregator, otherwise sane expire time
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_intercept_errors on;
        fastcgi_pass unix:/tmp/php-fastcgi.socket;
    }

    location ~ \.(engine|inc|info|install|module|profile|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)$|^(code-style\.pl|Entries.*|Repository|Root|Tag|Template)$ {
        deny all;
    }
    # Fighting with ImageCache? This little gem is amazing.
    location ~ ^/sites/.*/files/imagecache/ {
        try_files $uri @rewrite;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires max;
        log_not_found off;
    }

    location ~ \.css$ {
        if ( $request_method !~ ^(GET|HEAD)$ ) {
            return 405;
        }
        if ($http_cookie ~ "DRUPAL_UID") {
            return 405;
        }
        error_page 405 = @uncached;
        access_log  off;
        expires  max; #if using aggregator
        add_header X-Header "Boost Citrus 2.1";
        try_files /cache/perm/$host${uri}_.css /cache/$host${uri}_.css $uri =404;
    }
   
    location ~ \.js$ {
        if ( $request_method !~ ^(GET|HEAD)$ ) {
            return 405;
        }
        if ($http_cookie ~ "DRUPAL_UID") {
            return 405;
        }
        error_page 405 = @uncached;
        access_log  off;
        expires  max; # if using aggregator
        add_header X-Header "Boost Citrus 2.2";              
        try_files /cache/perm/$host${uri}_.js /cache/$host${uri}_.js $uri =404;
    }

    location ~ \.json$ {
        if ( $request_method !~ ^(GET|HEAD)$ ) {
            return 405;
        }
        if ($http_cookie ~ "DRUPAL_UID") {
            return 405;
        }
        error_page 405 = @uncached;
        access_log  off;
        expires  max; # if using aggregator
        add_header X-Header "Boost Citrus 2.3";              
        try_files /cache/normal/$host${uri}_.json /cache/$host${uri}_.json $uri =404;
    }

    location ~* \.xml$ {
        if ( $request_method !~ ^(GET|HEAD)$ ) {
            return 405;
        }
        if ($http_cookie ~ "DRUPAL_UID") {
            return 405;
        }
        error_page 405 = @drupal;
        add_header Expires "Tue, 24 Jan 1984 08:00:00 GMT";
        add_header Cache-Control "must-revalidate, post-check=0, pre-check=0";
        add_header X-Header "Boost Citrus 2.4";              
        charset utf-8;
        types { }
        default_type application/rss+xml;
        try_files /cache/normal/$host${uri}_.xml /cache/normal/$host${uri}_.html /cache/$host${uri}_.xml $uri @drupal;
    }

    location ~* /feed$ {
        if ( $request_method !~ ^(GET|HEAD)$ ) {
            return 405;
        }
        if ($http_cookie ~ "DRUPAL_UID") {
            return 405;
        }
        error_page 405 = @drupal;
        add_header Expires "Tue, 24 Jan 1984 08:00:00 GMT";
        add_header Cache-Control "must-revalidate, post-check=0, pre-check=0";
        add_header X-Header "Boost Citrus 2.5";              
        charset utf-8;
        types { }
        default_type application/rss+xml;
        try_files /cache/normal/$host${uri}_.xml /cache/normal/$host${uri}_.html /cache/$host${uri}_.xml $uri @drupal;
    }
}

Работа с SVN

Основная статья: Subversion

URL с документацией

Аналог SVN_DOC в /etc/sysconfig/apache2 APACHE_SERVER_FLAGS

# SVN Manual                                                            
        location /svn-manual/ {                                                 
            alias   /usr/share/doc/packages/subversion/html/;                   
            index  index.html index.htm;                                        
            autoindex on;                                                       
        }

Mod_rpaf

Модуль для правки ip в логах апача называется rpaf [1], качаем и устанавливаем:

cd /usr/local/src
wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
tar zvfz mod_rpaf-0.6.tar.gz
cd mod_rpaf-0.6
make rpaf-2.0
make install-2.0

Включаем модуль: /etc/sysconfig/apache2

APACHE_MODULES="rpaf"

Запускаем:

SeSEconfig && rcapache2 restart

Тюнинг

Лимитирование количества запросов

Отключаем логирование

На некоторых серверах вследствие большой нагрузки или же за ненадобностью целесообразно выключить ведение лог-файлов. Делается так:

error_log  /var/log/nginx/error.log  crit;
access_log  off;

Для error_log полностью отключить лог нельзя, можно только лишь загрубить уровень ведения лога до критических ошибок.

Ошибка "accept() failed (24: Too many open files)" [2]

Способ №1 (простой и правильный):

В конфиге nginx задаем значение переменной worker_rlimit_nofile 10240;

Способ №2:

В консоли пишем:

ulimit -n 16384

Правим файл /etc/security/limits.conf и добавляем туда строки:

* soft nofile 16384
* hard nofile 16384

В конфиге nginx задаем значение переменной worker_connections равным 16384, деленным на worker_processes. Например для "worker_processes 2;" это число будет 8192.

Оптимизаця раздачи видео-контента

output_buffers 1 512k;

меняем на и снижаем нагрузку на диски

 output_buffers 1 8m;

Posix ACLs

Основная статья: Posix ACLs

TroubleShooting

Internet Explorer отображает свою 404-страницу вместо отдаваемой сервером

A note about Internet Explorer and "friendly error messages"[27][28]

Microsoft Internet Explorer has an inexplicable "feature": if a Web server sends a custom error page that is shorter than 512 bytes in size, Internet Explorer shows its own internal error page instead of the one from the server. Microsoft calls this "friendly HTTP error messages".

You can turn this "feature" off in your Web browser (search the Web for "Show friendly HTTP error messages" to see how), but you probably want to make sure that other people don't encounter it. To do that, just make sure your custom error pages are larger than 512 bytes in size (including the HTML tags and so forth). You can use invisible HTML comment text if necessary.

In practice, most custom error pages will be longer than 512 bytes anyway, so this isn't usually a problem. Our customers usually only encounter the problem when using a very short test phrase, in which case it can be very puzzling.

Не пишутся логи после logrotate (SLES 11 SP1)

В init-скрипте /etc/init.d/nginx в секции "reopen" после строчки

/sbin/killproc -p $NGINX_PID -USR1 $NGINX_BIN

добавляем:

sleep 1

Проблемы с загрузкой файлов

Часто в процессе эксплуатации веб-сервера с nginx'ом в качестве front-end возникают проблемы, связанные с загрузкой файлов на сервер.

Самых распространенных всего две:

  • Неправильно выставленная директива client_max_body_size;
  • Слетевшие права доступа на каталог /var/tmp/nginx;

Первая проблема решается помещением строчки

client_max_body_size 32m;

в секцию http конфигурационного файла nginx.

Вторая диагностируется подобной строчкой в error-логе nginx:

2011/02/07 17:38:58 [crit] 25292#0: *26 open() "/var/lib/nginx/tmp//0000000001" failed (13: Permission denied), client: 172.20.0.44, server: example.com, request: "POST /files/index.php HTTP/1.1", host: "example.com", referrer: "http://example.com/files/index.php?choose=&id=40&wdir=/&action=upload"

Лечится командой chown -R wwwrun.www /var/tmp/nginx, где wwwrun.www это имя и группа от которой работает процесс nginx (обычно указано в начале nginx.conf).

Ошибка 502 Bad gateway

Статья Nginx + php-fpm “504 Gateway Time-out” error with almost zero load (on a test-server)[29]

Increase PHP script execution time with Nginx[30]

Решили пока только перезагрузкой сервера.

2014/03/18 17:20:53 [error] 11442#0: *2962 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.0.2.10,
server: www.example.com, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/tmp/php-fastcgi.socket:", host: "www.example.com"

Ошибка 500 Internal server error при создании и просмотре новости

Для Drupal.

В файле /etc/php5/fastcgi/php.ini задано следующее:

memory_limit = 128M      ; Maximum amount of memory a script may consume (128MB)

Ошибка:

2014/03/20 10:34:51 [error] 17998#0: *127870 FastCGI sent in stderr: "PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 19844 bytes)
in /home/example.com/public_html/includes/image.gd.inc on line 190" while reading response header from upstream, client: 172.20.0.200, server: www.example.com,
request: "GET /news/news-title HTTP/1.1", upstream: "fastcgi://unix:/tmp/php-fastcgi.socket:", host: "www.example.com", referrer: "http://www.example.com/news"

Размер приложенных фотографий превысил 128MB, их надо уменьшить перед добавлением в новость.

Ошибка 404 при входе или редактировании

2014/04/14 11:10:00 [error] 8041#0: *74 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 172.20.0.200, server: singularity.rsu.edu.ru, request: "GET /wordpress/wp-admin/ HTTP/1.1", upstream: "fastcgi://unix:/tmp/php-fastcgi.socket:", host: "singularity.rsu.edu.ru", referrer: "http://singularity.rsu.edu.ru/wordpress/wp-login.php"
2014/04/14 11:10:00 [error] 8041#0: *74 open() "/srv/www/vhosts/err.rsu.edu.ru/50x.html" failed (2: No such file or directory), client: 172.20.0.200, server: singularity.rsu.edu.ru, request: "GET /wordpress/wp-admin/ HTTP/1.1", upstream: "fastcgi://unix:/tmp/php-fastcgi.socket:", host: "singularity.rsu.edu.ru", referrer: "http://singularity.rsu.edu.ru/wordpress/wp-login.php"
  1. создали файл /srv/www/vhosts/err.rsu.edu.ru/50x.html (inc-errors.conf), пропала ошибка open() "/srv/www/vhosts/err.rsu.edu.ru/50x.html" failed (2: No such file or directory), стала появляться ошибка 500
  2. запустили apache2 - пропала upstream timed out (110: Connection timed out) while reading response header from upstream

Примечания

  1. nginx. Материал из Википедии — свободной энциклопедии
  2. IBM System p. Серверы AIX и Linux
  3. Setting up PHP-FastCGI and nginx? Don’t trust the tutorials: check your configuration!
  4. nginx 0day exploit for nginx + fastcgi PHP
  5. php5-cgi+Nginx: which is faster 127.0.0.1:9000 or Unix sockets? Using the described testing procedure shows that using using Unix domain sockets, besides the elsewhere described advantage of being more secure (see external link above), significantly improves server cgi performance.
  6. wiki.nginx.org: PHPFcgiExample
  7. Adamant System: Working config for nginx + Drupal + Boost
  8. http://habrahabr.ru/post/215233/#comment_7389513
  9. http://nginx.org/en/docs/http/ngx_http_map_module.html
  10. Generating SSL certificates yourself
  11. A simple protection from a lot of script-kiddies – block scanners by UA
  12. На пути к созданию безопасного веб-ресурса. Часть 1 — серверное ПО
  13. sysoev.ru: Директивы модуля ngx_http_referer_module
  14. nginx: Защита файлов от прямых ссылок
  15. http://nag.ru/articles/reviews/15540/odichavshiy-wi-fi.html глава "Торренты. Приручение"
  16. CARMA Based MST Approximation for Multicast Provision in P2P Networks doi:10.1109/ICNS.2010.25 quote:"Recently there have been some advances in the locality awareness for BitTorrent networks. Popular nationwide trackers (torrents.ru, for instance) have introduced so-called “retrackers” - dedicated secondary servers. These servers are optionally connected to primary database but mainly supposed to only return peer list local to specific network scope."
  17. Ретрекер. Материал из Википедии — свободной энциклопедии
  18. HOWTO: Install WordPress on Nginx
  19. wiki.nginx.org: NginxMediaWiki
  20. MediaWiki.org Manual:Short URL/wiki/Page title -- nginx rewrite--root access
  21. http://stackoverflow.com/questions/13894386/upstream-too-big-nginx-codeigniter
  22. http://nginx.org/ru/docs/http/ngx_http_proxy_module.html
  23. http://nginx.org/ru/docs/http/ngx_http_fastcgi_module.html
  24. drupal.org: Boost
  25. drupal.org: Nginx integration
  26. groups.drupal.org: Does Aegir Hosting System work with Nginx?
  27. Custom Error Pages
  28. http://stackoverflow.com/questions/3970093/include-after-php-404-header-returning-oops-this-link-appears-to-be-broken
  29. http://serverfault.com/questions/178671/nginx-php-fpm-504-gateway-time-out-error-with-almost-zero-load-on-a-test-se
  30. https://rtcamp.com/tutorials/php/increase-script-execution-time/

См. также

Ссылки

Личные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты