NGINX + Apache + MariaDB (MySQL) + PHP + PHP-FPM (fastCGI) + FTP + PHPMyAdmin +

Автор George, Окт. 04, 2022, 09:59

« назад - далее »

George

NGINX + Apache + MariaDB (MySQL) + PHP + PHP-FPM (fastCGI) + FTP + PHPMyAdmin + Memcached + Postfix на Ubuntu


анная инструкция позволит настроить веб-сервер для решения большей части задач по размещению сайтов, порталов или веб-приложений. Она подходит для серверов на Ubuntu и других систем на основе deb-пакетов.

Тематические термины: Linux, Ubuntu, NGINX, Apache, MySQL, MariaDB, PHP-FPM, FTP, phpMyAdmin, Memcached, Postfix.

Содержание:

Общая настройка системы
Установка NGINX
Установка PHP и PHP-FPM
Установка MariaDB или MySQL
Установка phpMyAdmin
Установка Memcached
Установка и настройка FTP-сервера
Apache
Postfix
Тюнинг веб-сервера
Создание первого сайта
Настройка операционной системы

1. Обновляем Ubuntu:

Код: bash
apt update && apt upgrade

2. Настраиваем время:

Код: bash
apt install chrony

Код: bash
timedatectl set-timezone Europe/Moscow

Код: bash
systemctl enable chrony

* первая команда для установки пакета синхронизации времени; вторая задает часовой пояс по московскому времени; третья разрашит автозапуск chrony.

3. По умолчанию, в Ubuntu брандмауэр работает в режиме «разрешить все». Но если мы настроили защиту по максимуму, то для веб-сервера открываем следующие порты:

Код: bash
iptables -I INPUT 1 -p tcp --match multiport --dports 80,443,8080 -j ACCEPT

Код: bash
iptables -I INPUT 1 -p tcp --match multiport --dports 20,21,60000:65535 -j ACCEPT

* 80, 443 и 8080 порты для веб-сервера; 20, 21 порты нужны для работы FTP; 60000-65535 также необходимы для работы FTP (динамические порты для пассивного режима); Подробнее про настройку iptables.

Для сохранения правил ставим пакет iptables-persistent:

Код: bash
apt install iptables-persistent

Для сохранения правил вводим команду:

Код: bash
netfilter-persistent save
  •  

George

#1
Установка NGINX

Устанавливаем NGINX:

Код: bash
apt install nginx

Внесем изменение в файл nginx.conf:

Код: bash
vi /etc/nginx/nginx.conf
Код: vim
http {
    ...
    server_names_hash_bucket_size 64;
    ....
}
* в данном примере мы сняли комментарий со строчки server_names_hash_bucket_size 64;
* на практике, может встретиться ошибка could not build server_names_hash, you should increase server_names_hash_bucket_size: 32. Она возникает при большом количестве виртуальных серверов или если один из них будет иметь длинное название. Данная строка в конфиге исправит ситуацию.

Перезапускаем nginx:

Код: bash
systemctl enable nginx

Код: bash
systemctl reload nginx

* в процессе запуска мы можем увидим ошибку — возможно, в системе работает другой веб-сервер и занимает 80 порт. Как правило, это apache. Чтобы его выключить (на данном этапе он нам не нужен) вводим команду systemctl stop apache2.

Проверим работу веб-сервера. Открываем браузер и вводим в адресной строке http://<IP-адрес сервера>. В итоге мы должны увидеть заголовок «Welcome to nginx!»:

Заголовок Welcome to nginx!

Если стартовая страница не загружается, проверяем состояние сервиса:

Код: bash
systemctl status nginx
Установка PHP и PHP-FPM

Устанавливаем PHP и PHP-FPM:

Код: bash
apt install php php-fpm

* в каждой версии Ubuntu устанавливается своя нативная версия php. Но если нам нужно установить несколько версий PHP или конкретную версию, то использум инструкцию Установка разных версий PHP на Linux Ubuntu.

Разрешаем автозапуск php-fpm и запускаем его:

Код: bash
systemctl enable php8.1-fpm

