Как установить Nginx с PHP + MySQL (LEMP) на Debian 9
Это руководство существует для этих версий ОС
- Debian 7 (хлюпающий)
На этой странице
- Предварительное примечание
- Обновление системы Debian
- Установите Nginx
- Установите MySQL или MariaDB
- Установите MySQL
- Установить MariaDB
- Создайте самозаверяющий SSL-сертификат
- Используйте бесплатный SSL-сертификат Lets Encrypt
- SSH-вход
- Вход в MySQL
В этом руководстве показано, как установить веб-сервер Nginx на Debian 9 (Stretch). Nginx (произносится как «engine x») — это бесплатный высокопроизводительный HTTP-сервер с открытым исходным кодом. Nginx известен своей стабильностью, богатым набором функций, простой конфигурацией и низким потреблением ресурсов. В этом руководстве показана установка Nginx с поддержкой PHP (через PHP-FPM), а также MySQL и MariaDB. Эту настройку часто называют LEMP=Linux + nginx (произносится \engine x\) + MySQL + PHP) .
Предварительное примечание
В этом руководстве я использую имя хоста server1.example.com с IP-адресом 192.168.1.100. Эти настройки могут отличаться для вас, поэтому вам придется заменить их там, где это необходимо. У вас должен быть сервер Debian 9. Я буду использовать минимальный сервер Debian в качестве базовой системы для этого руководства.
Обновите систему Debian
Рекомендуется обновить списки пакетов и установить все ожидающие обновления, прежде чем мы начнем настройку Nginx. Выполните следующие команды, чтобы установить все ожидающие обновления.
apt-get update
apt-get upgrade -yПозже я буду использовать редактор nano для редактирования файлов конфигурации. Nano можно установить с помощью этой команды:
apt-get -y install nano
Установите Nginx
Nginx доступен в виде пакета для Debian 9, который можно установить с помощью этой команды:
apt-get -y install nginx
Теперь запустите веб-сервер Nginx:
systemctl start nginx.service
Введите IP-адрес или имя хоста вашего веб-сервера в браузере (например, http://192.168.1.100), и вы увидите следующую страницу:
Корень документа nginx по умолчанию в Debian Linux — /var/www/html.
Установите MySQL или MariaDB
На этом этапе я покажу вам, как установить MySQL или MariaDB. Вы можете свободно выбирать, какую систему баз данных вы предпочитаете. Просто убедитесь, что вы устанавливаете только один механизм базы данных, а не MySQL и MariaDB вместе.
Установить MySQL
Пакеты MySQL для Debian 9 можно получить напрямую у Oracle. Oracle предоставляет пакет репозитория MySQL, который интегрирует репозиторий Oracle MySQL в Debian, чтобы мы могли устанавливать и обновлять MySQL с помощью apt. Получите пакет репозитория MySQL apt здесь на случай, если загрузка wget ниже не удалась из-за изменений в URL-адресе загрузки.
cd /tmp
wget https://dev.mysql.com/get/mysql-apt-config_0.8.9-1_all.deb
dpkg -i mysql-apt-config_0.8.9-1_all.debВыберите для настройки OK в списке, затем сфокусируйте кнопку OK в нижнем колонтитуле и нажмите Enter. Будет выбрана текущая стабильная версия MySQL 5.7.
Теперь обновите список пакетов и установите пакет сервера и клиента MySQL.
apt-get update
apt-get -y install mysql-community-client mysql-community-serverУстановщик MySQL попросит вас установить пароль для пользователя root MySQL. Выберите длинный и безопасный пароль, так как этот пароль обеспечивает полный административный доступ к базе данных MySQL.
Повторно введите пароль по запросу.
Установить MariaDB
Чтобы установить MariaDB, мы запускаем:
apt-get -y install mariadb-server mariadb-client
В отличие от установщика MySQL, установщик MariaDB не устанавливает пароль root во время установки. Чтобы защитить установку MariaDB, удалите анонимного пользователя и отключите тестовую базу данных, выполните следующую команду:
mysql_secure_installation
Ответьте на вопросы следующим образом:
Change the root password? [Y/n] <-- y
New password: <-- Enter a new MySQL root password
Re-enter new password: <-- Repeat the MySQL root password
Remove anonymous users? [Y/n] <-- y
Disallow root login remotely? [Y/n] <-- y
Remove test database and access to it? [Y/n] <-- y
Reload privilege tables now? [Y/n] <-- yУстановка PHP
Мы можем заставить PHP работать в nginx через PHP-FPM (PHP FastCGI Process Manager). Это альтернативная реализация PHP FastCGI с некоторыми дополнительными функциями, полезными для сайтов любого размера, особенно для загруженных сайтов. Установите PHP 7 следующим образом:
apt-get -y install php7.0-fpm
PHP-FPM — это процесс-демон (с файлом модуля systemd php7.0-fpm.service), который запускает сервер FastCGI в сокете /var/run/php/php7.0-fpm.sock.
Настройка Nginx
Конфигурация Nginx находится в файле /etc/nginx/nginx.conf, который мы сейчас открываем:
nano /etc/nginx/nginx.conf
Конфигурация проста для понимания (подробнее о ней можно узнать здесь: https://www.nginx.com/resources/wiki/)
Сначала установите для keepalive_timeout разумное значение, например 2 секунды:
[...]
keepalive_timeout 2;
[...]Виртуальные хосты определяются в контейнерах server {}. Виртуальный хост по умолчанию определен в файле /etc/nginx/sites-available/default — давайте изменим его следующим образом:
nano /etc/nginx/sites-available/default
[...] server {
listen 80 default_server;
listen [::]:80 default_server;
# SSL configuration
#
# listen 443 ssl default_server;
# listen [::]:443 ssl default_server;
#
# Note: You should disable gzip for SSL traffic.
# See: https://bugs.debian.org/773332
#
# Read up on ssl_ciphers to ensure a secure configuration.
# See: https://bugs.debian.org/765782
#
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
# include snippets/snakeoil.conf;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.php index.html index.htm index.nginx-debian.html;
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
# pass PHP scripts to FastCGI server
#
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# With php-fpm (or other unix sockets):
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
# With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
deny all;
}
} [...]имя сервера _; делает это общим виртуальным хостом по умолчанию (конечно, вы также можете указать здесь имя хоста, например www.example.com).
Я добавил index.php в строку index. корень /var/www/html; означает, что корнем документа является каталог /var/www/html.
Важной частью PHP является строфа location ~ \.php${}. Раскомментируйте его, как показано выше, чтобы включить его. Включены две строки fastcgi_pass, раскомментируйте только одну для файла php-7.0-fpm.sock.
Теперь сохраните файл и перезагрузите Nginx:
systemctl reload nginx.service
Затем откройте /etc/php/7.0/fpm/php.ini...
nano /etc/php/7.0/fpm/php.ini
... и установите cgi.fix_pathinfo=0:
[...] ; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's ; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok ; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting ; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting ; of zero causes PHP to behave as before. Default is 1. You should fix your scripts ; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. ; http://php.net/cgi.fix-pathinfo cgi.fix_pathinfo=0 [...]
... тогда вы можете увеличить лимит POST и лимит загрузки файлов:
post_max_size = 25M
upload_max_filesize = 20MЕсли вы планируете загружать большие файлы с помощью PHP, вам следует увеличить значения даже до 500 МБ или более. M здесь означает мегабайты.
Наконец, вы можете установить часовой пояс в соответствии с вашим местным часовым поясом. В моем случае часовой пояс:
date.timezone = 'Europe/Berlin'
Вы можете найти список поддерживаемых часовых поясов здесь.
Перезагрузите PHP-FPM, чтобы применить изменения:
systemctl reload php7.0-fpm.service
Теперь создайте следующий файл PHP в корне документа /var/www/html/:
nano /var/www/html/info.php
<?php phpinfo();
Теперь мы вызываем этот файл в браузере (например, http://192.168.1.100/info.php):
Как видите, PHP 7 работает и работает через FPM/FastCGI, как показано в строке API сервера. Если вы прокрутите дальше вниз, вы увидите все модули, которые уже включены в PHP. MySQL там не указан, что означает, что у нас пока нет поддержки MariaDB/MySQL в PHP.
Получение поддержки MySQL/MariaDB в PHP
Чтобы получить поддержку MySQL в PHP, мы можем установить пакет php7.0-mysqlnd. Это хорошая идея, чтобы установить некоторые другие модули PHP, а также они могут вам понадобиться для ваших приложений. Вы можете искать доступные модули PHP следующим образом:
apt-cache search php7.0
Выберите те, которые вам нужны, и установите их следующим образом:
apt-get -y install php7.0-mysqlnd php7.0-curl php7.0-gd php7.0-intl php-pear php-imagick php7.0-imap php7.0-mcrypt php-memcache php7.0-intl php7.0-pspell php7.0-recode php7.0-sqlite3 php7.0-tidy php7.0-xmlrpc php7.0-xsl
Теперь перезагрузите PHP-FPM:
systemctl reload php7.0-fpm.service
Теперь перезагрузите http://192.168.1.100/info.php в браузере и снова прокрутите вниз до раздела модулей. Теперь вы должны найти там много новых модулей, включая модуль MySQLi и MySQLnd:
Заставить PHP-FPM использовать TCP-соединение (необязательно)
По умолчанию PHP-FPM прослушивает сокет /var/run/php/php7.0-fpm.sock, и это рекомендуемый и самый быстрый способ подключения PHP к Nginx. Однако могут быть настройки, в которых вы хотите разрешить Nginx подключаться к PHP по сети. Можно заставить PHP-FPM использовать TCP-соединение. Для этого откройте /etc/php/7.0/fpm/pool.d/www.conf...
nano /etc/php/7.0/fpm/pool.d/www.conf
... и сделайте так, чтобы строка прослушивания выглядела следующим образом:
[...] ;listen = /var/run/php5-fpm.sock listen = 127.0.0.1:9000 [...]
Это заставит PHP-FPM прослушивать порт 9000 на IP 127.0.0.1 (localhost). Убедитесь, что вы используете порт, который не используется в вашей системе.
Затем перезагрузите PHP-FPM:
systemctl reload php7.0-fpm.service
Затем просмотрите конфигурацию Nginx и все ваши виртуальные хосты и измените строку fastcgi_pass unix:/var/run/php7.0-fpm.sock; на fastcgi_pass 127.0.0.1:9000; например, как это:
nano /etc/nginx/sites-available/default
[...]
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# With php-fpm (or other unix sockets):
# fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
# With php-cgi (or other tcp sockets):
fastcgi_pass 127.0.0.1:9000;
} [...]Наконец, перезагрузите Nginx:
systemctl reload nginx.service
Включить SSL и HTTP/2 в Nginx
Сегодня большинство веб-сайтов используют SSL (TLS) для обеспечения безопасного доступа. В этой главе я покажу вам, как создать сертификат SSL и как активировать SSL в Nginx. Вы можете использовать самозаверяющий SSL-сертификат или запросить официально подписанный SSL-сертификат у Lets encrypt. SSL-сертификаты Let#s encrypt доступны бесплатно, но у вас должно быть действительное доменное имя, которое уже указывает на ваш сервер в DNS. Если у вас еще нет доменного имени или ваш сервер находится в локальной сети и недоступен извне, используйте самозаверяющий SSL-сертификат. Выполните шаги для самозаверяющего SSL-сертификата или сертификата Lets encrypt ниже, но не оба.
Создайте самозаверяющий SSL-сертификат
Создайте файл ключа SSL с помощью команды OpenSSL:
openssl genrsa -out /etc/ssl/private/nginx.key 4096
Затем создайте самозаверяющий SSL-сертификат:
openssl req -new -x509 -key /etc/ssl/private/nginx.key -out /etc/ssl/certs/nginx.pem -days 3650
Команда запросит такие данные, как страна, штат, город, название компании и доменное имя.
Активируйте самозаверяющий SSL-сертификат в Nginx. Для этого снова отредактируйте файл nginx.conf:
нано /etc/nginx/сайты-доступны/по умолчанию
и сделать серверную часть такой:
server {
listen 80 default_server;
listen [::]:80 default_server;
# SSL configuration
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
ssl on;
ssl_certificate_key /etc/ssl/private/nginx.key;
ssl_certificate /etc/ssl/certs/nginx.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;
# Note: You should disable gzip for SSL traffic.
# See: https://bugs.debian.org/773332
#
# Read up on ssl_ciphers to ensure a secure configuration.
# See: https://bugs.debian.org/765782
#
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
# include snippets/snakeoil.conf;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.php index.html index.htm index.nginx-debian.html;
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
# pass PHP scripts to FastCGI server
#
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# With php-fpm (or other unix sockets):
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
# With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
deny all;
}
}Перезапустите Nginx, чтобы применить изменения.
systemctl restart nginx.service
Теперь откройте URL-адрес https вашего сервера в браузере, например. https://192.169.1.100/. Вы получите предупреждение системы безопасности, которое вам нужно принять, чтобы продолжить. После этого вы увидите стартовую страницу Nginx, значок предупреждения в адресной строке браузера указывает на то, что мы используем самозаверяющий сертификат SSL.
Используйте бесплатный SSL-сертификат Lets Encrypt
В этой главе я опишу, как защитить ваш сервер Nginx с помощью бесплатного SSL-сертификата Lets encrypt. Обязательным условием является то, что у вас есть доменное имя, которое указывает на IP-адрес сервера, на котором вы устанавливаете Nginx в данный момент.
Установите Certbot, клиент Lets encrypt, который используется для получения бесплатного сертификата SSL.
apt-get -y install certbot python-certbot-nginx
Отредактируйте файл конфигурации веб-сайта /etc/nginx/sites-available/default и укажите свои доменные имена в строке server_name:
nano /etc/nginx/sites-available/default
После редактирования строка должна выглядеть так:
server_name example.com;
Замените example.com своим доменным именем. Если у вас несколько доменных имен или поддоменов, добавьте их через пробел.
server_name example.com www.example.com otherdomain.tld;
Теперь мы запрашиваем SSL-сертификат у let encrypt с помощью плагина nginx от Certbot.
certbot --nginx -d example.com
Можно добавить несколько доменов, повторив параметр -d. Пример:
certbot certonly --webroot -d example.com -d www.example.com
Certbot запросит у вас адрес электронной почты, на который будут отправляться уведомления о продлении. Введите действительный адрес электронной почты здесь:
Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel):
Примите условия лицензии, введя A.
-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: AВот следующий диалог, который запрашивает SSL-сертификат. Я добавил свои ответы красным.
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for example.com
http-01 challenge for www.example.comSelect the webroot for example.com:
-------------------------------------------------------------------------------
1: Enter a new webroot
-------------------------------------------------------------------------------
Press 1 [enter] to confirm the selection (press 'c' to cancel): 1
Input the webroot for example.com: (Enter 'c' to cancel):/var/www/htmlSelect the webroot for www.example.com:
-------------------------------------------------------------------------------
1: Enter a new webroot
2: /var/www/html
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Waiting for verification...
Cleaning up challenges
Generating key (2048 bits): /etc/letsencrypt/keys/0000_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0000_csr-certbot.pemIMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your cert will
expire on 2018-04-23. To obtain a new or tweaked version of this
certificate in the future, simply run certbot again. To
non-interactively renew *all* of your certificates, run "certbot
renew"
- If you like Certbot, please consider supporting our work by:Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-leСуществует альтернативный метод с использованием параметра --nginx в Certbot, но этот метод в настоящее время не работает из-за проблемы с TLS-SNI-01 в Lets encrypt. Однако метод webroot, как показано выше, работает нормально.
Новый сгенерированный SSL-сертификат находится во вложенной папке папки /etc/letsencrypt/live/. Точный путь показан в выходных данных Certbot.
Теперь добавьте этот SSL-сертификат в файл нашего веб-сайта Nginx. Отредактируйте файл Nginx по умолчанию:
nano /etc/nginx/sites-available/default
и измените раздел SSL следующим образом:
[...] server {
listen 80 default_server;
listen [::]:80 default_server;
# SSL configuration
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
ssl on;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;
# Note: You should disable gzip for SSL traffic.
# See: https://bugs.debian.org/773332
#
# Read up on ssl_ciphers to ensure a secure configuration.
# See: https://bugs.debian.org/765782
#
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
# include snippets/snakeoil.conf;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.php index.html index.htm index.nginx-debian.html;
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
# pass PHP scripts to FastCGI server
#
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# With php-fpm (or other unix sockets):
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
# With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
deny all;
}
} [...]Замените example.com в пути к SSL-сертификату своим собственным доменным именем. Перезапустите Nginx, чтобы применить изменения.
systemctl restart nginx.service
Образ виртуальной машины
Это руководство доступно как готовая к использованию виртуальная машина в формате OVA/OVF для подписчиков Howtoforge. Формат VM совместим с VMWare и Virtualbox и, возможно, некоторыми другими инструментами, которые могут импортировать этот формат. Вы можете найти ссылку для скачивания в правом меню вверху. Нажмите на имя файла, чтобы начать загрузку.
Данные для входа в виртуальную машину:
Вход по SSH
Имя пользователя:admin
Пароль:howtoforgeЗапустите su, чтобы стать пользователем root, пароль root также является howtoforge.
Образ виртуальной машины использует MySQL в качестве сервера базы данных.
Вход в MySQL
Имя пользователя: root
Пароль: howtoforgeПожалуйста, измените пароли после первой загрузки.
ВМ настроена на статический IP 192.168.1.100, IP можно изменить в файле /etc/network/interfaces.
Ссылки
- nginx: https://nginx.net/
- PHP:
- MySQL: https://www.mysql.com/
- MariaDB: https://mariadb.org/
- Debian: https://www.debian.org/