Простая установка LEMP (LNMP) сервера (Linux Nginx PHP MySQL)

Что такое LEMP? LEMP (LNMP) — это акроним, обозначающий набор (комплекс) серверного программного обеспечения. LEMP назван по первым буквам входящих в его состав компонентов: Linux — операционная система Linux; Nginx — веб-сервер; MariaDB / MySQL — СУБД; PHP — язык программирования.

LEMP - это аналог популярного стека LAMP, используемого для разработки и развертывания веб-приложений. Традиционно LAMP состоит из Linux, Apache, MySQL и PHP. Благодаря своей модульной природе компоненты легко могут быть заменены. В LEMP Apache заменяется легким, но мощным Nginx, который может обеспечить более предсказуемую производительность при высоких нагрузках.

Затем устанавливаем веб-сервер Nginx:

Ubuntu и Debian:

apt update && apt -y install nginx

CentOS:

yum install nginx

После установки проверим, что веб-сервер запустился.

systemctl status nginx

На Ubuntu и Debian службы после установки запускаются и добавляются в автозапуск автоматически, на Centos это нужно сделать вручную:

systemctl enable nginx

Чтобы проверить, что веб-сервер заработал и может обрабатывать запросы к серверу, введите IP-адрес вашего сервера в адресной строке браузера. Откроется приветственная страница Apache, и это нормально, так как до этого у нас был установлен Apache

Установка PHP-fpm производится командой: Ubuntu и Debian:

apt install php-fpm php8.1-mysql

CentOS:

yum install php-fpm

После установки, проверим статус и если нужно запускаем менеджер процессов php-fpm и добавляем его в автозагрузку:

systemctl status php*-fpm.service
systemctl start php-fpm.service && systemctl enable php-fpm.service

После установки нужно отредактировать настройки php-fpm по умолчанию, предназначенные для веб-сервера Apache: Ubuntu и Debian (данный пример на Debian 10):

nano /etc/php/7.3/fpm/pool.d/www.conf

CentOS:

nano /etc/php-fpm.d/www.conf

В файле ищем блок кода Unix user/group of processes и меняем apache на www-data для Debian и Ubuntu и nginx для CentOS. Открываем для редактирования конфигурационный файл PHP: Ubuntu и Debian (данный пример на Debian 10):

nano /etc/php/7.3/fpm/php.ini

CentOS:

vim /etc/php.ini

В файле ищем раздел Paths and Directories (он почти в самом конце файла), внутри находим параметр cgi.fix_pathinfo. Нужно раскомментировать его (удалить «;» в начале строки) и изменить значение с «1» на «0». После этого сохраняем файл и перезапускаем веб-сервер, чтобы новые настройки применились: Ubuntu и Debian (данный пример на Debian 10):

systemctl reload nginx && systemctl reload php7.3-fpm

CentOS:

systemctl reload nginx && systemctl reload php-fpm

Удаляем конфигурационный файл default, использующийся по умолчанию, и создаём его замену, default.conf: Ubuntu и Debian:

unlink /etc/nginx/sites-enabled/default
touch /etc/nginx/sites-available/default.conf
ln /etc/nginx/sites-available/default.conf /etc/nginx/sites-enabled/default.conf

CentOS:

touch /etc/nginx/conf.d/default.conf

Откроем новый файл в консольном текстовом редакторе и добавим туда содержимое: Ubuntu и Debian:

nano /etc/nginx/sites-available/default.conf

CentOS:

nano /etc/nginx/conf.d/default.conf

Скопируйте в файл следующий блок настроек: Ubuntu и Debian:

server {
  listen 80;
  server_name _;
  root /var/www/html/;
  index index.php index.html index.htm;

  location / {
    try_files $uri $uri/ =404;
  }

  location ~ \.php$ {
    fastcgi_pass unix:/run/php/php7.3-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    include snippets/fastcgi-php.conf;
  }

  location ~ /\.ht {
      access_log off;
      log_not_found off;
      deny all;
  }
}

CentOS:

