В этой статье я приведу несколько готовых конфигураций Nginx, работающим в паре с Apache. Такая комбинация является рекомендуемой на многих хостингах.
Для обработки статических файлов веб-сервером 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;
}
}
Для WordPress существует популярное расширение WP Super Cache, позволяющее создавать статическую копию страниц сайта. Это позволяет в 10-ки раз ускорить работу сайтов. Предполагается, что Super Cache настроен и работает.
# конфигурация nginx для гипотетического пользователя хостинга username для сайта номер "один"
#
# конфигурация обеспечивает работу со специальным кэшированием WordPress - Super Cache
# http://wordpress.org/extend/plugins/wp-super-cache/
#
# параметр 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;
# правила, задающие путь к закэшированной странице
# в отличии от оригинала, здесь учитывается возможность кириллических путей
set $supercacheuri "";
set $supercachefile "/home/username/www/site1/public_html/wp-content/cache/supercache/${http_host}${request_uri}index.html";
if (-e $supercachefile) {
set $supercacheuri "/wp-content/cache/supercache/${http_host}${request_uri}index.html";
}
if ($request_method = POST) {
set $supercacheuri "";
}
if ($query_string) {
set $supercacheuri "";
}
if ($http_cookie ~* comment_author_|wordpress_logged_in|wp-postpass_) {
set $supercacheuri "";
}
if ($http_x_wap_profile) {
set $supercacheuri "";
}
if ($http_profile) {
set $supercacheuri "";
}
# не кэшировать для мобильных браузеров
if ($http_user_agent ~* (2.0\ MMP|240x320|400X240|AvantGo|BlackBerry|Blazer|Cellphone|Danger|DoCoMo|Elaine/3.0|EudoraWeb|Googlebot-Mobile|hip
top|IEMobile|KYOCERA/WX310K|LG/U990|MIDP-2.|MMEF20|MOT-V|NetFront|Newt|Nintendo\ Wii|Nitro|Nokia|Opera\ Mini|Palm|PlayStation\ Portable|portalmmm|Proxinet|Pr
oxiNet|SHARP-TQ-GX10|SHG-i900|Small|SonyEricsson|Symbian\ OS|SymbianOS|TS21i-10|UP.Browser|UP.Link|webOS|Windows\ CE|WinWAP|YahooSeeker/M1A1-R2D2|iPhone|iPod
|Android|BlackBerry9530|LG-TU915\ Obigo|LGE\ VX|webOS|Nokia5800)) {
set $supercacheuri "";
}
# не кэшировать для этих браузеров
if ($http_user_agent ~* (w3c\ |w3c-|acs-|alav|alca|amoi|audi|avan|benq|bird|blac|blaz|brew|cell|cldc|cmd-|dang|doco|eric|hipt|htc_|inno|ipaq|
ipod|jigs|kddi|keji|leno|lg-c|lg-d|lg-g|lge-|lg/u|maui|maxo|midp|mits|mmef|mobi|mot-|moto|mwbp|nec-|newt|noki|palm|pana|pant|phil|play|port|prox|qwap|sage|sa
ms|sany|sch-|sec-|send|seri|sgh-|shar|sie-|siem|smal|smar|sony|sph-|symb|t-mo|teli|tim-|tosh|tsm-|upg1|upsi|vk-v|voda|wap-|wapa|wapi|wapp|wapr|webc|winw|winw
|xda\ |xda-)) {
set $supercacheuri "";
}
# если URI всё-таки есть, сделать внутренний редирект на него
if ($supercacheuri) {
rewrite ^ $supercacheuri break;
}
# обработать запрос, не соответствующий уточнениям ниже
# учесть наличие закэшированной страницы
location / {
access_log /home/username/www/site1/logs/nginx-access.log;
charset utf-8;
source_charset utf-8;
try_files $uri $supercacheuri @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;
}
}
Рецепт конфигурации для 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;
}
}