Віртуальний хост для окремого користувача з PHP-FPM і nginx

Нещодавно, потрібно було налаштувати віртуальний хост для окремого користувача з PHP-FPM і nginx і я трохи погуглити, знайшов рішення. Викладу як замітки «Віртуальний хост для окремого користувача з PHP-FPM і nginx».

В php-fpm можна створювати і управляти пулами (pool) процесів, які мають назву "Воркер" (workers), вони отримують і обробляють PHP файли які знаходяться в домашній директорії вашого сайту.

І так, у мене є вже налаштований (встановлений) NGINX з PHP-FPM з наступним сайтом:

# Vim /etc/nginx/conf.d/linux-notes.org.conf

У мене цей конфіг виглядає так:

server {listen 80; server_name linux-notes.org www.linux-notes.org; access_log /var/log/nginx/access-linux-notes.org.log main; error_log /var/log/nginx/error-linux-notes.org.log; include conf.d / gzip.conf; root / home / www / linux-notes / public_html; index index.php index.html index.htm; location / {try_files $ uri $ uri / /index.php?$args; } # PHP-FPM # PHP scripts -> PHP-FPM server listening on 127.0.0.1:9000 location ~ \ .php $ {# The following line prevents malicious php code to be executed through some uploaded file (without php extension, like image ) # This fix shoudn't work though, if nginx and php are not on the same server, other options exist (like unauthorizing php execution within upload folder) # More on this serious security concern in the "Pass Non-PHP Requests to PHP "section, there http://wiki.nginx.org/Pitfalls try_files $ uri = 404; # PHP # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $ document_root $ fastcgi_script_name; include fastcgi_params; fastcgi_param QUERY_STRING $ query_string; fastcgi_param REQUEST_METHOD $ request_method; fastcgi_param CONTENT_TYPE $ content_type; fastcgi_param CONTENT_LENGTH $ content_length; fastcgi_intercept_errors on; fastcgi_ignore_client_abort off; fastcgi_connect_timeout 60; fastcgi_send_timeout 180; fastcgi_read_timeout 180; fastcgi_buffers 4 256k; fastcgi_buffer_size 128k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; } # ------------------------------------------------ ---------- # Define default caching of 24h expires 86400s; add_header Pragma public; add_header Cache-Control "max-age = 86400, public, must-revalidate, proxy-revalidate"; # Rewrite for versioned CSS + JS via filemtime location ~ * ^. + \. (Css | js) $ {rewrite ^ (. +) \. (\ D +) \. (Css | js) $ $ 1. $ 3 last; expires 31536000s; access_log off; log_not_found off; add_header Pragma public; add_header Cache-Control "max-age = 31536000, public"; } # Aggressive caching for static files location ~ * \. (Asf | asx | wax | wmv | wmx | avi | bmp | class | divx | doc | docx | eot | exe | gif | gz | gzip | ico | jpg | jpeg | jpe | mdb | mid | midi | mov | qt | mp3 | m4a | mp4 | m4v | mpeg | mpg | mpe | mpp | odb | odc | odf | odg | odp | ods | odt | ogg | ogv | otf | pdf | png | pot | pps | ppt | pptx | ra | ram | svg | svgz | swf | tar | t? gz | tif | tiff | ttf | wav | webm | wma | woff | wri | xla | xls | xlsx | xlt | xlw | zip) $ {expires 31536000s; access_log off; log_not_found off; add_header Pragma public; add_header Cache-Control "max-age = 31536000, public"; } # ------------------------------------------------ ---------- gzip on; gzip_types text / css text / x-component application / x-javascript application / javascript text / javascript text / x-js text / richtext image / svg + xml text / plain text / xsd text / xsl text / xml image / x-icon ; location ~ \. (css | js) $ {expires max; break; } Location ~ \. (Rtf | rtx | svg | svgz | txt | xsd | xsl | xml) $ {expires 3600; break; } Location ~ \. (Asf | asx | wax | wmv | wmx | avi | bmp | class | divx | doc | docx | exe | gif | gz | gzip | ico | jpg | jpeg | jpe | mdb | mid | midi | mov | qt | mp3 | m4a | mp4 | m4v | mpeg | mpg | mpe | mpp | odb | odc | odf | odg | odp | ods | odt | ogg | pdf | png | pot | pps | ppt | pptx | ra | ram | swf | tar | tif | tiff | wav | wma | wri | xla | xls | xlsx | xlt | xlw | zip) $ {expires max; break; } Add_header "X-UA-Compatible" "IE = Edge, chrome = 1"; # ------------------------------------------------- --------- location ~ /(\.|wp-config.php|readme.html|license.txt) {return 404; } If ($ request_method! ~ ^ (GET | POST | HEAD) $) {return 444; } Location = /favicon.ico {log_not_found off; access_log off; } Location = /robots.txt {allow all; log_not_found off; access_log off; } # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac). # Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban) location ~ /\.ht {deny all; access_log off; log_not_found off; } # Deny access to any files with a .php extension in the uploads directory # Works in sub-directory installs and also in multisite network # Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban) location ~ * /(?:uploads|files)/.*\.php$ {deny all; #access_log off; #log_not_found off; } # Deny access to WP config file and license.txt and readme.html files location ~ /(\.|wp-config.php|readme.html|license.txt) {deny all; } # Deny access to .conf files location ~ * \. (Conf) $ {deny all; } # Add trailing slash to * / wp-admin requests. rewrite / wp-admin $ $ scheme: // $ host $ uri / permanent; # Uncomment one of the lines below for the appropriate caching plugin (if used). include global / w3-total-cache.conf; }

Це готовий конфіг для вордпресу з кешем і його можна юзати.

Створю php_info.php з кодом:

# Echo "<? Php echo phpinfo ();?>"> / Home / www / linux-notes / public_html /php_info.php

Можна подивитися інформацію про встановлених модулях і не тільки.

Зараз, я створю і настрою новий пул для мого сайту з PHP-FPM. Всі настройки для пулів в CentOS зберігається в папці /etc/php-fpm.d/, якщо використовуєте Debian / Ubuntu / Mint, то вони зберігаються в /etc/php5/fpm/pool.d/, є і файл СЗГ стандартними настройками для пулу всіх сайтів з назвою www.conf. Всі настройки php-fpm зберігаються в конфігураційному файлі /etc/php-fpm.conf.

Скопіюють вже готовий (стандартний) конфиг для одного з моїх сайтів (промені називати їх по імені сайту):

# Cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/linux-notes.org.conf

Відкриваємо і знаходимо:

; Start a new pool named 'www'. [Linux-notes.org] ім'я пулу (для кожного повинно бути унікальним); ; Note: This value is mandatory. listen = 127.0.0.1:9000

Поки нічого не виконуємо в даному файлі, я потім повернуся до нього.

[...] user = apache group = apache [...]

Це користувач і його група, від імені якого будуть виконуватися файли;

listen - тут варто юзати або порт (для кожного пулу, але крім 9000 порту, т.к він зайнятий пулом www), так само, можна використовувати unix-сокет. Я, для своїх цілей, використовую порт.

Опції user і group - це задаємо власника на обробку файлів php;

Отримуємо такий конфіг:

[Linux-notes.org] listen = 127.0.0.1:9001 user = captain group = captain

Збережіть всі, а так само перезапустите PHP-FPM:

# Service php-fpm restart

Для впевненості, можна перевірити даний порт - 9001:

# Netstat -anpt | grep 9001

Тепер, знову відкриваємо конфиг NGINX з сайтом - у мене це файл / etc / nginx / conf.d / linux-notes.org.conf шукаємо рядок, а так же міняємо:

[...] fastcgi_pass 127.0.0.1:9000; [...]

на:

[...] fastcgi_pass 127.0.0.1:9001; [...]

Порт 9001-порт пулу PHP-FPM.

Після всіх змін, варто перевірити конфігурацію конфіга nginx:

# Nginx -t

Далі, виконуємо рестарт сервера nginx:

# Service nginx restart

Переконаємося, що користувач запущений від якого запущений пул мого сайту:

# Ps aux | grep -E 'php-fpm. * captain' [...] captain 6036 0.4 1.2 897904 79968? S May04 6:15 php-fpm: pool captain captain 6037 0.4 1.0 887920 67100? S May04 6:27 php-fpm: pool captain captain 6039 0.4 1.2 899324 78504? S May04 6:33 php-fpm: pool captain captain 6040 0.4 1.1 963748 75332? S May04 6:29 php-fpm: pool captain [...]

І перевіряємо роботу сайту.

Стаття «Віртуальний хост для окремого користувача з PHP-FPM і nginx» завершена.

Php?
Php echo phpinfo ();?

Дополнительная информация

rss
Карта