* обратите внимание, что мы запустили php-fpm версии 7.4. Но установлена может быть и другая версия — ее можно узнать по версии php командой php -v.
Настройка связки NGINX + PHP

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

Код: bash
vi /etc/nginx/sites-enabled/default

В секции location или server редактируем параметр index на следующее значение:

...
Код: bash
index index.php index.html index.htm;
...

* в данном случае мы сказали серверу сначала искать индексный файл index.php, затем остальные по списку.

А внутри секции server добавим следующее:
Код: vim
        location ~ \.php$ {
            set $root_path /var/www/html;
            fastcgi_pass unix:/run/php/php8.1-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name;
            include fastcgi_params;
            fastcgi_param DOCUMENT_ROOT $root_path;
        }

* где /var/www/html — корневой путь хранения скриптов; /run/php/php8.1-fpm.sock — путь до сокетного файла для взаимодействия с php-fpm. Обратите еще раз внимание, что если в нашей системе будет установлена другая версия php, необходимо внести соответствующую корректировку.

Пример файла default:
Код: vim
server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html;
    index index.php index.html index.htm index.nginx-debian.html;
    server_name _;

    location / {
        index index.php index.html index.htm;
    }

    location ~ \.php$ {
        set $root_path /var/www/html;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_param DOCUMENT_ROOT $root_path;
    }
}

Проверяем правильность настроек nginx:

Код: bash
nginx -t

И перезагружаем его:

Код: bash
systemctl reload nginx

Открываем конфигурационный файл PHP-FPM:

Код: bash
vi /etc/php/8.1/fpm/pool.d/www.conf

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

Код: bash
listen = /run/php/php8.1-fpm.sock

В противном случае меняем его и перезапускаем сервис:

Код: bash
systemctl restart php8.1-fpm

Теперь заходим в каталог хранения настроенного сайта:
Код: bash
cd /var/www/html

Создаем index.php со следующим содержимым:

Код: bash
vi index.php

Код: php
<?php phpinfo(); ?>

Открываем браузере и переходим по адресу http://<IP-адрес сервера>. Мы должны увидеть сводную информацию по PHP и его настройкам:

Информация о php (phpinfo)

* в данном примере используется php версии 8.1.
  •  

George

Установка СУБД

В данной статье мы установим MariaDB. Установка выполняется следующей командой:

Код: bash
apt install mariadb-server

Разрешаем автозапуск и запускаем СУБД:

Код: bash
systemctl enable mariadb

Зададим пароль для учетной записи mysql-root:

Код: bash
mysqladmin -u root password
Входим в SQL-оболочку:

Код: bash
mysql -uroot -p

Задаем пароль для пользователя root@localhost:

Код: sql
 SET PASSWORD FOR 'root'@'localhost' = PASSWORD('New_Password');

Код: sql
 flush privileges;

* где New_Password — пароль, который мы хотим установить для учетной записи root.

Выходим из sql-консоли:

>
Код: sql
quit

PHP + MariaDB

Для возможности подключаться к базе данных скриптами PHP, необходимо установить следующие модули:

Код: bash
apt install php-mysql php-mysqli

После перезагружаем php-fpm:

Код: bash
systemctl restart php8.1-fpm

И открываем наш сайт в браузере. В phpinfo появится новая секция MySQL:

В phpinfo появилась информация о поддержке MySQL

* несмотря на то, что мы установили mariadb, в заголовке мы видим mysql. Так и должно быть.
  •  

George

#3
Установка phpMyAdmin

Код: bash
apt install phpmyadmin

* в процессе установки система может потребовать ввод пароля для пользователя phpmyadmin. Его нужно ввести дважды.

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

а) Виртуальный домен в NGINX:

Код: bash
nano /etc/nginx/sites-enabled/phpmyadmin.conf

Код: vim
server {
        listen       80;
        server_name  phpmyadmin.example.org;
        set $root_path /usr/share/phpmyadmin;

        root $root_path;

        location / {
                index index.php;
        }

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

* где phpmyadmin.example.org — адрес для виртуального домена, именно этот адрес должен быть введен в адресную строку браузера, чтобы открылся нужный сайт. Поэтому есть нет возможность зарегистрировать домен и имя узла в DNS, можно воспользоваться локальным файлом hosts. /usr/share/phpmyadmin — это каталог, в который по умолчанию устанавливается phpMyAdmin.

б) Используем location /phpmyadmin:

