sokolenkoDEV / bitrix-nginx-php-fpm.conf
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
server |
listen 127.0.0.1:80; |
ssi on; |
gzip on; |
gzip_comp_level 7; |
gzip_types application/x-javascript application/javascript text/css; |
server_name test.ru www.test.ru; |
charset off; |
#disable_symlinks if_not_owner from=$root_path; |
index index.php; |
root $root_path; |
set $root_path /var/www/www-user/data/www/test; |
set $php_sock unix:/var/www/php-fpm/www-user.sock; |
access_log /var/www/httpd-logs/west-test.ru.access.log; |
error_log /var/www/httpd-logs/west-test.ru.error.log notice; |
proxy_set_header X-Real-IP $remote_addr; |
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
proxy_set_header Host $host; |
client_max_body_size 1024M; |
client_body_buffer_size 4M; |
#кому не надо убирать у домена www это не пишем. между http:// и test.ru убрать пробел, парсер дурит 🙂 |
if ($host = ‘www.test.ru’ ) |
rewrite ^(.*)$ http://test.ru$1 permanent; |
> |
location / |
try_files $uri $uri/ @bitrix; |
> |
location ~* /upload/.*\.(php|php3|php4|php5|php6|phtml|pl|asp|aspx|cgi|dll|exe|shtm|shtml|fcg|fcgi|fpl|asmx|pht|py|psp|rb|var)$ |
types |
text/plain text/plain php php3 php4 php5 php6 phtml pl asp aspx cgi dll exe ico shtm shtml fcg fcgi fpl asmx pht py psp rb var; |
> |
> |
location ~ \.php$ |
try_files $uri @bitrix; |
fastcgi_pass $php_sock; |
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; |
fastcgi_param PHP_ADMIN_VALUE «sendmail_path = /usr/sbin/sendmail -t -i -f admin@west-test.ru»; |
include fastcgi_params; |
> |
location @bitrix |
fastcgi_pass $php_sock; |
include fastcgi_params; |
fastcgi_param SCRIPT_FILENAME $document_root/bitrix/urlrewrite.php; |
fastcgi_param PHP_ADMIN_VALUE «sendmail_path = /usr/sbin/sendmail -t -i -f admin@west-test.ru»; |
> |
location ~* /bitrix/admin.+\.php$ |
try_files $uri @bitrixadm; |
fastcgi_pass $php_sock; |
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; |
fastcgi_param PHP_ADMIN_VALUE «sendmail_path = /usr/sbin/sendmail -t -i -f admin@west-test.ru»; |
include fastcgi_params; |
> |
location @bitrixadm |
fastcgi_pass $php_sock; |
include fastcgi_params; |
fastcgi_param SCRIPT_FILENAME $document_root/bitrix/admin/404.php; |
fastcgi_param PHP_ADMIN_VALUE «sendmail_path = /usr/sbin/sendmail -t -i -f admin@west-test.ru»; |
> |
location = /favicon.ico |
log_not_found off; |
access_log off; |
> |
location = /robots.txt |
allow all; |
log_not_found off; |
access_log off; |
> |
# |
# block this locations for any installation |
# |
# ht(passwd|access) |
location ~* /\.ht |
# repositories |
location ~* /\.(svn|hg|git) |
# bitrix internal locations |
location ~* ^/bitrix/(modules|local_cache|stack_cache|managed_cache|php_interface) |
deny all; |
> |
# upload files |
location ~* ^/upload/1c_[^/]+/ |
# use the file system to access files outside the site (cache) |
location ~* /\.\./ |
location ~* ^/bitrix/html_pages/\.config\.php |
location ~* ^/bitrix/html_pages/\.enabled |
# Intenal locations |
location ^~ /upload/support/not_image |
# Cache location: composite and general site |
location ~* @.*\.html$ |
internal; |
# disable browser cache, php manage file |
expires -1y; |
add_header X-Bitrix-Composite «Nginx (file)»; |
> |
# Player options, disable no-sniff |
location ~* ^/bitrix/components/bitrix/player/mediaplayer/player$ |
add_header Access-Control-Allow-Origin *; |
> |
# Accept access for merged css and js |
location ~* ^/bitrix/cache/(css/.+\.css|js/.+\.js)$ |
expires 30d; |
error_page 404 /404.html; |
> |
# Disable access for other assets in cache location |
location ~* ^/bitrix/cache |
# Use nginx to return static content from s3 cloud storage |
# /upload/bx_cloud_upload/…amazonaws.com/ |
location ^~ /upload/bx_cloud_upload/ |
location ~ ^/upload/bx_cloud_upload/(http[s]?)\.([^/:]+)\.(s3|s3-us-west-1|s3-eu-west-1|s3-ap-southeast-1|s3-ap-northeast-1)\.amazonaws\.com/(.+)$ |
internal; |
resolver 8.8.8.8; |
proxy_method GET; |
proxy_set_header X-Real-IP $remote_addr; |
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
proxy_set_header X-Forwarded-Server $host; |
#proxy_max_temp_file_size 0; |
proxy_pass $1://$2.$3.amazonaws.com/$4; |
> |
location ~* .*$ |
> |
# Static content |
location ~* ^/(upload|bitrix/images|bitrix/tmp) |
expires 30d; |
> |
location ~* \.(css|js|gif|png|jpg|jpeg|ico|ogg|ttf|woff|eot|otf)$ |
error_page 404 /404.html; |
expires 30d; |
> |
location = /404.html |
access_log off ; |
> |
> |
Битрикс в связке Nginx+PHP-FPM, настройка ЧПУ, а так же композитный кэш с отдачей через nginx. Доработанная конфигурация
Цель: Предоставить конфигурацию виртуального сервера Nginx для работы Битрикс-cms в связке Nginx+PHP-FPM. Который в прочем подойдёт и для связки Nginx+Apache2, с небольшими доработками.
Целевая аудитория: Администраторы серверов, продвинутые администраторы сайтов, программисты.
Cтатей на эту тему достаточно, но если смотреть не официальные, то там как правило содержатся ошибки, а в официальных полно if которые в Nginx использовать не желательно. Надеюсь после того как я выложу данный конфиг к связке Nginx+PHP-FPM станут относиться серьёзнее.
Я покажу реализацию отдачи файлового композитного кэша. В целом отдача с memcached делается по аналогии. В конфигурации отдачи файлового кэша я насчитал 11 if, от которых я и избавился переделав их на map.
Начну с упрощённого варианта ЧПУ для тех кому нужна просто связка Nginx+PHP-FPM без отдачи композитного кэша через Nginx. Подразумевается что секция server уже настроена, с доменными именами и передачей в php-fpm.
Как не удивительно смотря на те полотна конфигов которые мне попадались, этого достаточно чтобы битрикс корректно заработал. Если нужен редирект с index.php и index.html на без, то нужно ещё дописать вот эту строку:
if ($request_uri ~ ^(.*)/index.(html|php)) < return 301 $1/$is_args$args; >
К сожалению тут достойной замене if нет. Но данная строчка работает не создавая проблем.
server < listen 80; server_name site.ru; root /var/www/site.ru/; index index.php; location ~ \.php$ < include /etc/nginx/fastcgi_params; fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_intercept_errors on; >if ($request_uri ~ ^(.*)/index.(html|php)) < return 301 $1/$is_args$args; >location / < try_files $uri $uri/ /bitrix/urlrewrite.php$is_args$args; >location ~* @.*\.html$ < internal; >>
Хочу подчеркнуть что это именно минималистичная конфигурация без правил для статики, сжатия, и я там прикрыл только файлы композитного кэша от прямого доступа. Конфигурация которая прикрывает определённые места от прямого доступа через nginx довольно индивидуальна. У меня есть вот такой набор который может кому-то подойти. Но использовать нужно аккуратно с осознанием дела. Учитите что внесение данных локейшенов в свою конфигурацию может привести к неработоспособности сайта или части его функций.
Фрагмент конфига закрывающий доступ к файлам которые должны быть доступны только при обращении из PHP
location ~ \.php$ < location ~* /\.\./ < internal; >location ~ /\.[^/]+$ < internal; >location ~* ^/upload/1c_[^/]+/ < internal; >location ~* ^/(bitrix/(cache|images|tmp)|upload)/ < internal; >location ~* ^/bitrix/(footer|header|license_key)\.php$ < internal; >location ~* ^/(bitrix|local)/components/(.*)/(.*)/(class|component)\.php$ < internal; >location ~* ^/(bitrix|local)/(backup|blocks|bx_cloud_upload|local_cache|module|modules|managed_cache|php_interface|public|stack_cache)/ < internal; >include /etc/nginx/fastcgi_params; fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_intercept_errors on; > location ~* \.(hg|svn|git|bzr)$ < internal; >location ~* /\.\./ < internal; >location ~* @.*\.html$ < internal; >location / < location ~* ^/(bitrix|local)/(backup|blocks|bx_cloud_upload|local_cache|module|modules|managed_cache|php_interface|public|services|stack_cache)/ < internal; >location ~ /\.[^/]+$ < internal; >location ~* ^/upload/1c_[^/]+/ < internal; >try_files $uri $uri/ /bitrix/urlrewrite.php$is_args$args; >
Ну и конечно пример location для статических файлов
location ~* \.(jpg|jpeg|png|tiff|gif|webp|xml|html|yml|ogg|ogv|svg|svgz|eot|otf|woff|woff2|mp4|ttf|rss|atom|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|rtf|pdf|txt|js|css|bmp|pnm|pbm|ppm)$
Теперь перейдём к конфигу для работы композита с отдачей файлов кэша через nginx. Первым делом необходимо определить можно ли отдавать данному запросу композитный кэш или его нужно отправить на обработку через php. Для этого в Nginx в секции http добавим несколько map, а так же несколько директив:
modern_browser_value "modern"; modern_browser msie 10.0; modern_browser unlisted; map "$cookie_BITRIX_SM_LOGIN:$cookie_BITRIX_SM_UIDH:$cookie_BITRIX_SM_CC" $storedAuth < default ""; "~*:*:Y" ""; "~*:*:*" 1; "~*:*:" 1; >map "$request_method:$http_bx_action_type:$cookie_BITRIX_SM_NCC:$http_x_forwarded_scheme:$modern_browser:$storedAuth" $usecache
Далее уже непосредственно в секции server прописываем
set $i "index@"; location / < try_files /bitrix/html_pages/$host$uri$i$.html$usecache /bitrix/html_pages/$host$uri$i$=.html$usecache /bitrix/html_pages/$host$uri/$i$.html$usecache /bitrix/html_pages/$host$uri/$i$=.html$usecache $uri $uri/ /bitrix/urlrewrite.php$is_args$args; >
Ну и для понимания как примерно будет выглядеть минимальная конфигурация секции server
server < listen 80; server_name site.ru; root /var/www/site.ru/; index index.php; location ~ \.php$ < include /etc/nginx/fastcgi_params; fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_intercept_errors on; >if ($request_uri ~ ^(.*)/index.(html|php)) < return 301 $1/$is_args$args; >set $i "index@"; location / < try_files /bitrix/html_pages/$host$uri$i$.html$usecache /bitrix/html_pages/$host$uri$i$=.html$usecache /bitrix/html_pages/$host$uri/$i$.html$usecache /bitrix/html_pages/$host$uri/$i$=.html$usecache $uri $uri/ /bitrix/urlrewrite.php$is_args$args; > location ~* @.*\.html$ < internal; >>
Буду рад вопросам и предложениям по поводу данного конфига, а так же за радость посмотрю Ваши наработки.