Как разместить сайт на сервере с LEMP

После установки сборки LEMP, как из нашего рецепта, так и вручную, нужно добавить конфигурационный файл сайта, создать базу данных и директории для файлов.

Для начала настройки потребуется:

  • привязать к серверу домен сайта. Можно приобрести новый, привязать действующий или бесплатный тестовый (имя-тестового-домена.fvds.ru);
  • подключиться к серверу по SSH.

В качестве примера будем использовать тестовый домен example.com. Не забудьте изменить его на свой.

Шаг 0. Структура каталогов для размещения сайтов

Чтобы в будущем мы могли просто и непринуждённо добавлять новые сайты, настраивать FTP или sFTP-доступ для отдельных директорий, не помешает заранее определиться, как оптимально расположить их на сервере. 

Самая базовая структура такова:

/var

      /www

Системная директория

Директория веб-сервера для размещения сайтов

               /example1.com
               /example2.com

Сайты

 

Она будет использоваться в качестве примера ниже.

Тем не менее, если вы планируете разместить на сервере только один сайт, можно не тратить время на настройки и просто загрузить файлы сайта в папку /usr/share/nginx/html — сайт заработает и так. Но в будущем это может привести к необходимости в перенастройке — например, при добавлении нового сайта.

Шаг 1. Создание директории сайта

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

mkdir /var/www/example.com

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

  • Ubuntu и Debian:

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

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

Недостаток такого подход в том, что работать с файлами сайта будет не очень удобно. Формально при каждой загрузке новых файлов потребуется редактировать их владельца — с пользователя, под которым файлы были загружены, на системного пользователя и группу веб-сервера.

Шаг 2. Настройка веб-сервера

Важно учесть, что некоторые CMS имеют собственные, готовые конфигурационные файлы для nginx. Поэтому перед настройкой проверьте базу знаний официального сайта вашей системы управления контентом и документацию Nginx:

Инструкция, приведённая ниже, позволяет настроить базовый виртуальный хост без каких-либо специфических настроек.

Шаги по настройке веб-сервера, а точнее, настройке виртуальных хостов, отличаются в зависимости от вашей операционной системы.

Настройка nginx на Debian и Ubuntu

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

unlink /etc/nginx/sites-enabled/default.conf
  1. Создаём конфигурационный файл нашего нового сайта:

    touch /etc/nginx/sites-available/example.com.conf
  2. Заполняем его данными:

    nano /etc/nginx/sites-available/example.com.conf
    В качестве примера приведён редактор nano. Для сохранения файла нажмите сочетание Ctrl+O, проверьте имя файла и нажмите Enter. Для выхода из файла нажмите сочетание Ctrl+X.
    server {
      listen 80;
      listen [::]:80;
      server_name www.example.com example.com;
      root /var/www/example.com;
      index index.php index.html index.htm index.nginx-debian.html;
    
      location / {
        try_files $uri $uri/ =404;
      }
    
      location ~ \.php$ {
        fastcgi_pass unix:/run/php/php7.4-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;
      }
    }
  3. Создаём символьную ссылку в директорию с конфигурационными файлами активных сайтов:

    ln /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/example.com.conf
  4. Проверяем отсутствие ошибок и перезапускаем nginx для применения изменений:

    nginx -t
    
    systemctl reload nginx

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

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

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

    • Делаем копию конфигурационного файла на случай ошибок и сбоев:

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

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

      vim /etc/nginx/nginx.conf
      В качестве примера приведён консольный редактор vim. Для входа в режим редактирования на клавиатуре нажмите I. Для выхода из режима редактирования нажмите Esc. Для сохранения и выхода из файла введите сочетание :wq Для выхода без сохранения введите :q!
    • В блоке http { ... } находим блок server { … }, и в начале каждой строки этого блока ставим символ # (комментируем строки).

    • В пределах блока http { … } добавляем запись:

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

      И сохраняем файл.

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

    mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.copy
  4. Создаём конфигурационный файл нашего сайта example.com

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

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

    vim /etc/nginx/sites-enabled/example.com.conf
    server {
      listen 80;
      listen [::]:80;
      server_name www.example.com example.com;
      root /var/www/example.com;
      index index.php index.html index.htm index.nginx-debian.html;
    
      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;
      }
    }
  5. Сохраняем файл и проверяем наличие ошибок:

    nginx -t

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

    systemctl reload nginx

Шаг 3. Создание базы данных

База данных — обязательный компонент для работы любого современного сайта (за исключением совсем простых). Одним из этапов установки большинства CMS всегда является настройка базы данных.

Важно: не забудьте сохранить название базы данных, имя пользователя и пароль — они потребуются для настройки сайта.

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

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;

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

exit;

Шаг 4. Загрузка файлов и проверка работы сайта

Загрузка готового сайта

Если у вас уже есть готовый сайт, загрузить его файлы можно по sFTP

В итоге в папке сайта example.com должен оказаться архив вашего сайта (в примере example.com.tar.gz) и дамп базы данных (в примере dump.sql):

Распаковываем сайт: 

tar -xzf example.com.tar.gz

На CentOS tar по умолчанию не установлен. Для установки воспользуйтесь командой: yum -y install tar

Разворачиваем дамп базы данных:

mysql -u exampleDB-user -p exampleDB < dump.sql

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

Установка CMS

В качестве демонстрации установим CMS WordPress.

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

    cd /var/www/example.com
    
    wget https://ru.wordpress.org/latest-ru_RU.tar.gz
  2. Распаковываем скачанный архив и проверяем содержимое:

    tar -xzf latest-ru_RU.tar.gz
    
    ls -al

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

    mv ./wordpress/* ./

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

    rmdir wordpress
    
    rm latest-ru_RU.tar.gz
  3. По инструкции установки меняем название конфигурационного файла и добавляем туда данные нашей тестовой базы данных:

    mv wp-config-sample.php wp-config.php
    • Ubuntu и Debian:

      nano wp-config.php
    • CentOS:

      vim wp-config.php

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

    • Ubuntu и Debian:

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

      chown -R nginx:nginx /var/www/example.com
  4. Теперь дело за малым: осталось донастроить Nginx.

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

    cp /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:

      /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/*;
      }
      

      /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.4-fpm.sock;
              include snippets/fastcgi-php.conf;
          }
      
          location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
      
              expires max;
              log_not_found off;
          }
      }
      
    • CentOS:

      /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 для сайта на WordPress. Частные случаи могут требовать более тонких настроек.

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

    nginx -t

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

    systemctl reload nginx
  5. После этого нужно открыть ваш домен или IP-адрес сервера в браузере — должен открыться установщик WordPress. При наличии ошибок проверьте логи /var/log/nginx/error.log, запущена ли служба php-fpm:

    tail -f /var/log/nginx/error.log
    
    systemctl status php7.4-fpm

На этом процесс установки CMS WordPress завершён.