Код: bash
nano /etc/nginx/sites-enabled/default
Добавляем location :

Код: vim
server {
        listen       80 default_server;

        ...
Код: vim
    location /phpmyadmin {
            root /usr/share/;
            index index.php;
            location ~ ^/phpmyadmin/(.+\.php)$ {
                root /usr/share/;
                fastcgi_pass unix:/run/php/php8.1-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
                fastcgi_read_timeout 300;
            }
            location ~* ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
                root /usr/share/;
            }      

}

После перезапускаем NGINX:

Код: bash
systemctl reload nginx

Открываем браузер. В зависимости от выбранного способа настройки, ссылка на phpmyadmin будет разной:

    http://phpmyadmin.example.org — если настроили phpmyadmin на отдельном виртуальном домене (способ а).
    http://<IP-адрес сервера>/phpmyadmin — если настроили location /phpmyadmin (способ б).

Откроется форма для авторизации — вводим логин phpmyadmin и пароль, который мы указали при установке phpmyadmin.

Если система вернула ошибку входа из-за неправильного пароля, необходимо задать пароль для учетной записи root@localhost (рассказывается выше в разделе установки MariaDB).
  •  

George

Установка Memcached


Для начала, выполняем установку пакетов:

Код: bash
apt install memcached php-memcached

После разрешаем автозапуск и запускаем сервис кэширования:

Код: bash
systemctl enable memcached

Перезапускаем php-fpm:

Код: bash
systemctl restart php8.1-fpm

Для проверки, что модуль memcached появился в PHP, открываем наш сайт в браузере — в phpinfo должна появиться новая секция:
  •  

George

#5
Установка и настройка FTP-сервера

Мы настроим ProFTPd, так как он позволит использовать виртуальных пользователей с uid пользователя www-data.

Для его установки вводим следующую команду:

Код: bash
apt install proftpd

Смотрим uid пользователя www-data:

Код: bash
id www-data

* в Ubuntu это, как правило, 33.

Создаем виртуального пользователя:

Код: bash
ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=ftpwww --uid=33 --gid=33 --home=/var/www --shell=/usr/sbin/nologin

* где /etc/proftpd/ftpd.passwd — путь до файла, в котором хранятся пользователи; ftpwww — имя пользователя (логин); uid и gid — идентификаторы пользователя и группы системной учетной записи (www-data); /var/www — домашний каталог пользователя; /usr/sbin/nologin — оболочка, запрещающая локальный вход пользователя в систему.

Открываем основной конфигурационный файл:
Код: bash
nano /etc/proftpd/proftpd.conf

Снимаем комментарий или редактируем опцию:

Код: vim
DefaultRoot                     ~
* данная опция говорит о том, что корневой директорией для пользователя будет домашняя директория. Это нужно, чтобы FTP-пользователи не могли выйти за пределы дозволенного и видеть на сервере сайты друг друга.

Создаем дополнительный конфигурационный файл для proftpd:

Код: bash
nano /etc/proftpd/conf.d/custom.conf
Со следующим содержимым:

Код: vim
UseIPv6 off
IdentLookups off
PassivePorts 60000 65535

RequireValidShell off
AuthUserFile /etc/proftpd/ftpd.passwd
AuthPAM off
LoadModule mod_auth_file.c
AuthOrder mod_auth_file.c

* где 60000 - 65535 — диапазон динамических портов для пассивного режима.

Разрешаем автозапуск FTP-серверу и запускаем его:

Код: bash
systemctl enable proftpd
Код: bash
systemctl restart proftpd

Пробуем подключиться к серверу, использую любые FTP-клиенты, например, FileZilla, Total Commander или тот же браузер.

При необходимости, можно настроить шифрование и хранение пользователей в  базе данных. Подробнее в инструкции Установка и настройка ProFTPd на Ubuntu Server.
  •  

