Базовая настройка web-сервера Nginx

Установка и настройка Nginx.

Конфигурация сайтов в Nginx

  1. Создаем файл "dim.st" c конфигурацией сайта:
    nano /etc/nginx/sites-available/dim.st
    Содержимое файла "dim.st" (сайт настраивается с поддержкой SSL соединения):
    server {
      listen 80;
      listen [::]:80;
      server_name dim.st www.dim.st;
      return 301 https://$server_name$request_uri;
    }
    
    server {
      listen 443 ssl http2;
      listen [::]:443 ssl http2;
      server_name dim.st www.dim.st;
      root /home/dim/www/dim.st;
    
      ssl_certificate /etc/letsencrypt/live/dim.st/fullchain.pem;
      ssl_certificate_key /etc/letsencrypt/live/dim.st/privkey.pem;
      ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
      ssl_prefer_server_ciphers on;
      ssl_dhparam /etc/ssl/certs/dhparam.pem;
      # взять из /etc/letsencrypt/options-ssl-nginx.conf
      ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256 ECDHE-ECDSA-AES256-GCM-SHA384 ECDHE-ECDSA-AES128-SHA ECDHE-ECDSA-AES256-SHA ECDHE-ECDSA-AES128-SHA256 ECDHE-ECDSA-AES256-SHA384 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES256-GCM-SHA384 ECDHE-RSA-AES128-SHA ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES256-SHA384 DHE-RSA-AES128-GCM-SHA256 DHE-RSA-AES256-GCM-SHA384 DHE-RSA-AES128-SHA DHE-RSA-AES256-SHA DHE-RSA-AES128-SHA256 DHE-RSA-AES256-SHA256 EDH-RSA-DES-CBC3-SHA";
      ssl_session_cache shared:le_nginx_SSL:1m;
      ssl_session_timeout 1440m;
      ssl_stapling on;
      ssl_stapling_verify on;
    
      add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";
      add_header Content-Security-Policy "default-src https:; script-src https: 'unsafe-eval' 'unsafe-inline'; style-src https: 'unsafe-inline'; img-src https: data:; font-src https: data:";
      add_header X-Frame-Options SAMEORIGIN;
      add_header X-XSS-Protection "1; mode=block";
      add_header X-Content-Type-Options nosniff;
    
      if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; }
      if ($host !~ ^(dim.st|www.dim.st)$ ) { return 444; }
      if ($host = 'www.dim.st' ) { rewrite ^(.*)$ https://dim.st$1  permanent; }
      if ($http_user_agent ~* "libwww-perl"){return 444;}
      if ($http_user_agent ~* "WebDAV"){return 444;}
      if ($http_host ~* "^188.226.150.107"){return 444;}
    
      gzip on;
      gzip_disable "msie6";
      gzip_comp_level 5;
      gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
    
      location ~ /.well-known {
        allow all;
      }
    
      location / {
        proxy pass http://127.0.0.1:81/;
        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;
        client_max_body_size 100m;
        client_body_buffer_size 128k;
        proxy_connect_timeout 90;
        proxy_send_timeout 90;
        proxy_send_timeout 90;
        proxy_buffer_size 4k;
        proxy_buffers 4 32k;
        proxy_busy_buffers_size 64k;
        proxy_temp_file_write_size 64k;
      }
    
      #location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|bmp|swf|js|html|txt|ttf|woff)$
      #{
      #  expires max;
      #}
    }
  2. Создаем симлинк (ссылка, ярлык) сайта "dim.st", тем самым "включаем" сайт:
    ln -s /etc/nginx/sites-available/dim.st /etc/nginx/sites-enabled/dim.st
  3. Создаем файл "sys" с конфигурарацией сайта, доступного по IP-адресу сервера:
    nano /etc/nginx/sites-available/sys
    Содержимое файла "sys":
    server {
      listen 80;
      server_name 188.226.150.107;
     
      access_log /var/www/sys_nginx_access.log;
      error_log /var/www/sys_nginx_error.log;
     
      location / {
        auth_basic "dim.st";
        auth_basic_user_file /var/www/.htpasswd;
        proxy_pass http://127.0.0.1:81/;
        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;
        client_max_body_size 100m;
        client_body_buffer_size 128k;
        proxy_connect_timeout 90;
        proxy_send_timeout 90;
        proxy_send_timeout 90;
        proxy_buffer_size 4k;
        proxy_buffers 4 32k;
        proxy_busy_buffers_size 64k;
        proxy_temp_file_write_size 64k;
      }
      
      location ~ /\.ht { deny all; }
    }
  4. Доступ к сайту "sys" только по логину и паролю. Создаём эту пару:
    htpasswd -c /var/www/.htpasswd admin
  5. Создаем симлинк (ссылка, ярлык) сайта "sys", тем самым "включаем" сайт:
    ln -s /etc/nginx/sites-available/sys /etc/nginx/sites-enabled/sys
  6. Для веб-сервера Apache2 устанавливаем модуль "rpaf", чтобы при проксировании Nginx отдавал IP адрес пользователя при запросах к сайту, а не IP самого сервера:
    apt-get install libapache2-mod-rpaf