server {
  listen 80;
  server_name _;
  root /var/www/html/;
  index index.php index.html index.htm;

  location / {
    try_files $uri $uri/ =404;
  }

  location ~ \.php$ {
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

  location ~ /\.ht {
      access_log off;
      log_not_found off;
      deny all;
  }
}

Осталось проверить, что в конфигурационном файле отсутствуют ошибки, и перезапустить nginx для применения настроек:

nginx -t
systemctl reload nginx

Проверим работу веб-сервера и php-обработчика, создав файл с php info. Для начала перейдите в корневую директорию вашего сайта. Если сайта ещё нет, по умолчанию это каталог /var/www/html. Создайте файл с именем info.php и откройте его в любом консольном текстовом редакторе:

nano /var/www/html/info.php

В файл вставьте следующую конструкцию:

<?php
phpinfo();
?>

Теперь при переходе по ссылке типа http://IP-адрес-сервера/info.php вы увидите полный список параметров PHP на вашем сервере. Не забудьте удалить этот файл после того, как полноценно развернете сайт и убедитесь, что сайт работает. Если оставить его в открытом доступе, информация из него может быть использована злоумышленниками для атак на ваш сайт.

rm /var/www/html/info.php

Читайте также: Что такое default_server в Nginx

Настройка nginx на Debian и Ubuntu Перед настройкой нужно отключить старый конфигурационный файл по умолчанию, который был создан для проверки работы веб-сервера:

unlink /etc/nginx/sites-enabled/default.conf

Создаем конфигурационный файл нашего нового сайта, взяв за основу стандартный конфигурационный файл:

cp /etc/nginx/sites-enabled/default.conf /etc/nginx/sites-available/example.com.conf
nano /etc/nginx/sites-available/example.com.conf

Сверяем, чтобы там были следующие данные:

server {
  listen 80;
  server_name www.example.com example.com;
  root /var/www/example.com;
  index index.php index.html index.htm;

  location / {
    try_files $uri $uri/ =404;
  }

  location ~ \.php$ {
    fastcgi_pass unix:/run/php/php7.3-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    include snippets/fastcgi-php.conf;
  }

  location ~ /\.ht {
      access_log off;
      log_not_found off;
      deny all;
  }
}

Создаем символьную ссылку в директорию с конфигурационными файлами активных сайтов:

ln /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/example.com.conf

Проверяем отсутствие ошибок и перезапускаем nginx для применения изменений:

nginx -t

Если всё в порядке, перезагружаем веб-сервер для применения изменений:

systemctl reload nginx

Настройка nginx на CentOS

Создаём директорию, где будут храниться конфигурационные файлы наших сайтов:

mkdir /etc/nginx/sites-enabled

Отключаем в конфигурационном файле nginx виртуальный хост по умолчанию и включаем нашу директорию с конфигурационными файлами. Для этого: Делаем копию конфигурационного файла на случай ошибок и сбоев:

cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.copy

Открываем оригинальный конфигурационный файл в консольном редакторе:

nano /etc/nginx/nginx.conf

В блоке http { … } находим блок server { … }, и в начале каждой строки этого блока ставим символ # (комментируем строки). В пределах блока http { … } добавляем запись:

include /etc/nginx/sites-enabled/*;

И сохраняем файл. Переименовываем файл с конфигурацией по умолчанию, чтобы он не мешал работе нашего нового сайта:

mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.copy

Создаём конфигурационный файл нашего сайта example.com и открываем в консольном редакторе:

nano /etc/nginx/sites-enabled/example.com.conf

И копируем в файл базовые настройки:

server {
  listen 80;
  server_name www.example.com example.com;
  root /var/www/example.com;
  index index.php index.html index.htm;

  location / {
    try_files $uri $uri/ =404;
  }

  location ~ \.php$ {
        fastcgi_pass unix:/var/run/php-fpm/www.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

  location ~ /\.ht {
      access_log off;
      log_not_found off;
      deny all;
  }
}

Сохраняем файл и проверяем наличие ошибок: nginx -t Если всё в порядке, перезагружаем веб-сервер для применения изменений: systemctl reload nginx

Чтобы создать базу для нового сайта, подключитесь к серверу баз данных MySQL:

mysql -u root -p

После ввода пароля создадим новую базу данных exampledb:

create database exampledb;

Далее добавим нового пользователя сервера баз данных (exampledb-user) и предоставим ему доступы для работы с базой сайта:

GRANT ALL privileges ON exampledb.* TO 'exampledb-user'@'localhost' IDENTIFIED BY 'p@ssw0rd' WITH GRANT OPTION;
FLUSH privileges;

Выходим из консоли сервера баз данных:

exit;

Установим CMS WordPress. Переходим в папку нужного сайта и скачиваем туда архив CMS:

cd /var/www/example.com
wget https://wordpress.org/latest.tar.gz

Распаковываем скачанный архив и проверяем содержимое:

tar -xzf latest.tar.gz
ls -al

Архив содержал папку wordpress — она нам не нужна, поэтому переместим все файлы оттуда в корневую директорию сайта:

mv ./wordpress/* ./

После этого нужно проверить, что в лишней папке ничего не осталось, и удалить её вместе с архивом.

rmdir wordpress
rm latest.tar.gz

По инструкции установки меняем название конфигурационного файла и добавляем туда данные нашей тестовой базы данных:

cp wp-config-sample.php wp-config.php

Ubuntu, Debian CentOS:

nano wp-config.php

Теперь нужно обеспечить доступ веб-сервера к файлам загруженного сайта. Для этого настроим их владельцем системного пользователя веб-сервера. В зависимости от операционной систему он может называться по-разному: Ubuntu и Debian:

chown -R www-data:www-data /var/www/example.com

CentOS:

chown -R nginx:nginx /var/www/example.com

Перед изменением сохраним копию исходного конфигурационного файла:

mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.copy

Wordpress рекомендует следующую структуру:

/etc/nginx/nginx.conf — главный конфигурационный файл Nginx
/etc/nginx/global/restrictions.conf
(для CentOS /etc/nginx/conf.d/global/restrictions.conf) — содержит ограничения на несанкционированный доступ к скрытым и системным файлам, настройки robots.txt
/etc/nginx/global/wordpress.conf
(для CentOS /etc/nginx/conf.d/global/wordpress.conf) — содержит глобальные настройки для работы сайтов
/etc/nginx/sites-available/example.com.conf — конфигурационный файл для сайта example.com

Для нашего примера достаточно приведенных далее настроек. Откройте в консольном редакторе соответствующий файл: Ubuntu и Debian:

nano /etc/nginx/nginx.conf

И скопируйте туда следующее содержимое:

user www-data;
worker_processes  auto;
worker_cpu_affinity auto;
error_log  /var/log/nginx/error.log;
pid       /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
#daemon     off;
events {
    worker_connections  1024;
}

http {
#   rewrite_log on;
    include mime.types;
    default_type       application/octet-stream;
    access_log         /var/log/nginx/access.log;
    sendfile           on;
#   tcp_nopush         on;
    keepalive_timeout  3;
#   tcp_nodelay        on;
#   gzip               on;
#php max upload limit cannot be larger than this
    client_max_body_size 13m;
    index              index.php index.html index.htm;
    include sites-enabled/*;
}

Затем откройте файл

nano /etc/nginx/sites-available/example.com.conf

И приведите содержимое файла в соответствие со следующими данными

server {
    server_name example.com www.example.com;
    root /var/www/example.com;

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location ~ /\. {
        deny all;
    }

    location ~* /(?:uploads|files)/.*\.php$ {
        deny all;
    }

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include fastcgi.conf;
        fastcgi_intercept_errors on;
        fastcgi_pass unix:/run/php/php7.3-fpm.sock;
        include snippets/fastcgi-php.conf;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires max;
        log_not_found off;
    }
}

CentOS: Откройте конфигурационный файл:

nano /etc/nginx/nginx.conf

И разместите в нем следующее содержимое:

user nginx;
worker_processes  auto;
worker_cpu_affinity auto;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;
#daemon     off;
events {
    worker_connections  1024;
}

http {
#   rewrite_log on;
    include mime.types;
    default_type       application/octet-stream;
    access_log         /var/log/nginx/access.log;
    sendfile           on;
#   tcp_nopush         on;
    keepalive_timeout  3;
#   tcp_nodelay        on;
#   gzip               on;
#php max upload limit cannot be larger than this
    client_max_body_size 13m;
    index              index.php index.html index.htm;
    include /etc/nginx/conf.d/*.conf;
    include sites-enabled/*;
}

Затем откройте файл:

/etc/nginx/sites-enabled/example.com.conf

И приведите содержимое файла в соответствие со следующими данными:

server {
    server_name example.com www.example.com;
    root /var/www/example.com;
    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location ~ /\. {
        deny all;
    }

    location ~* /(?:uploads|files)/.*\.php$ {
        deny all;
    }

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php-fpm/www.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires max;
        log_not_found off;
    }
}

После изменения конфигурационных файлов нужно обязательно проверить наличие ошибок:

nginx -t

Если всё в порядке, нужно перезапустить веб-сервер для применения изменений:

systemctl reload nginx

После этого нужно открыть ваш домен или IP-адрес сервера в браузере — должен открыться установщик WordPress.

При наличии ошибок проверьте логи /var/log/nginx/error.log, запущена ли служба php-fpm:

tail -f /var/log/nginx/error.log
systemctl status php7.3-fpm
PQ VPS сервера в 28+ странах.