Php nginx настройка: Установка Linux, Nginx, MySQL, PHP (набора LEMP) в Ubuntu 18.04
Как подключить NGINX к PHP-FPM — детальное руководство
Веб-сервер NGINX (в качестве обратного прокси-сервера) обслуживает приложения PHP через протокол FastCGI (в качестве внутреннего сервера приложений). NGINX использует PHP-FPM (FastCGI Process Manager), альтернативную реализацию PHP FastCGI, которая работает в фоновом режиме в качестве демона, слушая запросы CGI. Он поставляется с дополнительными функциями, предназначенными для работы с загруженными веб-сайтами или веб-приложениями, но его можно использовать для сайтов любого размера.
PHP-FPM не только поддерживает настройку пулов ресурсов FastCGI, но также улучшает многие внутренние функции FastCGI и увеличивает отчеты об ошибках, завершение сценариев и многое другое. Он включает PHP-демонизацию, управление процессами, динамическое число процессов, из которых могут поступать запросы, заголовок ошибок, поддержку ускоренной загрузки и многое другое.
Чтобы принимать запросы FastCGI от NGINX, PHP-FPM может прослушивать сокет TCP/IP или UNIX сокет. Какой бы адрес вы ни выбрали, это то, что NGINX использует для подключения (запросы прокси) к PHP-FPM, используя директиву fastcgi_pass.
В этом руководстве объясняется, как настроить NGINX для серверных приложений PHP с использованием PHP-FPM. Он описывает, когда использовать сокет TCP/IP или сокет UNIX для подключения NGINX к PHP-FPM и почему.
В этом руководстве предполагается, что в вашей системе Linux установлены NGINX и PHP-FPM.
Что я должен использовать: сокет UNIX или сокет TCP/IP?
Сокеты UNIX (или IPC) являются средством межпроцессного взаимодействия (IPC), которое обеспечивает эффективный обмен данными между процессами, работающими в одной и той же операционной системе, в то время как сокеты TCP / IP (или интернет-домена) позволяют процессам обмениваться данными по сети.
В отличие от сокета TCP/IP, который идентифицирует сервер по IP-адресу и порту (например, 127. 0.0.1:9000), вы можете привязать сервер к сокету UNIX, используя путь к файлу (например, /run /php-fpm/www.sock), который виден в файловой системе.
Сокет UNIX — это особый тип файла — к нему применяются разрешения на доступ к файлам и каталогам (как в случае с любым другим типом файла UNIX), и его можно использовать для ограничения того, какие процессы на хосте могут читать и записывать в файл, (и, таким образом, общаться с внутренним сервером).
Таким образом, сокет UNIX является безопасным, поскольку его могут использовать только процессы на локальном хосте. Сокет TCP/IP может быть доступен из Интернета, и это может представлять угрозу безопасности, если не будут приняты дополнительные меры безопасности, такие как брандмауэр.
Важно отметить, что использование сокета UNIX — это не то же самое, что использование сокета TCP/IP с точки зрения производительности. Несколько тестов и тестов производительности показали, что сокеты UNIX работают быстрее. Основным недостатком сокетов UNIX является то, что они менее масштабируемы, они поддерживают только межпроцессное взаимодействие в одной и той же операционной системе (ОС).
Где я могу настроить адрес прослушивания PHP-FPM?
Вы можете настроить адрес, который прослушивает PHP-FPM, в файле конфигурации пула ресурсов. Обратите внимание, что с PHP-FPM вы можете запускать несколько пулов процессов с разными настройками. Пул по умолчанию называется www.
Расположение файла конфигурации пула ресурсов зависит от способа установки PHP и PHP-FPM в системе Linux (будь то версия по умолчанию/одна версия или несколько версий одновременно).
Например, в CentOS 8 с одной версией все файлы конфигурации PHP находятся в каталоге /etc, а файл конфигурации пула PHP-FPM по умолчанию (www) — /etc/php-fpm.d/www.conf:
Чтобы вывести список всех файлов конфигурации PHP, используйте следующую команду ls.
# ls /etc/php/*
В Ubuntu 20.04 файлы конфигурации PHP находятся в каталоге /etc/php/<php-version>/, а файл конфигурации пула PHP-FPM (www) по умолчанию —/etc/php/<php-version>/fpm /pool.d/www.conf:
$ ls /etc/php/7.4/
Настройка PHP-FPM для прослушивания на сокете UNIX
Чтобы настроить PHP-FPM на прослушивание сокета UNIX, откройте файл конфигурации пула PHP-FPM по умолчанию, используя свой любимый текстовый редактор.
# vim /etc/php-fpm.d/www.conf #CentOS/RHEL/Fedora
OR
$ sudo vim /etc/php/7.4/fpm/pool.d/www.conf #Ubuntu/Debian
Затем найдите директиву listen и задайте для нее путь к файлу сокета UNIX следующим образом. Обратите внимание, что в большинстве установок по умолчанию используется сокет UNIX.
listen = /run/php/php7.4-fpm.sock #Ubuntu/Debian
ИЛИ
listen = /run/php-fpm/www.sock #CentOS/RHEL/Fedora
Если вы используете сокет UNIX, вам также необходимо установить соответствующие разрешения на чтение/запись для файла, чтобы разрешить подключения с веб-сервера NGINX. По умолчанию NGINX работает как пользователь и группа nginx в CentOS/RHEL/Fedora и www-data в Ubuntu и Debian.
Итак, найдите параметры listen.owner и listen.group и установите их соответствующим образом. Также установите режим на 0660, используя параметр listen.mode.
------------- On Debian and Ubuntu -------------
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
------------- On CentOS/RHEL and Fedora -------------
listen. owner = nginx
listen.group = nginx
listen.mode = 0660
Обратите внимание, что если разрешения для файла сокета UNIX установлены неправильно, NGINX может вернуть ошибку неверного шлюза.
Настройка
PHP-FPM для прослушивания через сокет TCP/IP
Хотя сокет UNIX быстрее сокета TCP/IP, он менее масштабируем, поскольку он может поддерживать межпроцессное взаимодействие только в одной и той же ОС. Если NGINX и внутренний сервер приложений (PHP-FPM) работают в разных системах, вам придется настроить PHP-FPM для прослушивания сокетов TCP/IP для удалленого подключения.
В файле конфигурации пула PHP-FPM установите адрес прослушивания следующим образом. Убедитесь, что выбранный вами порт не используется другим процессом или службой в той же системе.
listen = 127.0.0.1:8880
Настройка NGINX для работы с сервером приложений PHP-FPM
После того, как вы настроили адрес, который прослушивает PHP-FPM, вам нужно настроить NGINX для запроса прокси к нему через этот адрес, используя параметр конфигурации fastcgi_pass, в файле конфигурации блока виртуального сервера.
Например, если файл конфигурации для вашего сайта — /etc/nginx/conf.d/example.com.conf, откройте его для редактирования.
# vim /etc/nginx/conf.d/example.com.conf
Найдите блок местоположения для обработки файлов .php и установите параметр fastcgi_pass следующим образом, если вы настроили PHP-FPM для прослушивания на сокете UNIX.
fastcgi_pass unix:/run/php/php7.4-fpm.sock #Ubuntu/Debian
OR
fastcgi_pass unix:/run/php-fpm/www.sock #CentOS/RHEL/Fedora
Или используйте адрес TCP/IP, если вы настроили PHP-FPM для прослушивания сокета TCP/IP. Если внутренний сервер приложений (PHP-FPM) работает на отдельном сервере (замените 10.42.0.10 на IP-адрес компьютера, на котором работает сервер PHP-FPM FastCGI).
fastcgi_pass 10.42.0.10:3000;
Важное замечание: В CentOS 8 PHP-FPM определен как вышестоящий сервер в файле /etc/nginx/conf.d/php-fpm.conf внутри вышестоящего блока с именем php-fpm.
Здесь вы можете внести соответствующие изменения в зависимости от адреса, который PHP-FPM настроил для прослушивания, в файле конфигурации пула. Конфигурация по умолчанию указывает на сокет UNIX.
upstream php-fpm {
server unix:/run/php-fpm/www.sock;
}
и в файле блока сервера вашего сайта просто установите параметр fastcgi_pass, как показано.
fastcgi_pass php-fpm;
После внесения изменений в конфигурации PHP-FPM и NGINX проверьте правильность синтаксиса их конфигурации следующим образом.
------------- On Debian and Ubuntu -------------
$ sudo php-fpm -t
$ sudo nginx -t
------------- On CentOS/RHEL and Fedora -------------
# php-fpm -t
# nginx -t
Затем вам нужно перезапустить две службы, чтобы применить изменения, используя команду systemctl.
------------- On Debian and Ubuntu -------------
$ sudo systemctl restart nginx
$ sudo systemctl restart php7.4-fpm
------------- On CentOS/RHEL and Fedora -------------
# systemctl restart nginx
# systemctl restart php-fpm
Если вы получили какие-либо ошибки, вы можете проверить файлы журналов NGINX и PHP-FPM с помощью команды cat.
------------- On Debian and Ubuntu -------------
$ cat /var/log/nginx/error.log
$ cat /var/log/php7.4-fpm.log
------------- On CentOS/RHEL and Fedora -------------
$ cat /var/log/nginx/error. log
$ cat /var/log/php-fpm/www-error.log
Это все, что у нас было для вас. Раздел комментариев ниже можете использовать, чтобы задать вопросы. Для получения дополнительной информации см. Документацию NGINX и документацию PHP-FPM.
Спасибо за уделенное время на прочтение статьи!
Если возникли вопросы, задавайте их в комментариях.
Подписывайтесь на обновления нашего блога и оставайтесь в курсе новостей мира инфокоммуникаций!
Чтобы знать больше и выделяться знаниями среди толпы IT-шников, записывайтесь на курсы Cisco, курсы по кибербезопасности, полный курс по кибербезопасности, курсы DevNet (программируемые сети) от Академии Cisco, курсы Linux от Linux Professional Institute на платформе SEDICOMM University (Университет СЭДИКОММ).
Курсы Cisco и Linux с трудоустройством!
Спешите подать заявку! Осталось пару мест. Группы стартуют 22 июля, а следующая 19 августа, 23 сентября, 21 октября, 25 ноября, 16 декабря, 20 января, 24 февраля.
Что Вы получите?
- Поможем стать экспертом в сетевом администрировании и получить международные сертификаты Cisco CCNA Routing & Switching или Linux LPI.
- Предлагаем проверенную программу и учебник экспертов из Cisco Networking Academy и Linux Professional Institute, сертифицированных инструкторов и личного куратора.
- Поможем с трудоустройством и сделать карьеру. 100% наших выпускников трудоустраиваются.
Как проходит обучение?
- Проводим вечерние онлайн-лекции на нашей платформе или обучайтесь очно на базе Киевского офиса.
- Спросим у вас об удобном времени для практик и подстроимся: понимаем, что времени учиться мало.
- Если хотите индивидуальный график — обсудим и осуществим.
- Выставим четкие дедлайны для самоорганизации. Личный куратор будет на связи, чтобы ответить на вопросы, проконсультировать и мотивировать придерживаться сроков сдачи экзаменов.
А еще поможем Вам:
- отредактировать резюме;
- подготовиться к техническим интервью;
- подготовиться к конкурсу на понравившуюся вакансию;
- устроим на работу в Cisco по программе Cisco Incubator, New Graduate и Experienced. Наши студенты, которые уже работают там: жмите на #НашиВCisco Вконтакте, #НашиВCisco Facebook.
Чтобы учиться на курсах Cisco CCNA Routing & Switching и Linux LPI, подайте заявку или получите бесплатную консультацию.
Phalcon Documentation
In order for the routing of the Phalcon application to work, you will need to set up your web server to process the redirects properly. Setup instructions for popular web servers are:
PHP-FPM
PHP-FPM (FastCGI Process Manager) обычно используется для управления процессом обработки PHP файлов. В настоящее время PHP-FPM идёт в комплекте с любым дистрибутивом PHP в Unix.
На Windows PHP-FPM поставляется вместе с пакетом PHP, как файл php-cgi.exe
. Вы можете запустить его с этом скриптом. Windows не поддерживает Unix сокеты, скрипт запускает fast-cgi в TCP режиме на порте 9000
.
Создайте файл php-fcgi.bar
с данным текстом:
@ECHO OFF
ECHO Starting PHP FastCGI. ..
set PATH=C:\PHP;%PATH%
c:\bin\RunHiddenConsole.exe C:\PHP\php-cgi.exe -b 127.0.0.1:9000
Встроенный в PHP веб-сервер (для разработки)
Чтобы ускорить разработку вашего Phalcon-приложения, самым простым способом его запуска является использование встроенного в PHP веб-сервера. Мы рекомендуем использовать встроенный в PHP веб-сервер исключительно на стадии разработки. Ниже рассмотрены типичные конфигурации для Nginx и Apache, которые вам вероятнее всего подойдут.
Настройка Phalcon
Для включения ЧПУ без Apache или Nginx (которые необходимы для Phalcon), вы можете использовать файл-роутер:
.htrouter.php
If you created your application with Phalcon-Devtools this file should already exist in the root directory of your project and you can start the server with the following command:
$(which php) -S localhost:8000 -t public .htrouter.php
The anatomy of the command above:
$(which php)
— will insert the absolute path to your PHP binary-S localhost:8000
— invokes server mode with the providedhost:port
-t public
— defines the servers root directory, necessary for php to route requests to assets like JS, CSS, and images in your public directory. htrouter.php
— the entry point that will be evaluated for each request
Откройте свой браузер и перейдите по адресу http://localhost:8000/, чтобы убедиться, что всё работает.
Nginx
Nginx — это свободный, с открытым исходным кодом, высокопроизводительный HTTP-сервер и прокси-сервер, а также IMAP/POP3 прокси-сервер. В отличие от традиционных серверов Nginx не использует потоки для обработки запросов. Вместо этого он использует гораздо более масштабируемую, управляемую событиями (асинхронную) архитектуру. Эта архитектура под высокой нагрузкой использует небольшой, и главное, предсказуемый объем памяти.
Связка Phalcon + Nginx + PHP-FPM предоставляет мощный набор инструментов, который позволяет добиться максимальной производительности ваших PHP приложений.
Установка Nginx
Официальный сайт Nginx
Настройка Phalcon
Вы можете использовать следующую конфигурацию Nginx для работы с Phalcon, вероятнее всего на вам подойдёт:
server {
# Port 80 will require Nginx to be started with root permissions
# Depending on how you install Nginx to use port 80 you will need
# to start the server with `sudo` ports about 1000 do not require
# root privileges
# listen 80;
listen 8000;
server_name default;
##########################
# In production require SSL
# listen 443 ssl default_server;
# ssl on;
# ssl_session_timeout 5m;
# ssl_protocols SSLv2 SSLv3 TLSv1;
# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
# ssl_prefer_server_ciphers on;
# These locations depend on where you store your certs
# ssl_certificate /var/nginx/certs/default. (.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
fastcgi_param PATH_INFO $fastcgi_path_info;
# fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
# and set php.ini cgi.fix_pathinfo=0
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ /\.ht {
deny all;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
access_log off;
}
}
Запуск Nginx
Обычно запуск производится командой service start nginx
. Но это зависит от метода установки веб-сервера и системного менеджера вашей операционной системы.
Apache
Apache — это популярный веб-сервер, доступный на большинстве современных платформ.
Настройка Phalcon
Следующие инструкции позволят настроить Apache для корректной работы с Phalcon. These notes are primarily focused on the configuration of the mod_rewrite
module allowing to use friendly URLs and the router component. ((?s).*)$ index.php?_url=/$1 [QSA,L]
</Directory>
</IfModule>
Виртуальные хосты
В этом заключительном примере конфигурации, мы разрешаем установку Phalcon-приложения в виртуальный хост:
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot "/var/vhosts/test/public"
DirectoryIndex index.php
ServerName example.host
ServerAlias www.example.host
<Directory "/var/vhosts/test/public">
Options All
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Cherokee
Cherokee is a high-performance web server. It is very fast, flexible and easy to configure.
Конфигурация Phalcon
Cherokee имеет удобный графический интерфейс для настройки практически всех параметров, доступных в веб-сервере.
Чтобы запустить администрирование сервера, нужно выполнить команду /путь-к-cherokee/sbin/cherokee-admin
с правами суперадмина (root).
Создайте новый виртуальный хост, для этого кликните на vServers
, затем добавьте виртуальный сервер:
Добавленный виртуальный хост должен появиться на панели слева. На вкладке Behaviors
вы можете увидеть набор правил для данного сервера. Нажмите кнопку Rule Management
. Снимите галочки с Directory /cherokee_themes
и Directory /icons
:
Add the PHP Language
behavior using the wizard. This behavior allows you to run PHP applications:
Обычно такое решение не требует дополнительной настройки. Добавьте еще одно правило, на этот раз в разделе Manual Configuration
. В списке Rule Type
выберите File Exists
, и убедитесь что опция Match any file
включена:
На вкладке ‘Handler’ выберите обработчик List & Send
:
Отредактируйте правило Default
для включения возможностей URL-перезаписи. (.*)$:
Убедитесь, что обработчики выставлены в нужном порядке:
Запустите приложение в браузере:
Настройка nginx для приложения на Laravel
Ромчик
0
Доброго времени суток. Не так давно пришлось мне настраивать веб-сервер для работы Laravel. В качестве веб-сервера был выбран nginx. Что такое nginx вы можете прочитать на официальном сайте. Задача стояла простая: установить nginx, настроить виртуальный хост, на котором разместить приложение Laravel. Задача простая, но в ходе настроек возникли трудности, поэтому я и решил подробно описать процесс настройки. В качестве сервера выступает Ubuntu 18.04
Ну, что поехали.
Установка nginx.
Для установки nginx в Ubuntu необходимо в консоли выполнить следующую команду:
sudo apt-get install nginx
Ждем. На момент написания статьи была nginx версии 1. 14.0
Все nginx установили, теперь мы можем приступить к настройке самого nginx.
Настройка nginx.
Файлы конфигурации nginx находятся /ete/nginx
Основной файл конфигурации nginx.conf. Давайте посмотрим его.
- user – указывает от чьего имени запускается nginx
- worker_processes – устанавливается в auto или указывается число равное числу процессоров системы
- pid тут все понятно
- include /etc/nginx/module-enabled/*.conf – где хранятся подключаемые модули.
- worker_connections – максимальное количество соединений на один процесс. Максимальное число обслуживания клиентов равно worker_processes * worker_connections
Дальше идет секция http:
- sendfile – позволяет отправлять данные в сеть минуя адресное пространство приложения, что сказывается на быстродействии. В большинстве случаев лучше ставить on
- tcp_nodelay – при включении данной опции заставляет сокет отправлять данные в буфер вне зависимости от размера пакета
- tcp_nopush – работает как противоположность tcp_nodelay, но реализована только во FreeBSD
- keepalive_timeout – устанавливает максимальное количество времени для поддержания соединения, если по нему не передаются данные. Так, например, если мы используем статичные страницы, то данный параметр можно уменьшить (ведь данные мы отдали и все)
- type_hash_max_size – устанавливает максимальный размер хэш таблиц
- include /etc/nginx/mime.types – устанавливает путь к файлу со списком mime-type
- default_type – устанавливат mime-type по умолчанию
- ssl_protocols – список поддерживаемых ssl протоколов
- ssl_prefer_server_ciphers – включенный параметр заставляет соблюдать все настройки по ssl
- access_log и error_log – указываем где будут хранится логи
- gzip – ставим on, тем самым включаем режим сжатия
- include /etc/nginx/conf.d/*.conf – указываем где будет хранится конфигурация для виртуальных хостов
- include /etc/nginx/sites-enabled/* — указываем где будут хранится виртуальные хосты
Вот мы и рассмотрели дефолтный конфиг nginx. В большинстве случаев его менять и не надо. Теперь переходим к настройке виртуального хоста.
Настройка виртуального хоста в nginx
Напомню, что виртуальный хост мы настраиваем для работы с Laravel (по большому счету, это не имеет большого значения)
Переходим /etc/nginx/sites-available. Для этого в консоли вводим команду:
cd /etc/nginx/sites-available
Теперь копируем файл default:
sudo cp ./default laravel.loc
Проверяем:
ls
Файл для виртуального хоста laravel.loc скопирован. Открываем его на редактирование и помещаем в него следующий код:
server { listen 80; server_name laravel.loc; root /var/www/laravel.loc; index index.html index.htm index.php; charset utf-8; location / { try_files $uri $uri/ /index.php?$query_string; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } access_log off; error_log /var/log/nginx/laravel. (.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php/php7.1-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } location ~ /\.ht { deny all; } }
Сохраняем.
Теперь создадим ссылку на наш виртуальный хост. Для этого выполните следующую команду:
sudo ln -s /etc/nginx/sites-available/Laravel.loc /etc/nginx/sites-enabled/
Все. Проверяем конфигурацию, для этого выполните следующую команду:
sudo nginx -t
Все можем запускать nginx.
Команды для управления nginx
Для управления nginx в основном используются следующие команды:
- service nginx start – запуск nginx
- service nginx stop – остановка nginx
- service nginx restart – перезапуск nginx
- service nginx reload – перечитывание конфигурационного файла без перезапуска nginx
- service nginx status – проверка статуса nginx
Заключение.
Мы с вами:
- установили nginx,
- рассмотрели основной файл конфигурации nginx,
- создали виртуальный хост
- запустили тест конфигурации
- рассмотрели основные команды управления nginx
Понравилась статья? Поделись с друзьями.
Советы по настройке и оптимизации Nginx и PHP-FPM — PEKTOP
От переводчика:
Речь пойдет о тонкостях настройки связки Nginx + PHP-FPM в виде небольшого сборника советов. Перевод вольный. Ориентированно на пользователей Linux.
Советы по настройке и оптимизации Nginx
Совет №1 — Организация файлов конфигурации Nginx
Обычно файлы конфигурации Nginx хранятся в /etc/nginx
.
Один из удобных способов организации файлов конфигурации в стиле Debian/Ubuntu Apache:
## Главный файл конфигурации
/etc/nginx/nginx.conf
## Файлы конфигурации вируальных хостов (virtualhost) ##
/etc/nginx/sites-available/
/etc/nginx/sites-enabled/
## Другие файлы конфигурации (если необходимы) ##
/etc/nginx/conf. d/
| ## Главный файл конфигурации /etc/nginx/nginx.conf
## Файлы конфигурации вируальных хостов (virtualhost) ## /etc/nginx/sites-available/ /etc/nginx/sites-enabled/
## Другие файлы конфигурации (если необходимы) ## /etc/nginx/conf.d/ |
Файлы виртуальных хостов разделены на две директории. Директория sites-available
может содержать любые файлы: тестовые, старые конфиги, копии конфигов и прочие. А директория sites-enabled
содержит только реально работающие конфигурации, в действительности являющиеся только символическими ссылками на файлы в директории sites-available
.
Не забудьте добавить следующие строки в файл nginx.conf
:
## Загрузка файлов конфигарации виртуальных хостов ##
include /etc/nginx/sites-enabled/*;
## Загрузка других конфигов из conf. d/ ##
include /etc/nginx/conf.d/*;
| ## Загрузка файлов конфигарации виртуальных хостов ## include /etc/nginx/sites-enabled/*;
## Загрузка других конфигов из conf.d/ ## include /etc/nginx/conf.d/*; |
Совет №2 — Определить Nginx worker_processes и worker_connections
Настройки по умолчанию хороши, но их стоит немного оптимизировать: max_clients = worker_processes * worker_connections
.
Базовые настройки Nginx могут обрабатывать сотни одновременных соединений:
worker_processes 1;
worker_connections 1024;
| worker_processes 1; worker_connections 1024; |
Обычно 1000 одновременных соединений на один сервер это хорошо, но порою другие части, например жесткий диск могут оказаться медленными и это приведет к тому, что Nginx будет заблокирован на операции ввода-вывода (I/O). Чтобы избежать блокировки используйте, например, следующие настройки: одни worker_process на ядро процессора
:
Worker Processes
worker_processes = [число ядер процессора];
| worker_processes = [число ядер процессора]; |
Чтобы определить сколько ядер имеет ваш процессор, введите:
$ cat /proc/cpuinfo | grep processor
processor : 0
processor : 1
processor : 2
processor : 3
| $ cat /proc/cpuinfo | grep processor processor : 0 processor : 1 processor : 2 processor : 3 |
В данном случае у меня четыре ядра, поэтому окончательный парамерт worker_processes
устанавливаем как 4:
Worker Connections
Лично я придерживаюсь 1024 соединений на один воркер, потому что у меня нет никаких оснований для повышения этого значения. Но если например 4096 соединений в секунду не хватает, то можно попробовать удвоить 2048 соединений на процесс.
Окончательные настройки выглядят седующим образом:
Совет №3 — Скрыть токены Nginx / Скрыть номер версии Nginx
Это хорошо из соображений безопасности — скрыть токены Nginx и скрыть номер версии Nginx, тем более если вы используете устаревшую версию Nginx. Это очень легко сделать — достаточно добавить в секцию http/server/location
файла конфигурации следующую строку:
Совет №4 — Ограничение на размер передаваемых данных сервером Nginx
Если вы хотите разрешить пользователям загружать файлы, то вы должны увеличить размер сообщения. Это может быть сделано с помощью значения client_max_body_size
, которое находится в секции http/server/location
файла конфигурации. По умолчанию он равен 1 Мб, но его можно увеличить, например, до 20 Мб, а также увеличить размер буфера:
client_max_body_size 20m;
client_body_buffer_size 128k;
| client_max_body_size 20m; client_body_buffer_size 128k; |
Если вы получаете сообщение об ошибке, то вы знаете, что client_max_body_size
слишком мало:
«Request Entity Too Large» (413)
Совет №5 — Управление кешем для статических файлов
Кэш браузера сохранит ресурсы и пропускную способность вашего сервера. Это несложная настройка Nginx позволит выключить ведение логов (access log
и not found log
), и установить срок истечения заголовка в 360 дней.
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
access_log off;
log_not_found off;
expires 360d;
}
| location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ { access_log off; log_not_found off; expires 360d; } |
Если вы хотите более сложный заголовки или другие типы файлов, то вы можете настроить их отдельно.
Совет №6 — Проксируйте PHP запросы к PHP-FPM
Вы можете использовать по умолчанию стек tcp/ip
или соединение через Unix-сокет. Также необходимо установить PHP-FPM слушать точно такой же ip:port
или Unix-сокет. Вот очень простой пример конфигурации (вариант с Unix-сокетом закоментирован):
# Pass PHP scripts to PHP-FPM
location ~* \.php$ {
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
#fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
| # Pass PHP scripts to PHP-FPM location ~* \.php$ { fastcgi_index index.php; fastcgi_pass 127.0.0.1:9000; #fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; } |
Это дает возможность запуска PHP-FPM другим сервером.
Совет №7 — Предотвращение (запрет) доступа к скрытым файлам
Это очень распространено, когда корень сервера или другие публичные каталоги имеют скрытые файлы, которые начинаются с точки (.) И, как правило, они не предназначены для пользователей сайта. Публичный каталог может содержать файлы системы контроля версий: .git
, .svn
; файлы IDE: .idea
; .htaccess
файлы. Настройки запещают доступ к скрытым файлам и отключают ведение логов:
location ~ /\. {
access_log off;
log_not_found off;
deny all;
}
| location ~ /\. { access_log off; log_not_found off; deny all; } |
Советы по настройке и оптимизации PHP-FPM
Совет №1 — Файлы конфигурации PHP-FPM
Обычно конфигурации PHP-FPM расположенны в файле /etc/php-fpm. conf
и в каталоге /etc/php-fpm.d/
. Весь пулл конфигов расопложен в дикертории /etc/php-fpm.d/
. Чтобы это работало, вы должны добавить следующую строку в php-fpm.conf
:
include=/etc/php-fpm.d/*.conf
| include=/etc/php-fpm.d/*.conf |
Совет №2 — Глобальная конфигурация PHP-FPM
Настройки emergency_restart_threshold
, emergency_restart_interval
и process_control_timeout
по умолчанию выключены, но я считаю что их стоит влючить, например, со следующими значениями:
emergency_restart_threshold 10
emergency_restart_interval 1m
process_control_timeout 10s
| emergency_restart_threshold 10 emergency_restart_interval 1m process_control_timeout 10s |
Что это значит? Если 10 дочерних процессов PHP-FPM завершатся с помощью SIGSEGV или SIGBUS в течении 1 минуты, то PHP-FPM перезагрузится автоматически. А также дочерним процессам установлен лимит времени реакции в 10 секунд на сигнал от мастера.
Совет №3 — Конфигурация пулов PHP-FPM
В PHP-FPM возможно использовать отденьные пулы для каждого сайта и точно распределять ресурсы, а также использовать разных пользователей и разные группы для каждого пула. Приведем примеры конфигураци трех различнх сайтов (или фактически три части одного сайта):
/etc/php-fpm.d/site.conf
/etc/php-fpm.d/blog.conf
/etc/php-fpm.d/forums.conf
Примеры конфигурации каждого пула:
/etc/php-fpm.d/site.conf
[site]
listen = 127.0.0.1:9000
user = site
group = site
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/slowlog-site.log
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 5
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 200
listen.backlog = -1
pm.status_path = /status
request_terminate_timeout = 120s
rlimit_files = 131072
rlimit_core = unlimited
catch_workers_output = yes
env[HOSTNAME] = $HOSTNAME
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| [site] listen = 127. 0.0.1:9000 user = site group = site request_slowlog_timeout = 5s slowlog = /var/log/php-fpm/slowlog-site.log listen.allowed_clients = 127.0.0.1 pm = dynamic pm.max_children = 5 pm.start_servers = 3 pm.min_spare_servers = 2 pm.max_spare_servers = 4 pm.max_requests = 200 listen.backlog = -1 pm.status_path = /status request_terminate_timeout = 120s rlimit_files = 131072 rlimit_core = unlimited catch_workers_output = yes env[HOSTNAME] = $HOSTNAME env[TMP] = /tmp env[TMPDIR] = /tmp env[TEMP] = /tmp |
/etc/php-fpm.d/blog.conf
[blog]
listen = 127.0.0.1:9001
user = blog
group = blog
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/slowlog-blog.log
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 4
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_requests = 200
listen. backlog = -1
pm.status_path = /status
request_terminate_timeout = 120s
rlimit_files = 131072
rlimit_core = unlimited
catch_workers_output = yes
env[HOSTNAME] = $HOSTNAME
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| [blog] listen = 127.0.0.1:9001 user = blog group = blog request_slowlog_timeout = 5s slowlog = /var/log/php-fpm/slowlog-blog.log listen.allowed_clients = 127.0.0.1 pm = dynamic pm.max_children = 4 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 pm.max_requests = 200 listen.backlog = -1 pm.status_path = /status request_terminate_timeout = 120s rlimit_files = 131072 rlimit_core = unlimited catch_workers_output = yes env[HOSTNAME] = $HOSTNAME env[TMP] = /tmp env[TMPDIR] = /tmp env[TEMP] = /tmp |
/etc/php-fpm. d/forums.conf
[forums]
listen = 127.0.0.1:9002
user = forums
group = forums
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/slowlog-forums.log
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 400
listen.backlog = -1
pm.status_path = /status
request_terminate_timeout = 120s
rlimit_files = 131072
rlimit_core = unlimited
catch_workers_output = yes
env[HOSTNAME] = $HOSTNAME
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| [forums] listen = 127.0.0.1:9002 user = forums group = forums request_slowlog_timeout = 5s slowlog = /var/log/php-fpm/slowlog-forums. log listen.allowed_clients = 127.0.0.1 pm = dynamic pm.max_children = 10 pm.start_servers = 3 pm.min_spare_servers = 2 pm.max_spare_servers = 4 pm.max_requests = 400 listen.backlog = -1 pm.status_path = /status request_terminate_timeout = 120s rlimit_files = 131072 rlimit_core = unlimited catch_workers_output = yes env[HOSTNAME] = $HOSTNAME env[TMP] = /tmp env[TMPDIR] = /tmp env[TEMP] = /tmp |
Это просто примеры как настроить несколько различных пулов.
Совет №4 — Конфигурация менеджера процессов (Pool Process Manager) PHP-FPM
Лучший способ использовать менеджер процессов PHP-FPM — это донамическое управление процессами, поэтому PHP-FPM запускает процессы только при необходимости. Это почти такой же подход как в Nginx с параметрами worker_processes
и worker_connections
. Таким образом большие значения не обеспечивают хорошего результата. Каждый процесс ест определнное количество памяти и, конечно, если у сайта очень большой трафик и много оперативной памяти на сервере, то высокие значения — это правильный выбор. Но такие серверы как VPS обычно имеют ограниченное количество памяти: 256 Мб, 512 Мб, 1024 Мб. Такого небольшого объема ОЗУ достаточно даже для очень большого трафика (даже десятки запросов в секунду), если эту память использовать с умом.
Проверим сколько процессов PHP-FPM позволит легко справляться серверу с нагрузкой. Сначала запустим Nginx и PHP-FPM и загрузим несколько страниц PHP, желательно самые тяжелые. Затем проверим сколько использует памяти процесс PHP-FPM — в Linux можно воспользоваться утилитами top
или htop
. Предположим что наш сервер имеет 512 Мб оперативной памяти и 220 Мб может быть использованно PHP-FPM, каждый процесс использует 24 Мб оператичной памяти (некоторые CMS с плагинами могут легко кушать 20-40 Мб на один запрос или даже больше). Затем просто вычислим значние max_children
для сервера:
220 / 24 = 9.17
Приемлемым значнием pm.max_children
будет 9. Это значние основанно на среднем значении и возможно далее его необходимо будет изменить, когда вы заметите длительное время использования памяти процессом. После быстрого тестирования несложно выбрать значния pm.start_servers value
, pm.min_spare_servers
и pm.max_spare_servers
.
Окончательная конфигурация нашего примера может выглядеть следующим образом:
pm.max_children = 9
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 200
| pm.max_children = 9 pm.start_servers = 3 pm.min_spare_servers = 2 pm.max_spare_servers = 4 pm. max_requests = 200 |
Максималоное количество запросов на процесс по умолчанию не ограничено, но хорошо бы установить какое-нибудь небольшое значение, например 200, и избежать проблем с памятью. Такого вида настрока может обрабарывать большое количество запросов, даже если значение параметра невелико.
У вас проблемы с натройкой Nginx или PHP-FPM или есть еще советы?
Не стесняйтеся писать замечания, вопросы и советы в комментариях.
Оригинальный пост на английском языке
Тонкая настройка Nginx. Защита, оптимизация.
Выделенный Web-сервер на основе nginx – отличный способ повышения производительности Web-сайтов. В скорости обработки статического контента ему просто нет равных: он легко выдерживает несколько тысяч одновременных соединений и может быть легко оптимизирован и подогнан под любую конфигурацию. Однако? выступая в качестве фронт-энда для Apache, nginx оказывается наиболее уязвимым местом всей Web-инфраструктуры, поэтому безопасности nginx необходимо уделить особое внимание.
Эта статья – своего рода ликбез, или, если хочешь, резюме всех техник повышения безопасности nginx. В ней не будет теории, описания основ настройки Web-сервера и прочей воды. Вместо этого ты получишь исчерпывающий практический материал, описывающий все основные шаги, которые необходимо проделать для того, чтобы получить по-настоящему защищенный Web-сервер.
Установка
Пакет nginx доступен в прекомпилированном виде для любого дистрибутива. Однако собрав сервер самостоятельно, ты сможешь сделать его более компактным и надежным, а также получишь возможность изменить строку приветствия Web-сервера, чтобы отбить несмышленых скрипт-кидди.
Измени строку приветствия Web-сервера
Скачай исходники nginx, открой файл src/http/ngx_http_header_filter_module.c и найди следующие две строки:
static char ngx_http_server_string[] = "Server: nginx" CRLF;
static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
Замени их на что-то вроде этого:
static char ngx_http_server_string[] = "Server: ][ Web Server" CRLF;
static char ngx_http_server_full_string[] = "Server: ][ Web Server" CRLF;
Удали все неиспользуемые тобой nginx-модули
Некоторая часть модулей nginx подключается к Web-серверу прямо во время компиляции, и любой из них таит в себе потенциальную опасность. Возможно, в будущем в одном из них будет найдена уязвимость, и твой сервер окажется под угрозой. Отключив ненужные модули, ты сможешь значительно снизить риск возникновения такой ситуации.
Выполни сборку с помощью следующих команд:
# ./configure --without-http_autoindex_module --without-http_ssi_module
# make# make install
Так ты получишь nginx с заранее отключенными (и в большинстве случаев бесполезными) модулями SSI (Server Side Includes) и Autoindex. Чтобы узнать, какие модули можно безболезненно выбросить из Web-сервера, запусти скрипт configure с флагом ‘—help’.
Препарируем nginx.conf
После установки nginx следует настроить. На страницах журнала уже был материал, описывающий этот процесс, мы же будем придерживаться темы статьи и поговорим о способах повышения безопасности сервера.
Отключи показ версии сервера на всех ошибочных страницах
Добавь в файл nginx.conf строку “server_tokens off”. Это заставит nginx скрывать информацию о типе и версии Web-сервера на страницах, генерируемых в ответ на ошибочный запрос клиента.
Настрой защиту от срыва стека
Добавь в секцию server следующие строки:
# vi /etc/nginx/nginx.conf
# Максимальный размер буфера для хранения тела запроса клиента
client_body_buffer_size 1K;
# Максимальный размер буфера для хранения заголовков запроса клиента
client_header_buffer_size 1k;
# Максимальный размер тела запроса клиента, прописанный в поле Content-Length заголовка. Если сервер должен поддерживать загрузку файлов, это значение необходимо увеличить
client_max_body_size 1k;
# Количество и размер буферов для чтения большого заголовка запроса клиента
large_client_header_buffers 2 1k;
Обрати внимание на директиву large_client_header_buffers. По умолчанию, для хранения строки URI nginx выделяет четыре буфера, размер каждого из которых равен размеру страницы памяти (для x86 это 4 Кб). Буферы освобождаются каждый раз, когда по окончанию обработки запроса соединение переходит в состояние keep-alive. Два буфера по 1 Кб могут хранить URI длиной только 2 Кб, что позволяет бороться с ботами и DoS-атаками.
Для повышения производительности добавь следующие строки:
# vi /etc/nginx/nginx.conf
# Таймаут при чтении тела запроса клиента
client_body_timeout 10;
# Таймаут при чтении заголовка запроса клиента
client_header_timeout 10;
# Таймаут, по истечению которого keep-alive соединение с клиентом не будет закрыто со стороны сервера
keepalive_timeout 5 5;
# Таймаут при передаче ответа клиенту
send_timeout 10;
Контролируй количество одновременных соединений
Для защиты Web-сервера от перегрузки и попыток осуществить DoS-атаку добавь в конфиг следующие строки:
# vi /etc/nginx/nginx.conf
# Описываем зону (slimits), в которой будут храниться состояния сессий. Зона размером 1 Мб может хранить около 32000 состояний, мы устанавливаем ее размер равным 5 Мб
limit_zone slimits $binary_remote_addr 5m;
# Задаем максимальное количество одновременных соединений для одной сессии. По сути, это число задает максимальное количество соединений с одного IP
limit_conn slimits 5;
Первая директива должна находиться в секции HTTP, вторая – в секции location. Когда количество соединений выйдет за пределы лимитов, клиент получит сообщение «Service unavailable» с кодом 503.
Разреши коннекты только к своему домену
Взломщики могут использовать ботов для сканирования подсетей и поиска уязвимых Web-серверов. Обычно боты просто перебирают диапазоны IP-адресов в поисках открытых 80 портов и посылают запрос HEAD для получения информации о веб-сервере (или главной странице). Ты можешь легко предотвратить такой скан, запретив обращение к серверу по IP-адресу (добавить в подсекцию location):
# vi /etc/nginx/nginx. (GET|HEAD|POST)$ ) {
return 444;
}
Отшивай ботов
Другой способ блокирования ботов, сканеров и прочей нечисти основан на определении типа клиента (user-agent). Он не слишком эффективен, потому как большинство ботов косят под вполне легитимные браузеры, но в ряде случаев остается полезным:
# vi /etc/nginx/nginx.conf
# Блокируем менеджеры загрузки
if ($http_user_agent ~* LWP::Simple|BBBike|wget) {
return 403;
}
# Блокируем некоторые типы ботов
if ($http_user_agent ~* msnbot|scrapbot) {
return 403;
}
Блокируй Referrer-спам
Если твой сайт публикует Web-логи в общедоступном виде, ты легко можешь стать жертвой Referrer-спама (когда спам-боты обращаются к твоему серверу, указывая в заголовке referrer – адрес рекламируемого сайта). Такой вид спама может легко испортить SEO-рейтинги интернет-страницы, поэтому его необходимо блокировать в обязательном порядке. Один из способов сделать это – занести наиболее частые слова, встречающиеся в адресах рекламируемых сайтов, в черный список.
# vi /etc/nginx/nginx.conf
# Секция server
if ( $http_referer ~* (babes|forsale|girl|jewelry|love|nudit|organic|poker|porn|sex|teen) )
{
return 403;
}
Блокируй хотлинк
Хотлинк – это включение в страницу изображения (или иного контента) с другого сайта. По сути, это воровство, потому как изображение, на которое ты потратил не один час своего свободного времени, не только свободно используется другими, но и создает нагрузку на твой Web-сервер, не приводя на него посетителей. Для борьбы с хотлинками достаточно сделать так, чтобы изображения отдавались клиенту только в том случае, если он запросил их, уже находясь на сайте (другими словами, заголовок referrer-запроса должен содержать имя твоего сайта). Добавь в секцию server конфигурационного файла nginx.conf следующие строки (host.com – это адрес твоего сайта):
# vi /etc/nginx/nginx.conf
location /images/ {
valid_referers none blocked www. /images/uploads.*\.(gif|jpg|jpeg|png)$ http://www.host.com/banned.jpg last
Защищай важные каталоги от посторонних
Как и любой другой Web-сервер, nginx позволяет регулировать доступ к каталогам на основе IP-адресов и паролей. Эту возможность можно использовать для закрытия некоторых частей сайта от посторонних глаз. Например, для отрезания URI от внешнего мира:
# vi /etc/nginx/nginx.conf
location /uploads/ {
# Разрешаем доступ только машинам локальной сети
allow 192.168.1.0/24;
# Отшиваем всех остальных
deny all;
}
Теперь к документам каталога uploads будут иметь доступ только пользователи локальной сети. Для установки пароля придется проделать более сложные действия. Сначала необходимо создать приватный для nginx-файл паролей и добавить в него необходимых пользователей (в качестве примера добавим пользователя admin):
# mkdir /etc/nginx/.htpasswd
# htpasswd -c /etc/nginx/.htpasswd/passwd admin
Далее открой файл nginx. conf и впиши в него следующие строки:
# vi /etc/nginx/nginx.conf
location /admin/ {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd/passwd;
}
Новых пользователей можно добавить с помощью следующей команды:
# htpasswd -s /etc/nginx/.htpasswd/passwd пользователь
Используй SSL
Если твой сайт работает с приватными данными пользователей, такими как номера кредитных карт, пароли от других сервисов, или же предоставляет доступ к другой важной информации, которая может стать лакомым кусочком для третьих лиц, позаботься о шифровании. Nginx хорошо работает с SSL, и этой возможностью нельзя пренебрегать.
Для настройки SSL-шифрования средствами nginx достаточно выполнить несколько простых шагов. Сначала ты должен создать сертификат с помощью следующей последовательности команд:
# cd /etc/nginx
# openssl genrsa -des3 -out server.key 1024
# openssl req -new -key server. key -out server.csr
# cp server.key server.key.org
# openssl rsa -in server.key.org -out server.key
# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Затем описать сертификат в конфигурационном файле nginx:
# vi /etc/nginx/nginx.conf
server {
server_name host.com;
listen 443;
ssl on;
ssl_certificate /etc/nginx/server.crt;
ssl_certificate_key /etc/nginx/server.key;
access_log /etc/nginx/logs/ssl.access.log;
error_log /etc/nginx/logs/ssl.error.log;
}
После этого можно перезагрузить Web-сервер:
# /etc/init.d/nginx reload
Естественно, без поддержки со стороны самого Web-сайта это делать бессмысленно.
Другие способы
Установи правильные значения системных переменных
Открой файл /etc/sysctl.conf и помести в него следующие строки:
# vi /etc/sysctl.conf
# Защита от smurf-атак
net. ipv4.icmp_echo_ignore_broadcasts = 1
# Защита от неправильных ICMP-сообщений
net.ipv4.icmp_ignore_bogus_error_responses = 1
# Защита от SYN-флуда
net.ipv4.tcp_syncookies = 1
# Запрещаем маршрутизацию от источника
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# Защита от спуфинга
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Мы не маршрутизатор
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
# Включаем ExecShield
kernel.exec-shield = 1
kernel.randomize_va_space = 1
# Расширяем диапазон доступных портов
net.ipv4.ip_local_port_range = 2000 65000
# Увеличиваем максимальный размер TCP-буферов
net.ipv4.tcp_rmem = 4096 87380 8388608
net.ipv4.tcp_wmem = 4096 87380 8388608
net.core.rmem_max = 8388608
net.core.wmem_max = 8388608
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_window_scaling = 1
Размести корневой каталог Web-сервера на выделенном разделе
Поместив корневой каталог Web-сервера в выделенный раздел и запретив на нем размещение любых исполняемых файлов и файлов-устройств, ты обезопасишь остальную часть системы от тех, кто сможет получить доступ к корню Web-сервера. При этом запись в файле /etc/fstab должна иметь примерно такой вид:
/dev/sda5 /nginx ext4 defaults,nosuid,noexec,nodev 1 2
Помести nginx в chroot/jail-окружение
Любая современная *nix-система позволяет запереть приложение в изолированной среде исполнения. В Linux для этого можно использовать технологии KVM, Xen, OpenVZ и VServer, во FreeBSD – Jail, в Solaris – Zones. Если ни одна из этих технологий не доступна, ты можешь поместить nginx в классический chroot, который хоть и намного более хрупок, но большинство взломщиков остановить сможет.
Установи правила SELinux для защиты nginx
Хорошей альтернативой изолированным средам исполнения являются локальные системы обнаружения и предотвращения вторжений, такие как SELinux или AppArmor. Будучи правильно настроенными, они смогут предотвратить попытки взлома Web-сервера. По дефолту ни одна из них не настроена для работы в связке с nginx, однако в рамках проекта SELinuxNginx (http://sf. net/projects/selinuxnginx/) были созданы правила для SELinux, которые может использовать любой желающий. Остается только скачать и установить:
# tar -zxvf se-ngix_1_0_10.tar.gz
# cd se-ngix_1_0_10/nginx
# make
# /usr/sbin/semodule -i nginx.pp
Настрой брандмауэр
Обычно nginx устанавливают на выделенных машинах, готовых к высокой нагрузке, поэтому зачастую он остается единственным сетевым сервисом, работающим на сервере. Чтобы обезопасить сервер, достаточно создать совсем небольшой набор правил, которые будут открывать 80, 110 и 143-й порты (если, конечно, nginx должен работать еще и как IMAP/POP3-прокси) и закрывать от внешнего мира все остальное.
Ограничь количество соединений с помощью брандмауэра
Для не слишком нагруженного Web-сайта хорошей идеей будет ограничить количество попыток соединений с одного IP-адреса в минуту. Это сможет уберечь тебя от некоторых типов DoS-атак и брутфорса. В Linux это можно сделать с помощью стандартного iptables/netfilter-модуля state:
# iptables -A INPUT -p tcp --dport 80 -i eth0 \
-m state --state NEW -m recent --set
# iptables -A INPUT -p tcp --dport 80 -i eth0 \
-m state --state NEW -m recent --update \
--seconds 60 --hitcount 15 -j DROP
Правила урезают лимит на количество подключений с одного IP в минуту до 15. То же можно сделать и с помощью pf:
# vi /etc/pf.conf
webserver_ip="1.1.1.1"
table <abuse> persist
block in quick from <abuse>
pass in on $ext_if proto tcp to $webserver_ip \
port www flags S/SA keep state \
(max-src-conn 100, max-src-conn-rate 15/60, \
overload <abusive_ips> flush)
Кроме лимита на количество последовательных подключений (15 в минуту), данное правило устанавливает дополнительный лимит на количество одновременных подключений равный 100.
Настрой PHP
Если ты используешь nginx в связке с PHP, не забудь настроить и его. Вот как должен выглядеть конфигурационный файл /etc/php/php.ini защищенного сервера:
# vi /etc/php/php.ini
# Отключаем опасные функции
disable_functions = phpinfo, system, mail, exec
# Максимальное время исполнения скрипта
max_execution_time = 30
# Максимальное время, которое может потратить скрипт на обработку данных запроса
max_input_time = 60
# Максимальное количество памяти, выделяемое каждому скрипту
memory_limit = 8M
# Максимальный размер данных, отсылаемых скрипту с помощью метода POST
post_max_size = 8M
# Максимальный размер загружаемых файлов
upload_max_filesize = 2M
# Не показывать ошибки PHP-скриптов пользователям
display_errors = Off
# Включаем Safe Mode
safe_mode = On
# Включаем SQL Safe Mode
sql. safe_mode = On
# Позволяем выполнять внешние команды только в этом каталоге
safe_mode_exec_dir = /путь/к/защищенному/каталогу
# Защищаемся от утечки информации о PHP
expose_php = Off
# Ведем логи
log_errors = On
# Запрещаем открытие удаленных файлов
allow_url_fopen = Off
Выводы
Применив описанные в статье рекомендации, ты получишь гораздо более защищенный Web-сервер. Но имей в виду, что не все техники подойдут к твоей конфигурации. Например, защита от брутфорса, основанная на урезании размеров буферов, выделяемых nginx под обработку запросов клиентов, может привести к падению производительности, а в некоторых случаях и к сбоям в обработке запросов. Ограничение на количество подключений нанесет сильный удар по производительности даже средненагруженного Web-сайта, но принесет пользу, если страница имеет низкий поток посетителей. Всегда проверяй, как внесенные тобой изменения повлияли на производительность и общую работоспособность Web-страницы.
О герое дня
Nginx – один самых производительных и популярных Web-серверов в мире. Согласно данным Netcraft, он используется для поддержки более чем 12 миллионов Web-сайтов по всему миру, включая таких мастодонтов как Rambler, Yandex, Begun, WordPress.com, Wrike, SourceForge.net, vkontakte.ru, megashara.com, Либрусек и Taba.ru. Грамотная архитектура, основанная на мультиплексировании соединений с помощью системных вызовов select, epoll (Linux), kqueue (FreeBSD) и механизме управления памятью на основе пулов (небольших буферов от 1 до 16 Кб), позволяет nginx не проседать даже под очень высокими нагрузками, выдерживая свыше 10000 одновременных соединений (так называемая проблема C10K). Изначально написан Игорем Сысоевым для компании Rambler и открыт в 2004 году под BSD-подобной лицензией.
Взято с xakep.ru
Вконтакте
Google+
LiveJournal
Одноклассники
Мой мир
Настройка VDS с нуля на Centos 7, Nginx, PHP-fpm без Apache — Mac и Linux
Здесь собраны все необходимые процедуры для настройки сервера с нуля на основе Centos 7. x без использования Apache для экономии серверных ресурсов. Apache заменяет Nginx с модулем PHP-FPM 5.6. В качестве базы данных используется MariaDB.
1. Nginx
2. PHP 5.6
3. php.ini
4. PHP-FPM
5. Настроить конфиги php-fpm и nginx
6. Пользователей, кроме root, сменить пароль root
7. Firewall или iptables
8. Папки сайтов и логов
9. MariaDB
Очистка старого SSH ключа на локальной машине
ssh-keygen -R *ip_address_or_hostname*
cat /etc/centos-release — проверка версии centos
Апдейт
yum clean all
yum update
yum autoremove
Package 1:nginx-1.10.2-1.el7.x86_64 already installed and latest version
Package php-fpm-5.6.30-1.el7.remi.x86_64 already installed and latest version
Package php-mysql-5.4.45-13.el7.remi.x86_64 is obsoleted by php-mysqlnd-5.6.30-1.el7.remi.x86_64 which is already installed
Package 1:mariadb-server-5.5.52-1.el7.x86_64 already installed and latest version
Package unzip-6. 0-16.el7.x86_64 already installed and latest version
Firewall
systemctl status firewalld — проверка статуса файрволла
firewall-cmd —list-ports
Меняем порт SSH
$ sudo firewall-cmd —zone=public —add-port=974/tcp —permanent
$ sudo firewall-cmd —reload
firewall-cmd —zone=public —remove-port=22/tcp
systemctl restart firewalld.service
nano /etc/ssh/sshd_config
systemctl restart sshd.service
nano /etc/sysconfig/selinux — проверить disable
Устанавливаем NGINX
yum install epel-release
yum install nginx
systemctl start nginx
systemctl status nginx
If you are running a firewall, run the following commands to allow HTTP and HTTPS traffic:
sudo firewall-cmd —permanent —zone=public —add-service=http
sudo firewall-cmd —permanent —zone=public —add-service=https
nginx -V
check
http://server_domain_name_or_IP/ проверить IP — ip addr
You should now put your content in a location of your choice and edit the root configuration directive in the nginx configuration file /etc/nginx/nginx. conf.
Start every boot
systemctl enable nginx
Default Server Root
The default server root directory is /usr/share/nginx/html. Files that are placed in there will be served on your web server. This location is specified in the default server block configuration file that ships with Nginx, which is located at /etc/nginx/nginx.conf.
Server Block Configuration
Any additional server blocks, known as Virtual Hosts in Apache, can be added by creating new configuration files in /etc/nginx/conf.d. Files that end with .conf in that directory will be loaded when Nginx is started.
Nginx Global Configuration
The main Nginx configuration file is located at /etc/nginx/nginx.conf. This is where you can change settings like the user that runs the Nginx daemon processes, and the number of worker processes that get spawned when Nginx is running, among other things.
Версия PHP
php -v
Обновление до PHP 5.6
# wget http://rpms. remirepo.net/enterprise/remi-release-7.rpm
# rpm -Uvh remi-release-7*.rpm
В CentOS php.ini лежит в /etc, прямо в корне.
We will change both of these conditions by uncommenting the line and setting it to «0» like this:
/etc/php.ini excerpt
cgi.fix_pathinfo=0
Установка PHP-FPM
sudo nano /etc/yum.repos.d/remi.repo
удаляем 5.5 и ставим enabled=1 для remi и remi-php56
Теперь обновляем php 5.4 до php 5.6:
# yum —enablerepo=remi,remi-php56 install php php-common php-mysql php-mbstring php-mcrypt php-devel php-xml php-gd php-fpm
Запускаем
systemctl start php-fpm
systemctl enable php-fpm
Создаём конфиг php-fpm
nano /etc/nginx/default.d/php-fpm.conf
And add the following content to it:
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index. php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
Next, open the php-fpm configuration file www.conf:
sudo vi /etc/php-fpm.d/www.conf
Find the line that specifies the listen parameter, and change it so it looks like the following:
127.0.0.1 заменить на
listen = /var/run/php-fpm/php-fpm.sock
Next, find the lines that set the listen.owner and listen.group and uncomment them. They should look like this:
listen.owner = nobody
listen.group = nobody
Lastly, find the lines that set the user and group and change their values from «apache» to «nginx»:
user = nginx
group = nginx
Then save and quit.
Now, we just need to start our PHP processor by typing:
sudo systemctl start php-fpm
This will implement the change that we made.
Next, enable php-fpm to start on boot:
sudo systemctl enable php-fpm
systemctl restart php-fpm
systemctl restart nginx
Узнать версию MySql
rpm -qa | grep mysql
Пакеты MySql
Пакеты MySql
yum list installed | grep mysql
Просмотр установленных пакетов
yum list installed
Установка MariaDB
yum install -y mariadb mariadb-server
Добавляем mariadb в автозапуск:
# systemctl enable mariadb. service
Запускаем mariadb:
# systemctl start mariadb
Перезапуск mariadb/mysql в CentOS 7:
# systemctl restart mariadb
Проверяем, запустилась или нет:
# netstat -tulnp | grep mysqld
Теперь запускаем стандартный скрипт настройки безопасности:
# /usr/bin/mysql_secure_installation
Установка Zabbix + nginx+php-fpm + mariaDB в Unix/Linux
Я описывал статью как можно установить zabbix на различные Linux системы. Но по дефолту, заббикс юзает апач для фронтенда. Но я люблю nginx + php-fpm и данная статья покажет как это сделать.
Установка Zabbix + nginx+php-fpm + mariaDB в Unix/Linux
Я расскажу как установить все эти компоненты, но начнем с самого элементарного.
Установка nginx в Unix/Linux
Полезное чтиво:
Установка PHP 7(php-fpm) с nginx 1.9 в Debian 8
Виртуальный хост для отдельного пользователя с PHP-FPM и nginx
Установка Nginx, PHP-FPM, MariaDB на CentOS 7 / RHEL 7
Уcтановка nginx, MySQL, PHP (LEMP) stack на Debian/Ubuntu
Установка и настройка nginx c PHP5, PHP-FPM и MySQL на Fedora
Установка php-fpm в Unix/Linux
Полезное чтиво:
Настройка «process manager(dynamic/static/ondemand)» для php-fpm в Unix/Linux
Установка mariaDB в Unix/Linux
Полезное чтиво:
Установка MariaDB 5. 5 на RHEL / CentOS / Fedora Linux
Установка MariaDB 10 на CentOS 7
Установка MariaDB на Debian
Установка MariaDB в Ubuntu
Установка Zabbix в Unix/Linux
Полезное чтиво:
Установка Zabbix на RedHat/CentOS/Fedora
Установка Zabbix на Debian/Ubuntu/Linux Mint
Настройка Zabbix + nginx+php-fpm + mariaDB в Unix/Linux
Если есть необходимость использовать nginx, то вот конфиг:
# vim /etc/nginx/conf.d/zabbix.conf
И получаем следующее:
server { listen 80; server_name zabbix.local.server; access_log /var/log/nginx/access-zabbix.local.server.log; error_log /var/log/nginx/error-zabbix.local.server.log info; root /usr/share/zabbix; index index.php index.html; auth_basic "Nagios Restricted Access"; auth_basic_user_file /etc/zabbix/passwd; location / { root /usr/share/zabbix; index index.php index.html; } location ~ \. php$ { fastcgi_pass php-fpm; fastcgi_index index.php; fastcgi_param PHP_VALUE " max_execution_time = 300 memory_limit = 128M post_max_size = 16M upload_max_filesize = 2M max_input_time = 300 date.timezone = Europe/Kiev always_populate_raw_post_data = -1 "; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; try_files $uri =404; include fastcgi_params; } location = /favicon.ico { log_not_found off; access_log off; } location ~* ".+\.(?:ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|css|swf|js|atom|jpe?g|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$" { access_log off; log_not_found off; expires max; } location ~* ^/(conf|api|include)($|\/) { deny all; } location ~ /\. ht { deny all; } location ~ /\. { deny all; } }
Хочу отметить следующее, что заббикс по деволту использует apache и если использовать nginx, то необходимо сменить права:
# chown -R nginx. /etc/zabbix/web # chown -R nginx. /usr/share/zabbix
Так же, я запускаю php-fpm от nginx пользователя ( я создал ему отдельный файл):
# vim /etc/php-fpm.d/zabbix.conf
И прописал в него:
[www] user = nginx group = nginx listen = 127.0.0.1:9000 listen.allowed_clients = 127.0.0.1 listen.owner = nginx listen.group = nginx listen.mode = 0666 pm = dynamic pm.start_servers = 30 pm.min_spare_servers = 30 pm.max_spare_servers = 45 pm.process_idle_timeout = 30s pm.max_requests = 500000000 pm.status_path = /status request_terminate_timeout = 600s slowlog = /var/log/php-fpm/www-slow. log rlimit_files = 65535 chdir = / security.limit_extensions = .php .php3 .php4 .php5 env[HOSTNAME] = $HOSTNAME env[PATH] = /usr/local/bin:/usr/bin:/bin env[TMP] = /tmp env[TMPDIR] = /tmp env[TEMP] = /tmp php_flag[display_errors] = off php_admin_value[error_reporting] = 0 php_admin_value[error_log] = /var/log/php-fpm/php5-fpm.log php_admin_flag[log_errors] = on php_admin_value[memory_limit] = 128M php_admin_flag[log_errors] = on php_admin_flag[display_errors] = on php_value[session.save_handler] = files php_value[session.save_path] = /var/lib/php/session
Выставляем права на сессии:
# chown -R nginx. /var/lib/php/session
И для супер-пупер секурити, создаем:
# htpasswd -c /etc/zabbix/passwd zabbix
Прописываем пароль, для пользователя zabbix.
Перезапускаем службы:
# service nginx restart # service php-fpm restart # service mysql restart
Если mysql установлен, то еще необходимо создать пользователя, который будет управлять данной БД. Для начала, подключаемся к серверу:
# mysql -proot -p
Создаем базу и пользователя с паролем:
> create database zabbix character set utf8 collate utf8_bin; > grant all privileges on zabbix.* to 'zabbix'@'127.0.0.1' IDENTIFIED BY 'passwd_user_zabbix'; > flush privileges;
У меня используется:
- zabbix — База данных.
- zabbix — пользователь.
- passwd_user_zabbix — пароль для пользователя.
Импортируем данные в созданную БД:
# zcat /usr/share/doc/zabbix-server-mysql-3.2.6/create.sql.gz | mysql -u zabbix -p zabbix
Настройка zabbix-server
Открываем:
# vim /etc/zabbix/zabbix_server.conf
И производим настройку, у меня данный файл имеет вид:
ListenPort=10051 SourceIP=192.168.13.66 LogFile=/var/log/zabbix/zabbix_server.log LogFileSize=0 PidFile=/var/run/zabbix/zabbix_server.pid DBHost=localhost DBName=zabbix DBUser=zabbix DBPassword=passwd_user_zabbix DBPort=3306 JavaGatewayPort=10052 SNMPTrapperFile=/var/log/snmptrap/snmptrap. log CacheSize=8M HistoryCacheSize=16M HistoryIndexCacheSize=4M Timeout=4 AlertScriptsPath=/usr/lib/zabbix/alertscripts ExternalScripts=/usr/lib/zabbix/externalscripts LogSlowQueries=3000 Include=/usr/local/etc/zabbix_server.conf.d/*.conf
Создаем папку:
# mkdir /usr/local/etc/zabbix_server.conf.d
Запускаем сервер:
# service zabbix-server restart
Проверяем соединения:
# netstat -tulpn|grep zabbix
Разрешаем автозапуск (centOS 7):
$ systemctl enable zabbix-server.service
Или (centOS 5-6):
# chkconfig --levels 235 zabbix-server on
Идем дальше.
Настройка zabbix-agent
Открываем:
# vim /etc/zabbix/zabbix_agentd.conf
И производим настройку, у меня данный файл имеет вид:
PidFile=/var/run/zabbix/zabbix_agentd.pid LogFile=/var/log/zabbix/zabbix_agentd.log LogFileSize=0 Server=192.168.13.66 ListenPort=10050 ListenIP=0. 0.0.0 ServerActive=192.168.13.66 Hostname=Zabbix server Include=/etc/zabbix/zabbix_agentd.d/*.conf
Запускаем агент:
# service zabbix-agent restart
Проверяем соединения:
# netstat -tulpn|grep zabbix
Разрешаем автозапуск (centOS 7):
$ systemctl enable zabbix-agent.service
Или (centOS 5-6):
# chkconfig --levels 235 zabbix-agent on
Идем дальше.
Настройка файрвола
Для корректной работы, нужно пробросить 10050 и 10051.
Пример использования systemctl (пример для centos 7):
# firewall-cmd --permanent --add-port=10050/tcp # firewall-cmd --permanent --add-port=10051/tcp
Перезапускаем:
# systemctl restart firewalld
Пример использования SELinux (пример для centos 7):
# setsebool -P httpd_can_connect_zabbix=1
Пример использования iptables (пример для centos 5-6):
# iptables -A INPUT -p tcp -m tcp --dport 10050 -j ACCEPT # iptables -A INPUT -p tcp -m tcp --dport 10051 -j ACCEPT # iptables -A INPUT -p tcp -m tcp --dport 10052 -j ACCEPT
Для более секундного решения, пробрасываем каждый ИПшник агента и открываем ему порт:
iptables -A INPUT -p tcp -s 172. 22.221.100 --dport 10050 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -p tcp -s 172.22.221.100 --dport 10051 -m state --state NEW,ESTABLISHED -j ACCEPT
Сохраняем правила:
# iptables-save > /etc/iptables.up.rules
Работа с zabbix
Выполняем установку через веб-интерфейс. Вводим данные которые были созданы выше( zabbix — база данных, zabbix — пользователь, passwd_user_zabbix — его пароль). После установки, можно будет зайти в админ панель:
Пользователь — Admin
Пароль для пользователя — zabbix
После установки, залогинились в админ-панель и приступим к настройке. Первое что нужно сделать — это создать нового пользователя и дать ему права администратора:
— Открываем «Administration» -> «Users». Нажимаем на «Create user» и прописываем ему нужные параметры. Я создал суперпользователя ( взял все от юзера zabbix). После чего, удалил пользователя zabbix ( т.к он не безопасный).
— Открываем «Administration» -> «Media types». Нажимаем на «email» и вводим нужные параметры. Я не буду заострять внимание на этом. Я расскажу как настроить данную вкладку в следующих статьях.
Я, хочу мониторить сам сервер, и сейчас я, включу данную функцию:
— Открываем «Administration» -> «Hosts». Нажимаем на чекбокс с «Zabbix server» и после чего, клацаем на «enable». Вот скриншот:
Чтобы убедится что все работает и собираются данные — переходим:
— Открываем «Monitoring» -> «Latest data». Выбираем наш сервер, какие данные чекать.
Собственно — это все. Минимальная настройка уже имеется. Как работать с заббиксом и заббикс-агентами, будет немного позже.
Установка и подключения других агентов
Опишу в следующей статье.
А на этом, у меня все. Тема «» завершена.
Настройка веб-сервера (Symfony Docs)
Предпочтительный способ разработки вашего приложения Symfony — использовать
Локальный веб-сервер Symfony.
Однако при запуске приложения в производственной среде вам потребуется
использовать полнофункциональный веб-сервер. В этой статье описывается несколько способов использования
Symfony с Apache или Nginx.
При использовании Apache вы можете настроить PHP как
Модуль Apache или FastCGI с использованием
PHP FPM.FastCGI также является предпочтительным способом
использовать PHP с Nginx.
Добавление правил перезаписи
Самый простой способ — установить apache
Symfony pack
выполнив следующую команду:
$ композитору требуется symfony / apache-pack |
Этот пакет устанавливает файл .htaccess
в общедоступном каталоге /
, который содержит
правила перезаписи, необходимые для обслуживания приложения Symfony.
На производственных серверах следует переместить .htaccess
в основную
Файл конфигурации Apache для повышения производительности. Для этого скопируйте
.htaccess
содержимое внутри конфигурации
, связанной с
каталог приложения Symfony public /
(и замените AllowOverride All
по AllowOverride Нет
):
|
Apache с mod_php / PHP-CGI
Минимальная конфигурация для запуска вашего приложения под Apache:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
Подсказка
Если ваша система поддерживает переменную APACHE_LOG_DIR
, вам может потребоваться
использовать $ {APACHE_LOG_DIR} /
вместо жесткого кодирования / var / log / apache2 /
.
Используйте следующую оптимизированную конфигурацию , чтобы отключить поддержку .htaccess
и увеличить производительность веб-сервера:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 год 22 23 24 25 26 27 28 29 30 31 год 32 33 34 35 год 36 |
|
Осторожно
Используйте FallbackResource
на Apache 2. 4.25 или новее из-за ошибки, которая была
исправлено в этом выпуске, приводившее к зависанию root /
.
Подсказка
Если вы используете php-cgi , Apache не передает базовое имя пользователя HTTP и
пароль к PHP по умолчанию. Чтобы обойти это ограничение, вы должны использовать
следующий фрагмент конфигурации:
RewriteRule. * - [E = HTTP_AUTHORIZATION:% {HTTP: Authorization}] |
Использование mod_php / PHP-CGI с Apache 2.4
В Apache 2.4, Order Allow, Deny
заменен на Require all grant
.Следовательно, вам необходимо изменить настройки разрешений Directory
следующим образом:
|
Дополнительные параметры конфигурации Apache см. В официальной документации Apache.
Apache с PHP-FPM
Чтобы использовать PHP-FPM с Apache, вы сначала должны убедиться, что у вас есть
менеджер процессов FastCGI php-fpm
двоичный и модуль Apache FastCGI
установлен (например, в системе на основе Debian вам необходимо установить
libapache2-mod-fastcgi
и php7. 1-fpm
пакетов).
PHP-FPM использует так называемые пулы для обработки входящих запросов FastCGI. Вы можете
настроить произвольное количество пулов в конфигурации FPM. В бассейне
вы настраиваете либо сокет TCP (IP и порт), либо сокет домена Unix для
слушай дальше. Каждый пул также может запускаться под другим UID и GID:
.
; пул под названием www [www] пользователь = www-data группа = www-данные ; использовать сокет домена unix слушайте = /var/run/php/php7.1-fpm.носок ; или слушать TCP-сокет слушайте = 127.0.0.1:9000 |
Использование mod_proxy_fcgi с Apache 2.4
Если вы используете Apache 2.4, вы можете использовать mod_proxy_fcgi
для передачи входящих
запросы к PHP-FPM. Настройте PHP-FPM для прослушивания сокета TCP или Unix, включите
mod_proxy
и mod_proxy_fcgi
в вашей конфигурации Apache и используйте
SetHandler
директива для передачи запросов на файлы PHP в PHP FPM:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 год 22 23 24 25 26 27 28 29 30 31 год 32 33 34 35 год 36 37 38 39 40 41 |
|
PHP-FPM с Apache 2.2
В Apache 2.2 или ниже вы не можете использовать mod_proxy_fcgi
. Вы должны использовать
вместо этого используйте директиву FastCgiExternalServer. Следовательно, ваша конфигурация Apache
должно выглядеть примерно так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 год 22 23 24 25 26 |
|
Если вы предпочитаете использовать сокет Unix, вы должны использовать опцию -socket
вместо:
FastCgiExternalServer / usr / lib / cgi-bin / php7-fcgi -socket /var/run/php/php7. / index \.(. + \. php) (/.*) $; включить fastcgi_params; # необязательно установить значение переменных среды, используемых в приложении # fastcgi_param APP_ENV prod; # fastcgi_param APP_SECRET |
Примечание
В зависимости от конфигурации PHP-FPM, fastcgi_pass
также может быть
Астрахань-Ашхабад 127.0.0.1: 9000 .
Подсказка
Это выполняет только index.php
в общедоступном каталоге. Все остальные файлы
с окончанием на «. php» будет отказано.
Если в вашем общедоступном каталоге есть другие файлы PHP, которые необходимо запустить,
обязательно включите их в блок location
выше.
Осторожно
После развертывания в производственной среде убедитесь, что не может получить доступ к index.php
сценарий (т.е. http://example.com/index.php
).
Дополнительные параметры конфигурации Nginx см. В официальной документации Nginx.
Базовая конфигурация PHP 7 и Nginx в Ubuntu 16.04 Linux
Nginx быстро обгоняет Apache в качестве любимого веб-сервера. Для веб-приложений, созданных на таких языках, как Rails и Python, он практически повсеместен, но немного медленнее приживается в мире PHP. Отчасти это связано с тем, насколько легко PHP и Apache сочетаются друг с другом.Однако PHP и Nginx могут взаимодействовать почти так же легко, и с выпуском PHP 7 их объединение может стать довольно быстрым вариантом.
Пакеты
Перво-наперво. Обновите Ubuntu и получите пакеты Nginx и PHP.
# sudo apt-get update && sudo apt-get -y upgrade # sudo apt-get -y install nginx php7.0 php7.0-fpm
Когда установка будет завершена, все пакеты должны быть на месте и фактически запущены. Чтобы убедиться, что это так, вы можете проверить, что и Nginx, и службы PHP-FPM работают в Systemd.
# sudo systemctl status nginx # sudo systemctl status php7.0-fpm
Если Systemd подтверждает, что обе службы запущены, сервер действительно должен быть включен, и вы сможете увидеть страницу приветствия Nginx по умолчанию, перейдя на localhost
в браузере.
Конфигурация
Конечно, это еще не готово для размещения чего-либо. Требуется некоторая конфигурация, чтобы указать Nginx на некоторый фактический контент и повысить безопасность. Корневой каталог для файлов конфигурации Nginx находится по адресу / etc / nginx
.К счастью, в Ubuntu уже есть настройки по умолчанию, которые значительно упрощают процесс настройки.
Nginx.conf
Основной файл конфигурации для Nginx — это nginx.conf
. Откройте его в любом текстовом редакторе. Для этого потребуются права root, поэтому текстовый редактор, такой как Vim, вероятно, будет лучшим. Конфигурация по умолчанию в основном подходит. Очевидно, что есть вещи, которые можно сделать для повышения скорости и безопасности системы, но большая часть этого выходит за рамки этого базового руководства.Если вы хотите повысить производительность, прокомментированные параметры Gzip помогут со сжатием и могут ускорить процесс. Что касается безопасности, добавление следующих трех строк поможет предотвратить вредоносную активность.
add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; режим = блок";
ПОДПИСАТЬСЯ НА НОВОСТИ И RSS
Подпишитесь на RSS и НОВОСТНОЙ БЮЛЛЕТЕНЬ и получайте последние новости Linux, вакансии, советы по карьере и учебные пособия.
Конфигурация сайта
После добавления строк сохраните и выйдите. В корне Nginx есть две папки: для сайтов
и для сайтов
. Доступно сайтов. В
хранятся конфигурации сайтов. с поддержкой сайтов
содержит символические ссылки на файлы конфигурации в с поддержкой сайтов
. Таким образом, включение и отключение сайтов так же просто, как создание и удаление символических ссылок.
Используя текстовый редактор, создайте файл по адресу / etc / nginx / sites-available / yoursite
.Этот файл будет содержать любую конфигурацию для вашего нового веб-сайта PHP 7. Следующий пример содержит разбивку комментариев о том, что делает каждая строка. Это довольно простая конфигурация, но она справится со своей задачей.
server { #Nginx должен прослушивать порт 80 для запросов к yoursite.com слушать 80; имя_сервера yoursite.com; # Создание журналов доступа и ошибок в / var / log / nginx access_log /var/log/nginx/yoursite.access_log main; error_log / var / log / nginx / ваш сайт. error_log info; #Nginx должен искать ваш сайт в / var / www / yoursite корень / var / www / yoursite /; # Домашняя страница вашего сайта - это файл с именем index.php индекс index.php; # Указывает, что Nginx ищет файлы .php расположение ~ \ .php $ { # Если файл не найден, 404 try_files $ uri = 404; # Включить конфигурацию fastcgi Nginx включить /etc/nginx/fastcgi.conf; # Найдите FastCGI Process Manager в этом месте fastcgi_pass unix: / запустить / php / php7.0-fpm.sock; } }
Когда вы создадите этот файл, сохраните его и переместите в каталог с поддержкой сайтов . Оттуда создайте символическую ссылку на только что созданный файл.
# cd / etc / nginx / с поддержкой сайтов # sudo ln -s / etc / nginx / sites-available / yoursite
Безопасность PHP.ini
Безопасность — подвижная цель, и невозможно опередить все возможные угрозы, но всегда полезно заблокировать установка любого нового сервера в максимально возможной степени.Есть несколько простых настроек, которые можно внести в файл конфигурации php.ini
, которые помогут защитить PHP. В текстовом редакторе откройте /etc/php/7.0/fpm/php.ini
. Это огромный файл. Опять же, Vim или что-то еще с функцией поиска, вероятно, лучше всего.
Сначала найдите disable_functions
и добавьте phpinfo, system, mail, exec
в конец строки функций, которые уже существуют. Затем найдите file_uploads
и установите для него значение Off
.Затем найдите sql.safe_mode
и переключите его с на
. Наконец, найдите allow_url_fopen
и установите для него значение Off
. Перед закрытием файла добавьте еще одну строку в конец.
register_globals = Off
Когда все будет готово, сохраните и закройте. Перезагрузите сервер, и он должен быть готов к работе.
# sudo systemctl перезапуск php7.0-fpm # sudo systemctl restart nginx
Куда идти дальше
Как видно, сервер Ubuntu должен иметь возможность запускать большинство веб-сайтов PHP.Любые файлы PHP, помещенные в / var / www / yoursite
, будут запускаться сервером. Сначала он будет искать файл index.php
, и веб-сайт может разветвляться оттуда. Конечно, есть гораздо больше того, что можно сделать для настройки PHP и Nginx для обеспечения скорости, безопасности и практически любых особых ситуаций, но теперь у вас есть хорошая отправная точка.
FreeBSD установить PHP 7.2 с FPM для Nginx
Как установить PHP 7.2 с FPM для веб-сервера Nginx, работающего в операционной системе FreeBSD?
Введение: PHP — это аббревиатура от «PHP: препроцессор гипертекста.«Это язык сценариев общего назначения с открытым исходным кодом. PHP удобен для веб-разработки и запуска популярных программ, таких как MediaWiki, WordPress и других. PHP прост в освоении и позволяет на лету писать динамически генерируемые веб-страницы. На этой странице показано, как установить PHP 7.2 в системе Unix FreeBSD v11.x вместе с веб-сервером Nginx.
FreeBSD устанавливает PHP 7.2 с FPM для Nginx
Процедура установки PHP 7.2 на FreeBSD следующая:
- Обновление дерева портов FreeBSD
- Установите PHP 7.2 бинарный пакет: pkg install nginx
- Установите двоичный пакет Nginx
- Настроить Nginx и PHP 7.2
- Включите службу PHP-fpm во FreeBSD
- Проверить установку
Разберем все шаги подробно.
1. Обновление дерева портов FreeBSD
Вы должны использовать команду portsnap
# portsnap fetch update
2. Установите PHP 7.2 на FreeBSD
Вы можете установить PHP 7.2, используя порты или метод двоичного пакета.Воспользуйтесь одним из следующих способов.
Метод портов
# cd / usr / ports / lang / php72 /
# make install clean
Метод двоичного пакета
Запустите команду pkg, чтобы установить его:
# pkg install php72
Для проверки проверьте версию PHP, введите:
php -v
php --version
3. Установите расширения PHP 7.2 на FreeBSD
Опять же, расширения PHP можно установить с помощью портов или метода pkg.Используйте любой из следующих способов.
Чтобы установить порт, выполните следующую команду и выберите необходимые расширения:
# cd / usr / ports / lang / php72-extensions / && make install clean
ИЛИ добавьте двоичный пакет:
# pkg install php72- extension
Другой вариант — установка отдельных расширений PHP в соответствии с потребностями вашего веб-приложения или программного проекта. Можно искать расширения PHP 7.2 с помощью команды pkg и команды grep / egrep.
# pkg search php72 | grep gd
# pkg search php72 | egrep -i --color 'gd | mysqli | openssl'
# pkg search php72 | egrep --color -i - '- (gd | mysqli | openssl | memcached | opcache | json | mbstring | imagick | xml | zip | composer | igbinary) -'
Просто установите его:
# pkg install php72 -composer php72-gd php72-json
### OR ###
# pkg install php72-composer-1.6.5 php72-gd-7.2.10 php72-json-7.2.10 php72-mbstring-7.2.10 php72-mysqli-7.2.10 php72-opcache-7.2.10 php72-openssl-7.2.10 php72-pecl-imagick-3.4 .3_2 php72-pecl-memcached-3.0.4 php72-xml-7.2.10 php72-zip-7.2.10 php72-pecl-igbinary-2.0.7
4. Настройте PHP-FPM
Отредактируйте файл /usr/local/etc/php-fpm.d/www.conf
# vi /usr/local/etc/php-fpm.d/www.conf
Найдите строку:
listen = 127.0 .0.1: 9000
Обновите его следующим образом:
listen = / var / run / php72-fpm.sock
Раскомментируйте следующую строку:
listen.owner = www
listen.group = www
listen.mode = 0660
Сохраните и закройте файл. Включить службу php-fpm:
# sysrc php_fpm_enable = YES
Команды для запуска, остановки, перезапуска службы php-fpm на сервере FreeBSD:
# service php-fpm stop
# service php-fpm start
# service php-fpm restart
# service php-fpm status
Примечание о конфигурации PHP 7
Вам необходимо установить php.ini с помощью команды php:
# cp -v /usr/local/etc/php.ini-production /usr/local/etc/php.ini
/usr/local/etc/php.ini -production -> /usr/local/etc/php.ini
Затем мы собираемся защитить PHP и настроить его:
# vi /usr/local/etc/php/99-custom.ini
Добавьте следующий конфиг:
display_errors = Выкл. safe_mode = Выкл. safe_mode_exec_dir = safe_mode_allowed_env_vars = PHP_ expose_php = Выкл. log_errors = Вкл. error_log = / var / log / nginx / php.scripts.log register_globals = Выкл. cgi.force_redirect = 0 file_uploads = Вкл. allow_url_fopen = Выкл. sql.safe_mode = Выкл. disable_functions = show_source, system, shell_exec, passthru, proc_open, proc_nice, exec max_execution_time = 60 memory_limit = 60 МБ upload_max_filesize = 2 млн post_max_size = 2 млн cgi.fix_pathinfo = 0 sendmail_path = / usr / sbin / sendmail [email protected] -t
Сохраните и закройте файл. Перезапустите PHP на FreeBSD:
# service php-fpm restart
5. Настройте Nginx для использования PHP 7.2 (PHP-FPM)
Последний шаг — подключение Nginx к сервису PHP-FPM по протоколу FCGI. Отредактируйте свой виртуальный домен или файл nginx.conf следующим образом:
# cd / usr / local / etc / nginx
# vi nginx.conf
OR
# vi vdomains / http.192.168.2.31.conf
Вот обновленный образец файла конфигурации:
сервер { имя_сервера 192.168.2.31; # используйте доменное имя, если оно у вас есть access_log /var/log/nginx/192.168.2.31.access.log; журнал_ошибок / var / log / nginx / 192.(. +? \. php) (/.*) $; if (! -f $ document_root $ fastcgi_script_name) { возврат 404; } # Устранение уязвимостей https://httpoxy.org/ fastcgi_param HTTP_PROXY ""; fastcgi_pass unix: /var/run/php72-fpm.sock; fastcgi_index index.php; # включить настройку fastcgi_param включить fastcgi_params; # Параметр SCRIPT_FILENAME используется для определения PHP FPM # имя скрипта. fastcgi_param SCRIPT_FILENAME $ document_root $ fastcgi_script_name; } }
Перезагрузите или перезапустите сервер Nginx:
# service nginx reload
6.Протестируйте установку
Создайте сценарий PHP под названием test.php в / wwwwiki /
# vi /wwwwiki/test.php
Добавьте следующий код, который показывает информацию о конфигурации PHP с использованием phpinfo:
Сохраните и закройте файл. Установите жесткие права доступа к файлам в DocumentRoot (корень веб-сервера):
# chown -R wwwwiki: wwwwiki / wwwwiki /
# chmod -R 0555 / wwwwiki /
Запустите веб-браузер и проверьте его:
http: //192.168 .2.31 / test.php
http: // ваше-доменное-имя-здесь / test.php
И вот у вас PHP работает должным образом, а Nginx обращается к PHP-FPM через сокет Unix.
Как проверить, что PHP-fpm работает
Используйте команду sockstat во FreeBSD для вывода списка запущенных служб, открытых портов и сокетов unix:
# sockstat -46lu | egrep --color 'www | nginx | php'
Также проверьте файлы журнала, если у вас возникнут проблемы с запуском PHP:
# ls -l / var / log / nginx /
# tail -f / var / log / nginx / 192.168.2.31.error.log
Нажмите, чтобы увеличить изображение
Заключение
В этом руководстве показано, как безопасно установить PHP FPM и настроить его с помощью сокета unix.Теперь у вас есть полностью рабочий сервер Nginx вместе с PHP 7.2 для создания динамических веб-страниц по запросу. В следующей части серии показано, как установить сервер базы данных для создания полнофункционального веб-сервера, работающего в операционной системе FreeBSD.
Полный комплект конфигурации Nginx для WordPress
Глава 09
Последнее обновление 6 мая 2020 г.
В предыдущей главе мы настроили мониторинг сервера и обсудили текущее обслуживание нашего сервера Ubuntu.В этой последней главе я предлагаю полную конфигурацию Nginx, оптимизированную для сайтов WordPress.
Помимо обобщения всей информации из предыдущих 8 глав, я буду использовать передовой опыт, основанный на моем опыте, и различные источники, с которыми я сталкивался за эти годы. Включены следующие примеры доменов, каждый из которых демонстрирует свой сценарий:
- ssl.com — WordPress на HTTPS
- ssl-fastcgi-cache.com — WordPress на HTTPS с кэшированием страниц FastCGI
- мультисайт-поддомен.com — WordPress Multisite с использованием поддоменов
- multisite-subdirectory.com — мультисайт WordPress, использующий подкаталоги
Файлы конфигурации содержат встроенную документацию и структурированы таким образом, чтобы уменьшить количество повторяющихся директив, которые являются общими для нескольких сайтов. Это должно позволить вам быстро создавать новые сайты с разумными настройками по умолчанию, которые можно настроить по мере необходимости.
Использование
Вы можете использовать эти конфигурации в качестве справочника для создания своей собственной конфигурации или напрямую, скопировав их в свой каталог и т.д.
.Выполните следующие действия, чтобы заменить существующую конфигурацию Nginx.
Резервное копирование любой существующей конфигурации:
Судо мв / и т. Д. / Nginx /etc/nginx.backup
Скопируйте один из примеров конфигураций из sites-available
в sites-available / yourdomain.com
:
sudo cp /etc/nginx/sites-available/ssl.com / etc / nginx / sites-available / yourdomain.com`
При необходимости отредактируйте конфигурацию, обращая особое внимание на имя сервера и пути к серверу .Вам также нужно будет создать все каталоги, используемые в конфигурации, и убедиться, что у Nginx есть разрешения на чтение / запись.
Чтобы включить сайт, создайте символическую ссылку на конфигурацию в каталоге с поддержкой сайтов :
sudo ln -s /etc/nginx/sites-available/yourdomain.com /etc/nginx/sites-enabled/yourdomain.com
Проверить конфигурацию:
судо nginx -t
Если конфигурация прошла успешно, перезапустите Nginx:
sudo / etc / init.перезагрузка d / nginx
Предварительный просмотр конфигурации Nginx
Ниже приведен файл конфигурации ssl.com Nginx, содержащийся в пакете. Это должно дать вам хорошее представление о том, каково использовать наши конфигурации.
Предупреждение: Следующая конфигурация Nginx не будет работать сама по себе. Вы заметите, что есть несколько операторов include, которым требуются файлы, содержащиеся в пакете. Загрузите полный пакет конфигурации Nginx
сервер {
# Порты для прослушивания, раскомментируйте один.прослушать 443 ssl http2;
слушайте [::]: 443 ssl http2;
# Имя сервера для прослушивания
имя_сервера ssl.com;
# Путь к корню документа
root /sites/ssl.com/public;
# Пути к файлам сертификатов.
ssl_certificate /etc/letsencrypt/live/ssl.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ssl.com/privkey.pem;
# Файл для использования в качестве индекса
индекс index.php index.html;
# Переопределяет журналы, определенные в nginx.conf, разрешает журналы для каждого сайта.
журнал_доступа / сайты / ssl.com / logs / access.log;
error_log /sites/ssl.com/logs/error.log;
# Правила блокировки сервера по умолчанию
включить global / server / defaults.conf;
# Правила SSL - ssl_certificate и т. Д.
включить global / server / ssl.conf;
место расположения / {
try_files $ uri $ uri / /index.php?$args;
}
расположение ~ \ .php $ {
try_files $ uri = 404;
включить global / fastcgi-params.conf;
# Используйте пул php-fpm, определенный в переменной upstream.
# См. Определение в global / php-pool.conf./robots.txt$ /index.php последний;
}
# Перенаправить http на https
server {
слушать 80;
слушать [::]: 80;
имя_сервера ssl.com www.ssl.com;
возврат 301 https: //ssl.com$request_uri;
}
# Перенаправить www на не-www
server {
слушать 443;
слушать [::]: 443;
имя_сервера www.ssl.com;
возврат 301 https: //ssl.com$request_uri;
}
Это все!
Работа сделана! Я рекомендую вам изучить файлы конфигурации и прочитать документированную конфигурацию, чтобы понять, что происходит.Он должен показаться вам знакомым, поскольку следует тем же соглашениям, которые используются в этом руководстве.
Со временем я буду улучшать конфигурацию и добавлять новые передовые методы по мере их появления. Если у вас есть какие-либо улучшения, дайте мне знать.
На этом мы завершаем эту главу и руководство в целом. Это был долгий путь, но, надеюсь, вы многому научились и стали более уверенно управлять сервером, чем когда начинали. Если у вас есть отзывы, не стесняйтесь писать нам по электронной почте.
PHP, FPM и Nginx | Серверы для хакеров
филиппинских песо
Мы видим, что php 7.0 доступен из коробки:
sudo apt-cache показать php-cli
Вместо этого мы начнем с установки последней версии PHP 7.1 через репозиторий populate PHP.
# Добавить репозиторий и обновить локальный кеш доступных пакетов
sudo add-apt-repository -y ppa: ondrej / php
sudo apt-get update
# Искать пакеты, начинающиеся с PHP,
# мы увидим php7.1- * пакеты доступны
sudo apt-cache search -n php *
# Установить PHP-FPM, PHP-CLI и модули
sudo apt-get install -y php7.1-fpm php7.1-cli php7.1-curl php7.1-mysql php7.1-sqlite3 \
php7.1-gd php7.1-xml php7.1-mcrypt php7.1-mbstring php7.1-iconv
После его установки мы можем увидеть некоторые похожие соглашения от Nginx (и другого программного обеспечения в Debian / Ubuntu).
SAPI
PHP в Debian / Ubuntu разделен по версии и интерфейсу программирования серверных приложений. SAPI — это контекст, в котором выполняется PHP.Наиболее распространены:
- cli — при запуске из командной строки
- fpm — при выполнении веб-запроса через fastcgi
- apache2 — при запуске в Apache mod-php
Конфигурация
Мы можем увидеть разделение конфигурации между версией и SAPI, проверив пути к файлам в пределах / и т. Д.
:
компакт-диск / etc / php
ls -lah
> ... 5.6 /
> ... 7.0 /
> ... 7.1 /
cd 7.1
ls -lah
> ... cli /
> ... fpm /
В каждом каталоге SAPI (например,грамм. cli или fpm) существует файл php.ini
и каталог conf.d
. Мы можем редактировать php.ini
для каждого SAPI и использовать символические ссылки в каталоге conf.d
для включения или отключения модулей для каждого SAPI.
Модули
PHP в Debian / Ubuntu использует символические ссылки, чтобы решить, какие из них загружаются в SAPI. Все файлы конфигурации модуля находятся в / etc / php /
, а затем загружаются через символические ссылки в / etc / php /
.
Nginx
После установки PHP мы можем настроить Nginx для отправки запросов PHP на PHP-FPM:
сервер {
слушать 80;
корень / вар / www / html;
имя сервера _;
index index.html index.htm index.debian-default.html index.php;
место расположения / {
try_files $ uri $ uri / /index.php$is_args$args;
}
расположение ~ \ .php $ {
включить сниппеты / fastcgi-php.conf;
fastcgi_pass unix: /run/php/php7.1-fpm.sock;
}
}
После завершения редактирования мы можем протестировать Nginx и перезагрузить:
судо nginx -t
sudo service nginx перезагрузить
В видео я покажу вам некоторое поведение в отношении вышеуказанной конфигурации.В частности, конфигурация try_files
позволяет использовать «красивые URL-адреса», то есть нам не нужно добавлять index.php
в URL-адрес в нашем браузере, чтобы Nginx мог использовать файл index.php
.
Приведенный выше файл конфигурации будет искать файлы php в каталоге / var / www / html
и отправлять запросы в PHP-FPM, если запрашивается файл с расширением .php
.
Как установить стек Nginx, MySQL, PHP v7 (LEMP) на CentOS 7
VPS
access_time
12 ноября 2019 г.
hourglass_empty
4min Read
person_outline
Edgaras G.
В этом руководстве вы узнаете, как установить стек LEMP на сервер CentOS 7. Это одна из самых популярных групп программного обеспечения, которое вы можете использовать для создания своего веб-сайта. Давайте приступим к делу.
Что такое LEMP?
LEMP — это набор программ, которые работают вместе для обслуживания динамических веб-сайтов или веб-приложений. Он состоит из L inux (операционная система сервера), E NginX / Nginx (приложение веб-сервера), M ySQL (система управления базами данных) и P HP (язык сценариев).
LEMP — популярная альтернатива LAMP, которая использует Apache вместо Nginx и ориентирована на обслуживание статических веб-страниц. Существуют также WAMP и MAMP, заменяющие Linux на Windows и macOS.
Прежде чем мы начнем обучение по установке LEMP, убедитесь, что ваш сервер или VPS работает на CentOS 7. Если вы используете тарифный план Hostinger VPS, установите CentOS с вкладки Servers в hPanel.
Как установить стек LEMP
Теперь, когда Linux установлен, мы проведем вас через установку Nginx, MySQL и PHP.
Это руководство требует, чтобы вы имели root-доступ и использовали SSH-клиент, например PuTTY (Windows) или терминальную оболочку (Linux, macOS), для подключения к вашему VPS.
Шаг 1. Установка Nginx на CentOS 7
- Поскольку Nginx недоступен в репозиториях CentOS по умолчанию, нам нужно сначала установить репозиторий EPEL, выполнив следующую команду:
yum install epel-release -y
- Далее мы будем установить сам Nginx:
yum install nginx -y
- После завершения установки введите следующие строки одну за другой для активации Nginx:
systemctl start nginx systemctl enable nginx
- Проверьте, работает ли Nginx, посетив общедоступный IP-адрес вашего сервера.Ваша страница должна выглядеть так:
Используйте команду sudo , если у вас нет корневого доступа
Шаг 2: Установка MySQL (MariaDB)
Мы собираемся установить MySQL с помощью службы MariaDB, сообщества форк MySQL.
- MariaDB включен в репозитории CentOS по умолчанию, поэтому мы можем просто запустить команду y um для его установки:
yum install mariadb-server mariadb -y
- После завершения установки включите и запустите Служба MariaDB:
systemctl start mariadb systemctl enable mariadb
- Защитите установку, выполнив следующую команду:
mysql_secure_installation
MariaDB запросит у вас пароль root, которого у вас нет, потому что вы только что установили MySQL.По этой причине просто нажмите Enter.
- В следующем окне вас спросят, хотите ли вы установить пароль root. Введите Y и следуйте инструкциям:
Введите текущий пароль для root (введите, если нет): ОК, пароль успешно использован, идем дальше… Установка пароля root гарантирует, что никто не сможет войти в MariaDB пользователь root без надлежащей авторизации. Новый пароль: Повторно введите новый пароль: Пароль успешно обновлен! Перезагрузка таблиц привилегий .. ... Успех!
- Скрипт вернет несколько контрольных вопросов.Мы рекомендуем вам нажать Y для всех из них.
Удалить анонимных пользователей? [Д / Н] Запретить удаленный вход root? [Д / Н] Удалить тестовую базу данных и получить к ней доступ? [Д / Н] Обновить таблицы привилегий сейчас? [Y / n]
После завершения настройки перейдите к установке PHP.
Шаг 3: Установка PHP v7.3
- Нам нужно загрузить и установить дополнительный репозиторий CentOS, который содержит необходимые пакеты для PHP v7.3. Выполните следующие команды одну за другой:
wget http: // rpms.remirepo.net/enterprise/remi-release-7.rpm rpm -Uvh remi-release-7.rpm
- Включить репозиторий php73, который по умолчанию отключен:
yum install yum-utils -y yum-config-manager --enable remi-php73
- После этого установите пакет PHP:
yum --enablerepo = remi, remi-php73 install php-fpm php-common
При запросе разрешения на установку просто нажмите Г .
- Теперь установите общие модули PHP, чтобы убедиться, что служба работает правильно:
yum --enablerepo = remi, remi-php73 install php-opcache php-pecl-apcu php-cli php-pear php-pdo php-mysqlnd php-pgsql php-pecl-mongodb php-pecl-redis php-pecl-memcache php-pecl-memcached php-gd php-mbstring php-mcrypt php-xml
Шаг 4: Настройка Nginx для работы с PHP 7
Последнее, что нам нужно сделать, это настроить Nginx для работы с PHP 7.Вот как это сделать:
- Создайте новый файл конфигурации Nginx, запустив текстовый редактор nano:
nano /etc/nginx/conf.d/default.conf
Затем вставьте этот код:
server { слушать 80; server_name your_server_ip; # обратите внимание, что эти строки взяты из блока "location /" корень / usr / share / nginx / html; index index.php index.html index.htm; место расположения / { try_files $ uri $ uri / = 404; } error_page 404 /404.html; error_page 500 502 503 504 / 50x.html; location = /50x.html { корень / usr / share / nginx / html; } местоположение ~ .php $ { try_files $ uri = 404; fastcgi_pass unix: /var/run/php-fpm/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $ document_root $ fastcgi_script_name; включить fastcgi_params; } }
ВАЖНО! Замените your_server_ip фактическим IP-адресом сервера.
- Сохраните файл, нажав CTRL + X (или CMD + X для пользователей Mac).Затем перезапустите Nginx, чтобы изменения вступили в силу:
systemctl restart nginx
- Откройте PHP-FPM Конфигурация :
nano /etc/php-fpm.d/www.conf
Найдите и измените эти строки:
- user = apache to user = nginx
- group = apache to group = nginx
- listen.owner = никто от до listen.owner = nginx
- listen.group = никто слушать.group = nginx
- После этого добавьте следующую строку под ; listen = 127.0.0.1:9000
listen = /var/run/php-fpm/php-fpm.sock
- Сохраните файл нажав CTRL + X . Наконец, запустите PHP-FPM и включите его при загрузке:
systemctl start php-fpm.service systemctl enable php-fpm.service
Заключение
Стек LEMP (Linux, ENginx, MySQL, PHP) — идеальный выбор для обслуживания динамических веб-страниц или веб-приложений.К счастью, процесс установки прост. Обладая базовыми знаниями интерфейса командной строки, вы можете легко настроить все необходимые программы на своем VPS.
Из этой статьи вы узнали, как установить LEMP на CentOS 7. В заключение, давайте еще раз рассмотрим все шаги:
- Получите репозиторий EPEL и установите Nginx на свой сервер.
- Установите и настройте MariaDB
- Установите PHP и все его общие пакеты.
- Настройте Nginx для работы с PHP.
Удачи и не стесняйтесь оставлять комментарии, если у вас есть вопросы!
Советы и рекомендации по настройке и оптимизации Nginx и PHP-FPM — если не верно, то неверно
Я написал перед руководством Как установить Nginx / PHP-FPM на Fedora 29/28, CentOS / RHEL 7.5 / 6.10, но это руководство является просто руководством по установке, и во многих случаях базовая конфигурация Nginx и PHP-FPM достаточно хороша, но если вы хотите выжать все силы из своего VPS или веб-сервера / серверов и немного упростить работу по обслуживанию, тогда это руководство может оказаться полезным.Эти советы полностью основаны на моем собственном опыте, поэтому они могут не быть абсолютной правдой, а в некоторых ситуациях совершенно другая конфигурация может работать лучше. Также хорошо не забывать оставлять ресурсы для других служб, даже если вы запускаете пример, MySQL, PostgreSQL, MongoDB, почтовый сервер, сервер имен и / или сервер SSH на том же компьютере.
И да, поехали…
Советы и рекомендации по настройке и оптимизации Nginx
Nginx Совет 1. — Организация файлов конфигурации Nginx
Обычно файлы конфигурации Nginx расположены по пути / etc / nginx .
Один хороший способ организовать файлы конфигурации — использовать Debian / Ubuntu Apache style setup:
## Основной файл конфигурации ##
/etc/nginx/nginx.conf
## Файлы конфигурации виртуального хоста на ##
/ и т.д. / nginx / сайты-доступные /
/ и т. д. / nginx / сайты-включенные /
## Другие файлы конфигурации (при необходимости) ##
/etc/nginx/conf.d/
Файлы
Virtualhost имеют 2 пути, потому что каталог , доступный для сайтов , может содержать что угодно, например, тестовые конфигурации, только что скопированные / созданные конфигурации, старые конфигурации и так далее.А с поддержкой сайтов содержит только реально включенные конфигурации, на самом деле только символические ссылки на каталог с доступными сайтами.
Не забудьте добавить в конец файла nginx.conf следующие include:
## Загрузить файлы конфигурации виртуального хоста. ##
включить / etc / nginx / sites-enabled / *;
## Загрузите другие конфиги из conf.d / ##
включить /etc/nginx/conf.d/*;
Nginx Совет 2. — Определите Nginx worker_processes и worker_connections
Настройка по умолчанию подходит для worker_processes и worker_connections , но эти значения можно немного оптимизировать:
max_clients = worker_processes * worker_connections
Базовая настройка Just Nginx может обрабатывать сотни одновременных подключений:
worker_processes 1;
worker_connections 1024;
Обычно 1000 одновременных подключений на один сервер — это хорошо, но иногда другие части, такие как диски на сервере, могут быть медленными, и это приводит к блокировке Nginx при операциях ввода-вывода.Чтобы избежать блокировки, используйте следующую настройку: один worker_precess / на ядро процессора , например:
Рабочие процессы
worker_processes [количество ядер процессора];
Чтобы проверить, сколько у вас ядер процессора, выполните следующую команду:
cat / proc / cpuinfo | процессор grep
процессор: 0
процессор: 1
процессор: 2
процессор: 3
Итак, вот 4 ядра, и окончательная настройка worker_processes может быть следующей:
worker_processes 4;
Рабочие соединения
Лично я придерживаюсь 1024 рабочих соединений, потому что у меня нет причин повышать это значение.Но если, например, 4096 соединений в секунду недостаточно, можно попытаться удвоить это количество и установить 2048 соединений на процесс.
Окончательная настройка worker_processes может быть следующей:
worker_connections 1024;
Я видел некоторые конфигурации, в которых администраторы серверов используют слишком много Apache, и думаю, что если я установлю Nginx worker_processes на 50 и worker_connections на 20000, то мой сервер сможет обрабатывать весь трафик один раз, что мы получаем ежемесячно… но да, это неправда.Это просто пустая трата ресурсов и может вызвать серьезные проблемы …
Nginx Совет 3. — Скрыть токены сервера Nginx / Скрыть номер версии Nginx
Это хорошо по соображениям безопасности: скрыть токены сервера / скрыть номер версии Nginx, особенно если запущена какая-то устаревшая версия Nginx. Это очень просто сделать, просто установите server_tokens с в разделе http / server / location , например:
server_tokens выключен;
Nginx Совет 4.- Максимальный размер тела запроса / загрузки Nginx (client_max_body_size)
Если вы хотите разрешить пользователям загружать что-то или загружать что-то лично по HTTP, вам, возможно, следует на увеличить размер сообщения . Это можно сделать с помощью значения client_max_body_size , которое находится в разделе http / server / location . По умолчанию это 1 МБ, но можно установить, например, 20 МБ, а также увеличить размер буфера со следующей конфигурацией:
client_max_body_size 20м;
client_body_buffer_size 128 КБ;
Если вы получаете следующую ошибку, значит, вы знаете, что client_max_body_size слишком мало:
«Request Entity Too Large» (413)
Nginx Совет 5.- Nginx Cache Control для статических файлов (директивы управления кешем браузера)
Кэширование браузера импортируется, если вы хотите сэкономить ресурсы и пропускную способность. Это простая установка с Nginx. Ниже приводится очень простая настройка, при которой отключено ведение журнала (журнал доступа и журнал не найден), а для заголовков истечения срока действия установлено значение 360 дней.
расположение ~ * \. (jpg | jpeg | gif | png | css | js | ico | xml) $ {
access_log off;
log_not_found off;
истекает 360 дней;
}
Если вам нужны более сложные заголовки или другое истечение срока действия по типам файлов, вы можете настроить их отдельно.
Nginx Совет 6. — Nginx передает PHP-запросы в PHP-FPM
Здесь вы можете использовать стек tpc / ip по умолчанию или напрямую использовать соединение через сокет Unix. Вы также должны настроить PHP-FPM для прослушивания точно такого же ip: порта или сокета unix (с сокетом Unix также должно быть правильное разрешение на сокет). По умолчанию используется ip: port (127.0.0.1:9000), вы, конечно, можете изменить IP-адреса и порты, которые прослушивает PHP-FPM. Вот очень простая конфигурация с закомментированным примером сокета Unix:
# Передать скрипты PHP в PHP-FPM
расположение ~ * \.php $ {
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
#fastcgi_pass unix: /var/run/php-fpm/php-fpm.sock;
включить fastcgi_params;
fastcgi_param SCRIPT_FILENAME $ document_root $ fastcgi_script_name;
fastcgi_param SCRIPT_NAME $ fastcgi_script_name;
}
Также возможно запустить PHP-FPM на другом сервере и Nginx на другом.
Nginx Совет 7. — Предотвратить (запретить) доступ к скрытым файлам с Nginx
Очень часто в корневом каталоге сервера или других общедоступных каталогах есть скрытые файлы, которые начинаются с точки (.) и обычно они не предназначены для пользователей сайта. Общие каталоги могут содержать файлы и каталоги управления версиями, например .svn , некоторые файлы свойств IDE и файлы .htaccess . После запретите доступ и отключите ведение журнала для всех скрытых файлов.
расположение ~ / \. {
access_log off;
log_not_found off;
все отрицать;
}
Советы и рекомендации по настройке PHP-FPM
PHP-FPM Совет 1. — Конфигурационные файлы PHP-FPM
Обычно файлы конфигурации PHP-FPM находятся в каталоге / etc / php-fpm.conf и путь /etc/php-fpm.d . Обычно это отличный старт, и все конфигурации пула идут в каталог /etc/php-fpm.d . Вам необходимо добавить следующую строку в ваш файл php-fpm.conf :
включить = / etc / php-fpm.d / *. conf
PHP-FPM Совет 2. — Настройки глобальной конфигурации PHP-FPM
Установите Emergency_restart_threshold , Emergency_restart_interval и process_control_timeout .Значения по умолчанию для этих параметров полностью отключены, но я думаю, что лучше использовать эти параметры в следующем примере:
Emergency_restart_threshold 10
Emergency_restart_interval 1м
process_control_timeout 10 с
Что это значит? Итак, если 10 дочерних процессов PHP-FPM завершаются с SIGSEGV или SIGBUS в течение 1 минуты, то PHP-FPM перезапускается автоматически. Эта конфигурация также устанавливает 10-секундный лимит времени для дочерних процессов, чтобы они ожидали реакции на сигналы от мастера.
PHP-FPM Совет 3. — Конфигурация пулов PHP-FPM
С помощью PHP-FPM можно использовать разные пулы для разных сайтов и очень точно распределять ресурсы и даже использовать разных пользователей и группы для каждого пула. Ниже приведен пример структуры файлов конфигурации для пулов PHP-FPM для трех разных сайтов (или фактически трех разных частей одного и того же сайта):
/etc/php-fpm.d/site.conf /etc/php-fpm.d/blog.conf /etc/php-fpm.d/forums.conf
Только пример конфигурации для каждого пула:
/ etc / php-fpm.d / site.conf
[сайт]
слушайте = 127.0.0.1:9000
пользователь = сайт
группа = сайт
request_slowlog_timeout = 5 с
slowlog = /var/log/php-fpm/slowlog-site.log
listen.allowed_clients = 127.0.0.1
pm = динамический
pm.max_children = 5
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 200
listen.backlog = -1
pm.status_path = / статус
request_terminate_timeout = 120 с
rlimit_files = 131072
rlimit_core = неограниченно
catch_workers_output = да
env [HOSTNAME] = $ HOSTNAME
env [TMP] = / tmp
env [TMPDIR] = / tmp
env [TEMP] = / tmp
/ и т.д. / php-fpm.d / blog.conf
[блог]
слушайте = 127.0.0.1:9001
user = blog
группа = блог
request_slowlog_timeout = 5 с
slowlog = /var/log/php-fpm/slowlog-blog.log
listen.allowed_clients = 127.0.0.1
pm = динамический
pm.max_children = 4
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_requests = 200
listen.backlog = -1
pm.status_path = / статус
request_terminate_timeout = 120 с
rlimit_files = 131072
rlimit_core = неограниченно
catch_workers_output = да
env [HOSTNAME] = $ HOSTNAME
env [TMP] = / tmp
env [TMPDIR] = / tmp
env [TEMP] = / tmp
/ и т.д. / php-fpm.d / forum.conf
[форумы]
слушайте = 127.0.0.1:9002
пользователь = форумы
группа = форумы
request_slowlog_timeout = 5 с
slowlog = /var/log/php-fpm/slowlog-forums.log
listen.allowed_clients = 127.0.0.1
pm = динамический
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 400
listen.backlog = -1
pm.status_path = / статус
request_terminate_timeout = 120 с
rlimit_files = 131072
rlimit_core = неограниченно
catch_workers_output = да
env [HOSTNAME] = $ HOSTNAME
env [TMP] = / tmp
env [TMPDIR] = / tmp
env [TEMP] = / tmp
Итак, это всего лишь пример того, как настроить несколько пулов разного размера.
PHP-FPM Совет 4. — Конфигурация диспетчера процессов пула PHP-FPM (pm)
Лучший способ использовать диспетчер процессов PHP-FPM — использовать динамическое управление процессами, поэтому процессы PHP-FPM запускаются только при необходимости. Это почти такая же настройка стиля, как настройка Nginx worker_processes и worker_connections. Так что очень высокие значения не обязательно означают что-то хорошее. Каждый процесс потребляет память, и, конечно, если сайт имеет очень высокий трафик и много памяти сервера, тогда более высокие значения являются правильным выбором, но серверы, такие как VPS (виртуальные частные серверы), обычно ограничены 256 МБ, 512 МБ, 1024 МБ.Этого небольшого объема оперативной памяти достаточно для обработки даже очень высокого трафика (даже десятков запросов в секунду), если его использовать с умом.
Хорошо проверить, сколько процессов PHP-FPM сервер может легко обработать, сначала запустите Nginx и PHP-FPM и загрузите несколько страниц PHP, предпочтительно все самые тяжелые страницы. Затем проверьте использование памяти в соответствии с примером процесса PHP-FPM с помощью команды Linux top или htop . Предположим, что на сервере 512 МБ памяти и 220 МБ можно использовать для PHP-FPM, каждый процесс использует 24 МБ ОЗУ (некоторые огромные системы управления контентом с плагинами могут легко использовать 20-40 МБ / на запрос страницы PHP или даже больше) .Затем просто вычислите значение max_children сервера:
220/24 = 9,17
Итак, хорошее значение pm.max_children равно 9. Это основано только на быстром усреднении, и позже это может быть что-то еще, когда вы увидите более длительное использование памяти для каждого процесса. После быстрого тестирования намного проще установить значение pm.start_servers , значение pm.min_spare_servers и значение pm.max_spare_servers .
Окончательный пример конфигурации может быть следующей:
вечера.max_children = 9
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 200
Максимальное количество запросов на процесс по умолчанию не ограничено, но лучше установить небольшое значение, например 200, чтобы избежать некоторых проблем с памятью. Этот стиль настройки может обрабатывать большое количество запросов, даже если количество кажется небольшим.