Установка и настройка Apache2

  1. Установка Apache2 с модулем "itk", позволяющим запускать каждый сайт от отдельного пользователя:
    apt-get install apache2-mpm-itk
  2. Отключаем ненужные модули "status", "cgi", "alias", "autoindex", "negotiation", "setenvif" (подробнее):
    a2dismod status && a2dismod cgi && a2dismod alias && a2dismod autoindex && a2dismod negotiation && a2dismod setenvif
  3. Включаем нужные модули "rewrite" и "expires":
    a2enmod rewrite && a2enmod expires
  4. Бэкап файла "apache2.conf":
    mv /etc/apache2/apache2.conf /etc/apache2/apache2.conf.default
  5. Создаём файл "apache2.conf":
    nano /etc/apache2/apache2.conf
    Содержимое файла "apache2.conf":
    ServerName dim.st
    LockFile ${APACHE_LOCK_DIR}/accept.lock
    PidFile ${APACHE_PID_FILE}
    User ${APACHE_RUN_USER}
    Group ${APACHE_RUN_GROUP}
    KeepAlive Off
    MaxKeepAliveRequests 0
    KeepAliveTimeout 5
    Timeout 120
    ServerLimit 100
    <IfModule mpm_itk_module>
      StartServers         5
      MinSpareServers      5
      MaxSpareServers      10
      MaxClients           100
      MaxRequestsPerChild  500
    </IfModule>
    AccessFileName .htaccess
    <Files ~ "^.ht">
      Order allow,deny
      Deny from all
      Satisfy all
    </Files>
    DefaultType None
    TraceEnable off
    HostnameLookups Off
    CustomLog /dev/null combined
    ErrorLog /dev/null
    LogLevel warn
    ServerSignature Off
    ServerTokens Prod
    <Directory "/usr/share/phpmyadmin">
      php_admin_value eaccelerator.enable 0
    </Directory>
    Include mods-enabled/*.load
    Include mods-enabled/*.conf
    Include ports.conf
    Include conf.d/
    Include sites-enabled/
    Документация по параметрам apache2.conf, Оптимизация производительности Apache.
  6. В файле "ports.conf" меняем порт веб-сервера Apache2 c дефолтного 80 на 81 (на 80 порту будет Nginx):
    echo -e "NameVirtualHost *:81\nListen 81\n#<IfModule mod_ssl.c>\n#Listen 443\n#</IfModule>\n" > /etc/apache2/ports.conf

Добавление сайтов (виртуальных хостов) в Apache2

  1. Создаем файл "dim.st" с конфигурарацией сайта:
    nano /etc/apache2/sites-available/dim.st
    Содержимое файла "dim.st":
    <VirtualHost *:81>
    ServerName dim.st
    #ServerAlias dimlife.com
    ServerAdmin i@dim.st
    DocumentRoot /home/dim/www/dim.st
    ErrorLog /home/dim/www/.logs/apache_error.log
    #CustomLog /home/dim/www/.logs/apache_access.log combined
    <IfModule mpm_itk_module>
      AssignUserId dim dim
    </IfModule>
    </VirtualHost>
  2. Создаем файл "sys" с конфигурарацией сайта, доступного по IP-адресу сервера:
    nano /etc/apache2/sites-available/sys
    Содержимое файла "sys":
    <VirtualHost *:81>
     ServerName 188.226.150.107
     ServerAdmin i@dim.st
     DocumentRoot /var/www
     ErrorLog /var/www/sys_apache_error.log
    <IfModule mpm_itk_module>
    AssignUserId root root
    </IfModule>
    </VirtualHost>

Установка и настройка PHP 5 и MySQL

Описано тут.


Перезапускаем веб-серверы Nginx и Apache2:
service nginx restart && service apache2 restart
Проверка (только после настройки PHP):
echo -e "<?php phpinfo();?>" > /home/dim/www/dim.st/test.php
Открываем в браузере https://dim.st/test.php