Веб-сервер на Ubuntu 18.04 c Apache2+Nginx

Установка необходимых компонентов:

apt-get update
apt-get install apache2 nginx libapache2-mod-rpaf bsdutils mysql-server

libapache2-mod-rpaf - нужен чтобы Apache видел реальный IP подключения, а не локальный.

Включаем mod_rewrite для Apache:

a2enmod rewrite

Добавляем возможность запускать Apache не под рутом:

a2dismod mpm_event
apt-get install libapache2-mpm-itk
systemctl restart apache2

Добавляем пользователя для Apache. Можно создать отдельного пользователя для каждого сайта, но мне это обычно не требуется.

adduser aworker

Далее в конфиге /etc/apache2/envvars необходимо выставить:

export APACHE_RUN_USER=aworker
export APACHE_RUN_GROUP=aworker

А в конфиге /etc/nginx/nginx.conf необходимо выставить:

user aworker

Устанавливаем PHP, если нужно:

apt-get install software-properties-common
LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php
apt-get update
apt-get install php8.1 libapache2-mod-php8.1 php8.1-mysql php8.1-curl php8.1-cli php8.1-common php8.1-gd php8.1-mbstring

Чтобы найти дополнительные модули:

apt-cache search php7-*

Закрываем Apache от внешних запросов:

В файле: /etc/apache2/ports.conf:

Listen 127.0.0.1:81

Nginx настраиваем как прокси. Для этого создадим файл /etc/nginx/conf.d/proxy.conf со следующим содержимым:

proxy_redirect              off;
proxy_set_header            Host $host;
proxy_set_header            X-Real-IP $remote_addr;
proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;

Для каждого сайта создаём конфиг с расширением .conf в: /etc/apache2/sites-enabled

Типичный конфиг для сайта:

Options Indexes FollowSymLinks
AllowOverride All
Require all granted
ServerName YOUR_DOMAIN_NAME
ServerAdmin     admin@mail.ru
DocumentRoot  /home/YOUR_DOMAIN_NAME/html
ErrorLog    /home/YOUR_DOMAIN_NAME/logs/apache2.error.log
CustomLog   /home/YOUR_DOMAIN_NAME/logs/apache2.access.log combined
AddType         application/x-httpd-php .php
php_admin_value open_basedir "/home/YOUR_DOMAIN_NAME"
php_admin_value upload_tmp_dir "/home/YOUR_DOMAIN_NAME/tmp"
php_admin_value session.save_path "/home/YOUR_DOMAIN_NAME/tmp"
ServerName www.YOUR_DOMAIN_NAME
ServerAdmin     admin@mail.ru
DocumentRoot  /home/YOUR_DOMAIN_NAME/html
ErrorLog    /home/YOUR_DOMAIN_NAME/logs/apache2.error.log
CustomLog   /home/YOUR_DOMAIN_NAME/logs/apache2.access.log combined
AddType         application/x-httpd-php .php
php_admin_value open_basedir "/home/YOUR_DOMAIN_NAME"
php_admin_value upload_tmp_dir "/home/YOUR_DOMAIN_NAME/tmp"
php_admin_value session.save_path "/home/YOUR_DOMAIN_NAME/tmp"
Redirect /    https://YOUR_DOMAIN_NAME

Конфиг 000-default.conf заменяем на свой:

Options Indexes FollowSymLinks
AllowOverride All
Require all granted
ServerAdmin admin@mail.ru
DocumentRoot /home/aworker/html/
ErrorLog    /home/aworker/logs/apache2.error.log
CustomLog   /home/aworker/logs/apache2.access.log combined
AddType         application/x-httpd-php .php
php_admin_value open_basedir "/home/aworker"
php_admin_value upload_tmp_dir "/home/aworker/tmp"
php_admin_value session.save_path "/home/aworker/tmp"
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

Для каждого сайта создаём конфиг в: /etc/nginx/sites-enabled

Типичный конфиг для сайта:

server {
  listen 80;
  server_name YOUR_DOMAIN_NAME www.YOUR_DOMAIN_NAME;
  root    /home/YOUR_DOMAIN_NAME/html;
  error_log   /home/YOUR_DOMAIN_NAME/logs/nginx.error.log crit;
  access_log  /home/YOUR_DOMAIN_NAME/logs/nginx.access.log;
  location / {
    proxy_pass http://127.0.0.1:81;
  }
  location ~* .(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|swf|ico|flv|txt|docx|xlsx)$ {
    root /home/YOUR_DOMAIN_NAME/html;
    expires 6h;
  }
  proxy_connect_timeout       600;
  proxy_send_timeout          600;
  proxy_read_timeout          600;
  send_timeout                600;
}

Конфиг default:

server {
  listen 80;
  server_name localhost;
  root    /home/aworker/html;
  error_log   /home/aworker/logs/nginx.error.log crit;
  access_log  /home/aworker/logs/nginx.access.log;
  location / {
    proxy_pass http://127.0.0.1:81;
  }
  location ~* .(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|swf|ico|flv|txt|docx|xlsx)$ {
    root /home/aworker/html;
    expires 6h;
  }
  proxy_connect_timeout       600;
  proxy_send_timeout          600;
  proxy_read_timeout          600;
  send_timeout                600;
}

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

chown aworker:root /home/YOUR_DOMAIN_NAME

Не забываем делать рестарт в конце:

systemctl restart apache2
systemctl restart nginx