George

Apache

Для поддержки файла .htaccess, который используется многими сайтами, необходимо установить и настроить веб-сервер Apache.

Устанавливаем apache и модуль для php:

Код: bash
apt install apache2 libapache2-mod-php

Заходим в настройки портов:

Код: bash
nano /etc/apache2/ports.conf

И редактируем следующее:
Код: vim
Listen 8080

#<IfModule ssl_module>
#       Listen 443
#</IfModule>

#<IfModule mod_gnutls.c>
#       Listen 443
#</IfModule>

* мы настроили прослушивание на порту 8080, так как на 80 уже работает NGINX. Также мы закомментировали прослушивание по 443, так как и он будет слушаться NGINX.

Теперь открываем настройку следующего модуля:

Код: bash
nano /etc/apache2/mods-available/dir.conf

И добавляем впереди индексных файлов index.php:
Код: vim
<IfModule dir_module>
    DirectoryIndex index.php index.html ...
</IfModule>

* если не указан конкретный скрипт, сначала веб-сервер пытается найти и запустить index.php, затем index.html и так далее.

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

Код: bash
nano /etc/apache2/apache2.conf

Рядом с опциями Directory дописываем:

Код: vim
<Directory /var/www/*/www>
    AllowOverride All
    Options Indexes ExecCGI FollowSymLinks
    Require all granted
</Directory>

* где Directory указывает на путь, для которого мы хотим задать настройки; AllowOverride — позволит переопределить все настройки с помощью файла .htaccess; Options задает некоторые настройки: Indexes разрешает списки каталогов, ExecCGI разрешает запуск cgi скриптов, Require all granted — предоставляет всем доступ к сайтам в данном каталоге.

Ниже допишем:

Код: vim
<IfModule setenvif_module>
    SetEnvIf X-Forwarded-Proto https HTTPS=on
</IfModule>

* этой настройкой мы при получении заголовка X-Forwarded-Proto со значением https задаем переменную $_SERVER['HTTPS'] равную on. Данная настройки критична для функционирования некоторых CMS.

Запрещаем mpm_event:
Код: bash
a2dismod mpm_event

* по умолчанию, apache2 может быть установлен с модулем мультипроцессовой обработки mpm_event. Данный модуль не поддерживает php 7 и выше.

Разрешаем модуль мультипроцессовой обработки mpm_prefork:

Код: bash
a2enmod mpm_prefork

Разрешаем модуль php:

Код: bash
a2enmod php8.1

* в данном примере установлен php версии 8.1.

Разрешаем модуль setenvif:

Код: bash
a2enmod setenvif

Разрешаем модуль rewrite:

Код: bash
a2enmod rewrite

 

В процессе включения модулей, если мы видим «Module ... already enabled», значит модуль уже включен.

Разрешаем автозапуск Apache и перезапускаем службу:

Код: bash
systemctl enable apache2

Код: bash
systemctl restart apache2
Открываем браузер и вводим в адресную строку http://<IP-адрес сервера>:8080. Мы должны увидеть привычную страницу:

Проверка работоспособности Apache с помощью phpinfo

* в разделе Server API мы должны увидеть Apache.
  •  

George

NGINX + Apache

Ранее мы настроили связку nginx + php-fpm. Теперь настроим nginx + apache. Открываем конфигурационный файл nginx для сайта по умолчанию:

Код: bash
nano /etc/nginx/sites-enabled/default

Находим наш настроенный location для php-fpm:

...
Код: apacheconf
        location ~ \.php$ {
            set $root_path /var/www/html;
            fastcgi_pass unix:/run/php/php7.4-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name;
            include fastcgi_params;
            fastcgi_param DOCUMENT_ROOT $root_path;
        }
...

и меняем на:

...
Код: apacheconf
        location ~ \.php$ {
            proxy_pass http://127.0.0.1:8080;
            proxy_redirect     off;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Forwarded-Proto $scheme;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }
...

Проверяем и перезапускаем nginx:

Код: bash
nginx -t

Код: bash
systemctl reload nginx

Пробуем открыть в браузере http://<IP-адрес сервера> — должна открыться та же страница, что при проверке Apache (с добавлением 8080):

Проверка работоспособности Apache + NGINX
  •  

George

Apache Real IP


Запросы на apache приходят от NGINX, и они воспринимаются первым как от IP-адреса 127.0.0.1. На практике, это может привести к проблемам, так как некоторым сайтам необходимы реальные адреса посетителей. Для решения проблемы будем использовать модуль remoteip.

Создаем конфигурационный файл со следующим содержимым:

Код: bash
nano /etc/apache2/mods-available/remoteip.conf
Код: vim
<IfModule remoteip_module>
  RemoteIPHeader X-Forwarded-For
  RemoteIPTrustedProxy 127.0.0.1/8
</IfModule>

Активируем модуль:

Код: bash
a2enmod remoteip

Перезапускаем apache:

Код: bash
systemctl restart apache2

Для проверки настройки открываем браузер и вводим в адресную строку http://<IP-адрес сервера>, где откроется наша страница phpinfo. В разделе Apache Environment мы должны увидеть внешний адрес компьютера, с которого обращаемся к серверу в опции REMOTE_ADDR.
  •  

George

Postfix


В качестве агента MTA мы будем использовать удобный в настройке и надежный Postfix.
Установка, настройка и запуск

Устанавливаем пакет postfix:

Код: bash
apt install postfix -y

Вносим некоторые изменения в настройки:

Код: bash
nano /etc/postfix/main.cf

Код: vim
myorigin = $mydomain
smtp_generic_maps = hash:/etc/postfix/generic_map

* mydomain — домен сервера; myorigin — имя домена, которое будет подставляться всем отправляемым сообщениям без явного указания оного; smtp_generic_maps указывает на карту с общими правилами пересылки.

Открываем карту пересылки:

Код: bash
nano /etc/postfix/generic_map

И добавляем:
Код: bash
@example.org    no-reply@example.org

* данной настройкой мы будем подставлять всем отправляемым письмам без поля FROM адрес no-reply@dmosk.local.

Создаем карту:

Код: bash
postmap /etc/postfix/generic_map

Включаем автозапуск почтового сервера и перезапускаем его службу:

Код: bash
systemctl enable postfix

Код: bash
systemctl restart postfix
Корректная отправка

Для того, чтобы сервер мог отправлять сообщения на внешние ящики, необходимо корректно настроить в DNS, как минимум, записи A и PTR.

Для добавления А-записи, необходимо в настройках панели управления нашим доменом создать запись типа. Ее имя и IP-адрес должны соответствовать имени и адресу нашего сервера.

Для создания PTR-записи необходимо написать письмо Интернет-провайдеру, к которому подключен наш сервер. Если наш сервер арендуется у хостинговой компании, необходимо либо написать данное письмо данной хостинговой компании, либо данная возможность может быть предоставлена в панели управления хостинговыми услугами.
  •  

George

Тюнинг веб-сервера

PHP

Внесем небольшие изменения в нашу конфигурацию PHP:

    post_max_size — максимальный объем отправляемых на сервер данных;
    upload_max_filesize — максимально допустимый размер одного загружаемого файла;
    short_open_tag — разрешение использования короткого способа открытия php (<?);
    date.timezone — временная зона, которая будет использоваться веб-сервером, если ее не переопределить настройками в коде php или в файле .htaccess.

Данные изменения вносятся в разные файлы в зависимости от версии PHP и обработчике. Например, для php версии 7.4 и Apache мы открываем на редактирование следующий файл:
Код: bash
nano /etc/php/8.1/apache2/php.ini

И правим следующее:
Код: vim
post_max_size = 1G
...
upload_max_filesize = 512M
...
short_open_tag = On
...
date.timezone = "Europe/Moscow"

Но мы упростим задачу. Для начала, создадим две переменные:

Код: bash
PHP_VER=8.1
Код: bash
INT=apache2

Теперь мы можем упростить настройку для Apache:

Код: bash
sed -e "s/post_max_size = 8M/post_max_size = 1G/" -i /etc/php/$PHP_VER/$INT/php.ini

Код: bash
sed -e "s/upload_max_filesize = 2M/upload_max_filesize = 512M/" -i /etc/php/$PHP_VER/$INT/php.ini

Код: bash
sed -e "s/short_open_tag = Off/short_open_tag = On/" -i /etc/php/$PHP_VER/$INT/php.ini

Код: bash
sed -e "s/;date.timezone =/date.timezone ='Europe\/Moscow'/" -i /etc/php/$PHP_VER/$INT/php.ini

Посмотреть результат можно командой:

Код: bash
cat /etc/php/$PHP_VER/$INT/php.ini | grep -e "^post_max_size\|^upload_max_filesize\|^short_open_tag\|^date.timezone"
Теперь меняем интерпретатор:

Код: bash
INT=fpm

И повторяем:

Код: bash
sed -e "s/post_max_size = 8M/post_max_size = 1G/" -i /etc/php/$PHP_VER/$INT/php.ini

Код: bash
sed -e "s/upload_max_filesize = 2M/upload_max_filesize = 512M/" -i /etc/php/$PHP_VER/$INT/php.ini
Код: bash
sed -e "s/short_open_tag = Off/short_open_tag = On/" -i /etc/php/$PHP_VER/$INT/php.ini

Код: bash
sed -e "s/;date.timezone =/date.timezone ='Europe\/Moscow'/" -i /etc/php/$PHP_VER/$INT/php.ini

Проверяем:

Код: bash
cat /etc/php/$PHP_VER/$INT/php.ini | grep -e "^post_max_size\|^upload_max_filesize\|^short_open_tag\|^date.timezone"

Перезапускаем php-fpm и apache:

Код: bash
systemctl restart php8.1-fpm

Код: bash
systemctl restart apache2


NGINX

Открываем на редактирование следующий файл:

Код: bash
nano /etc/nginx/nginx.conf

И внутри секции http добавляем:

Код: vim
client_max_body_size 512M;

После перезапускаем nginx:
Код: bash
systemctl reload nginx
  •  

George

#11
Создание первого сайта

Настало время проверить наш сервер на реальном примере. Задаем переменную, значение которой будет домен сайта:
Код: bash
TMP_SITE=site1.local

* где site1.local заменить на имя домена, для которого создаем первый сайт. Нам будет намного удобнее копировать и вставлять команды с переменной (не придется править после копипасты).
1. Добавление виртуального домена

Создаем новый файл виртуального домена NGINX:
Код: bash
nano /etc/nginx/sites-enabled/$TMP_SITE.conf

* обязательно на конце должен быть .conf, так как только такие файлы веб-сервер подгружает в конфигурацию.

И добавляем следующее содержимое.

Для HTTP:

Код: apacheconf
server {
    listen      80;
    server_name  site1.local www.site1.local;
    set $root_path /var/www/site1.local/www;

    access_log /var/www/site1.local/log/nginx/access_log;
    error_log /var/www/site1.local/log/nginx/error_log;
    
    gzip  on;
    gzip_disable "msie6";
    gzip_min_length 1000;
    gzip_vary on;
    gzip_proxied    expired no-cache no-store private auth;
    gzip_types      text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;

    root  $root_path;
    index  index.php index.html index.htm;

    location / {
        proxy_pass http://127.0.0.1:8080/;
        proxy_redirect    off;
        proxy_set_header  Host            $host;
        proxy_set_header  X-Forwarded-Proto $scheme;
        proxy_set_header  X-Real-IP        $remote_addr;
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
    
    location ~* ^.+\.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|docx|xls|xlsx|exe|pdf|ppt|tar|wav|bmp|rtf|js)$ {
            expires modified +1w;
    }
}

* где site1.local — домен, для которого создается виртуальный домен; /var/www/site1 — каталог, в котором будет размещаться сайт.
** все запросы будут переводиться на локальный сервер, порт 8080, на котором работает apache, кроме обращений к статическим файла (jpg, png, css и так далее).
*** обратите внимание на выделения полужирным — здесь нужно подставить свои данные.


Для HTTPS:
Код: apacheconf
server {
    listen 80;
    server_name site1.local www.site1.local;
    return 301 https://$host$request_uri;
}

server {
    listen       443 ssl;
    ssl on;
    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/cert.key;

    server_name  site1.local www.site1.local;
    set $root_path /var/www/site1.local/www;

    access_log /var/www/site1.local/log/nginx/access_log;
    error_log /var/www/site1.local/log/nginx/error_log;
    
    gzip  on;
    gzip_disable "msie6";
    gzip_min_length 1000;
    gzip_vary on;
    gzip_proxied    expired no-cache no-store private auth;
    gzip_types      text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;

    root   $root_path;
    index  index.php index.html index.htm;

    location / {
        proxy_pass http://127.0.0.1:8080/;
        proxy_redirect     off;
        proxy_set_header   Host             $host:$server_port;
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
    
    location ~* ^.+\.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|docx|xls|xlsx|exe|pdf|ppt|tar|wav|bmp|rtf|js)$ {
            expires modified +1w;
    }
}

* в первой секции server мы перенаправляем все запросы по незащищенному http на https.
** ssl_certificate и ssl_certificate_key — пути к публичному и приватному ключам соответственно.
*** для получения бесплатного сертификата читайте статью Получение бесплатного SSL сертификата Let's Encrypt.


Теперь создаем виртуальный домен в Apache:

Код: bash
nano /etc/apache2/sites-enabled/$TMP_SITE.conf
Код: php
<VirtualHost *:8080>
    Define root_domain site1.local
    Define root_path /var/www/site1.local

    ServerName ${root_domain}
    ServerAlias www.${root_domain}
    DocumentRoot ${root_path}/www

    ErrorLog     ${root_path}/log/apache/error_log
    TransferLog  ${root_path}/log/apache/access_log

    php_admin_value upload_tmp_dir ${root_path}/tmp
    php_admin_value doc_root ${root_path}
    php_admin_value open_basedir    ${root_path}:/usr/local/share/smarty:/usr/local/share/pear
    php_admin_value session.save_path 0;0660;${root_path}/tmp
</VirtualHost>

Создаем каталоги для сайта:
Код: bash
mkdir -p /var/www/$TMP_SITE/{www,tmp}

Код: bash
mkdir -p /var/www/$TMP_SITE/log/{nginx,apache}

Создаем индексный файл со следующим содержимым:

Код: bash
nano /var/www/$TMP_SITE/www/index.php

Код: bash
<?php echo "<h1>Hello from site1</h1>"; ?>

Задаем права на папки:

Код: bash
chown -R www-data:www-data /var/www/$TMP_SITE

Код: bash
chmod -R 775 /var/www/$TMP_SITE

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

Код: bash
nginx -t

Код: bash
apachectl configtest

Перезапускаем веб-сервер:

Код: bash
systemctl reload nginx
Код: bash
systemctl reload apache2
Открываем сайт в браузере по нашему домену site1.local (он должен быть прописан в DNS или можно его задать в локальном файле hosts того компьютера, с которого мы открываем сайт в браузере). Мы должны увидит фразу «Hello from site1».
  •  

George

2. Создание базы данных

Создаем базу данных для сайта командами:
Код: bash
mysql -uroot -p

Код: sql
 CREATE DATABASE site1 DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8mb4_general_ci;

Код: sql
 GRANT ALL PRIVILEGES ON site1.* TO dbuser@localhost IDENTIFIED BY 'password' WITH GRANT OPTION;

Код: sql
 quit

* данными sql-командами мы создаем базу данных site1 и предоставляем к ней доступ для учетной записи dbuser с паролем password. При желании сделать соединение более безопасным, можно убрать WITH GRANT OPTION.
  •  

George

#13
3. Создание пользователя FTP

Для возможности подключения к сайту по FTP, создаем отдельного пользователя:

Код: bash
ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=site1.local --uid=33 --gid=33 --home=/var/www/$TMP_SITE --shell=/usr/sbin/nologin

* тут мы создадим пользователя site1.local, который будет иметь доступ к каталогу
/var/www/$TMP_SITE
.
  •  

🡱 🡳

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