Sheensay → Серверная → LEMP

LEMP

20.05.2019


Быстрая установка сервера на сборке LEMP (Linux, NGINX, MySQL, PHP) на новом сервере (Debian, Ubuntu) и сайта (WordPress для примера).

  • Если сервера ещё нет, переходим к регистрации нового сервера.
  • Если сервер уже есть, переходим к установке LEMP (NGINX, MySQL, PHP).
  • Когда сервер уже настроен, возвращаемся в начало статьи в раздел Установка сайта.

  • Установка сайта WordPress
  • Регистрация сервера
  • Установка NGINX
  • nginx.conf
  • example.com
  • wpsc.conf
  • wp-admin-ip.conf
  • cloudflare.conf
  • MySQL, MariaDB
  • PHP

Установка сайта WordPress

Этот алгоритм проходится каждый раз, как только нам нужно добавить новый сайт на сервер.
Если сервера пока ещё нет, переходим ниже в следующие разделы к регистрации и настройке до конца, а затем возвращаемся сюда.

Для примера, будет использоваться доменsheensay.ru, его меняем на свой.

  1. Копируем файл конфигурации хоста NGINX (допустим, новый сайт sheensay.ru):

    cp -R -u -p /etc/nginx/vhosts/example.com /etc/nginx/vhosts/sheensay.ru
  2. После копирования нужно изменить файл конфигурации, заменив example.com на sheensay.ru

    nano /etc/nginx/vhosts/sheensay.ru
  3. Создаём каталоги для файлов, логов сайта и задаём нужные права:

    mkdir -p /var/www/sheensay.ru/www && mkdir /var/www/sheensay.ru/log && chown -R www-data:www-data /var/www/sheensay.ru
  4. Создаём базы данных и пользователя с нужными правами. Логин и база данных для примера sheensayru, пароль для примера — fJASOTFj4fJASOTFj4.
    Открываем консоль mysql:

    mysql

    Затем создаём базу данных и пользователя с нужными правами:

    CREATE DATABASE sheensayru CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;
    CREATE USER 'sheensayru'@'localhost' IDENTIFIED BY 'fJASOTFj4fJASOTFj4';
    GRANT ALL PRIVILEGES ON sheensayru.* TO 'sheensayru'@'localhost';

    utf8mb4_unicode_520_ci появился только с версии MySQL 5.6, поэтому если возникнут проблемы, замените COLLATE на utf8mb4_unicode_ci

    в конце выход из консоли управления mysql:

    exit

    Либо Ctrl+C.

  5. Переходим в каталог для файлов сайта:

    cd /var/www/sheensay.ru/www

    Для работы с WordPress используется WP-CLI

    Скачиваем ядро WordPress:

    wp core download --locale=ru_RU --allow-root

    Настраиваем подключение к базе данных:

    wp config create --dbname=sheensayru --dbuser=sheensayru --dbpass=fJASOTFj4fJASOTFj4 --dbcharset=utf8mb4 --allow-root

    Прописываем верные права на файлы и каталоги:

    chown -R www-data:www-data ./

    Перезагружаем NGINX:

    nginx -s reload

    Теперь, нужно связать DNS доменного имени с IP сервера. Проще всего это сделать через CloudFlare либо прописать доменное имя в Windows:

    notepad %windir%\system32\drivers\etc\hosts

    Затем можно открывать сайт и устанавливать первоначальные настройки и данные для авторизации админа.

Регистрация сервера

Установка NGINX

apt-get install nginx

nginx.conf и example.com обязательны, остальные опциональны (но рекомендуемы к использованию). example.com меняем (копируем, дублируем) под свои сайты.

nginx.conf

Конфигурация nginx.conf сервера.
Файл конфигурации: /etc/nginx/nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

worker_rlimit_nofile 65535;

# Определяем, куда писать лог ошибок и уровень логирования
error_log  /var/log/nginx/error.log warn;


events {
  use epoll;

  worker_connections 4096;
                  
  multi_accept on;
}

http {

  # Логи
  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
  log_format  wpmu  '$remote_addr [$time_local] $status $host "$request" "$http_referer" "$http_user_agent" "$http_x_forwarded_for"';


  # Куда писать лог ошибок и уровень логирования
  access_log  /var/log/nginx/access.log  main;

  # Для нормального ответа 304 Not Modified;
  if_modified_since before;

  # Заголовки. Требует дополнительного модуля HttpHeadersMoreModule
  #more_set_headers "Server: Bender";

  # Позволяет увидеть реальные IP юзеров за нсами CloudFlare
  # https://support.cloudflare.com/hc/en-us/articles/200170706-How-do-I-restore-original-visitor-IP-with-Nginx-
  include /etc/nginx/cloudflare.conf;


  # Пишем реальные IP в логи
  set_real_ip_from 127.0.0.1;
  real_ip_header X-Forwarded-For;

  ##
  # Основные настройки
  ##

  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  keepalive_timeout 65;
  types_hash_max_size 2048;
  server_tokens off;

  # server_names_hash_bucket_size 64;
  # server_name_in_redirect off;

  include /etc/nginx/mime.types;
  default_type application/octet-stream;


  ##
  # Настройки SSL
  ##

  ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
  ssl_prefer_server_ciphers on;

  ##
  # Настройки Gzip
  ##

  gzip on;
  gzip_disable "msie6";

  gzip_vary on;
  gzip_proxied any;
  gzip_comp_level 6;
  gzip_buffers 16 8k;
  gzip_http_version 1.1;
  #gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
  gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;

  ##
  # Virtual Host Configs
  ##

  include /etc/nginx/conf.d/*.conf;
  include /etc/nginx/sites-enabled/*;
  include /etc/nginx/vhosts/*;
}


#mail {
# # See sample authentication script at:
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
# 
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
# 
# server {
#   listen     localhost:110;
#   protocol   pop3;
#   proxy      on;
# }
# 
# server {
#   listen     localhost:143;
#   protocol   imap;
#   proxy      on;
# }
#}

example.com

Настройки конкретного сайта.
Файл конфигурации: /etc/nginx/vhosts/example/example.com

1 раз нужно создать дефолтный набор каталогов:

mkdir -p /var/www/example.com/www && mkdir /var/www/example.com/log && chown -R www-data:www-data /var/www/example.com
#user 'example.com' virtual host 'example.com' configuration file
server {
  server_name example.com www.example.com;
  charset UTF-8;
  index index.php;

  root /var/www/example.com/www;

  access_log /var/www/example.com/log/access.log ;
  error_log /var/www/example.com/log/error.log notice;

  ### IP сервера. Меняем на своё значение
  listen 80;

  # Обработка 404 ошибки. Перенаправляем 301 на главную. Опционально.
  error_page 404 = @gotomain;
  location @gotomain {
    return 301 /;
  }

  # Ограничение к панели админа. Опционально. Для работы требует файлов ниже
  include /etc/nginx/wp-admin-ip.conf;

  # Основной конфиг с обработкой статики и настройкой под WP Super Cache
  include /etc/nginx/wpsc.conf;

  # Обработка PHP
  location @php {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
  }
}

wpsc.conf

Файл конфигурации: /etc/nginx/wpsc.conf

 # Let's Encrypt
 location ~ /\.well-known {
    allow all;
  }

 # Запрещаем доступ к файлам и каталогам с точкой в начале названия, например, .htaccess, .git
  location ~ /\. {
    deny all;
  }
 
  # Запрещаем доступ к файлам с расширением .php в каталогах загрузок, например, /wp-content/uploads
  location ~* /(?:uploads|files)/.*\.php$ {
    deny all;
  }
 
 
  # Устанавливаем новую переменную $cache_uri, которой присваиваем запрос из предустановленной переменной $request_uri
  set $cache_uri $request_uri;
  set $no_cache 0;
 
  # POST запросы не кешируются
  if ($request_method = POST) {
    set $cache_uri 'null cache';
    set $no_cache 1;
  }  
 
  # Запросы с параметрами в URL не кешируются
  if ($query_string != "") {
    set $cache_uri 'null cache';
    set $no_cache 1;
  }  
 
  # Не кешировать запросы URL, содержащие следующие части (как правило, админка и служебные, sitemap yoast)
  if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
    set $cache_uri 'null cache';
    set $no_cache 1;
  }  
 
  # Не использовать кеш для авторизованных пользователей и последних комментаторов
  if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
    set $cache_uri 'null cache';
    set $no_cache 1;
  }

                #fastcgi_cache  wpcache;
                ##fastcgi_cache_min_uses 1;
                #fastcgi_cache_valid 200 301 302 304 1h;
                #fastcgi_cache_key "$request_method|$host|$request_uri";
                #fastcgi_cache_use_stale updating;
                #fastcgi_cache_bypass $no_cache;
                #fastcgi_no_cache $no_cache;
                #fastcgi_ignore_headers "Cache-Control" "Expires" "Set-Cookie";

 
  # фавикон не логировать
  location = /favicon.ico { log_not_found off; access_log off; }
  # robots может генерироваться WP
  location = /robots.txt  { try_files $uri /index.php; }

  set $wpsc /wp-content/cache/supercache/${http_host}${cache_uri}/index.html;

  # Если у вас сайт на SSL/TLS, то есть, работает по HTTPS, то вместо index.html у вас будут генерироваться index-https.html
  set $wpsc_https /wp-content/cache/supercache/${http_host}${cache_uri}/index-https.html;
  if ( $scheme = 'https' ) {
    set $wpsc /wp-content/cache/supercache/${http_host}${cache_uri}/index-https.html;
  }

 
 
  # Можно отлавливать переменные в заголовках. Подробнее http://sheensay.ru/nginx
  # add_header X-uri "$uri" always;
  # add_header X-cache-uri "$cache_uri" always;
  # add_header X-$http_host "$http_host" always;

  #add_header X-wpsc $wpsc_https always;
 
  ### Переходим к работе с кешем ###
 
  # Статичные файлы не логируем, выставляем http заголовок Expires на год
  location ~* ^.+\.(jpe?g|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf|ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
    expires 365d; log_not_found off; access_log off;
  }
 
  # Основной запрос, в котором мы пытаемся сначала получить закешированную версию страницы
  # Если кеша нет, тогда отправляемся к WordPress, чтобы он его нам создал
  location / {
    try_files $wpsc_https $wpsc $uri $uri/ /index.php?$args ;
  }

wp-admin-ip.conf

Файл конфигурации: /etc/nginx/wp-admin-ip.conf

### https://sheensay.ru/?p=408
################################

location = /wp-admin/admin-ajax.php { # Открываем доступ к admin-ajax.php. Это нужно, чтобы проходили ajax запросы в WordPress
  try_files $uri/ @php ;
}
 
location = /adminer.php { # Закрываем Adminer, если он есть
  try_files /does_not_exists @deny ;
}
 
location = /wp-login.php { # Закрываем /wp-login.php
  try_files /does_not_exists @deny ;
}
  
location ~* /wp-admin/.+\.php$ { # Закрываем каталог /wp-admin/
  try_files /does_not_exists @deny ;
}
 
 
location @deny { # В этом location мы определяем правила, какие IP пропускать, а какие забанить

  allow 1.2.3.4/8 ;# IP или диапазоны разрешённых для входа в админку IP

  deny all ; # Закрываем доступ всем, кто не попал в белый список
 
  try_files /does_not_exists @php; # Отправляем на обработку php в бекенд
}
 
location ~ \.php$ { ### Файлы PHP обрабатываем в location @php
    try_files /does_not_exist @php;  
}

cloudflare.conf

/etc/nginx/cloudflare.conf

Подробности

set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 104.16.0.0/12;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2c0f:f248::/32;
set_real_ip_from 2a06:98c0::/29;

MySQL, MariaDB

Установка сервера MariaDB:

apt-get install mariadb-server

После проверка установки и текущий статус:

systemctl status mariadb

PHP

apt-get install php-fpm php-mysql

Правим конфиг PHP-FPM:

nano /etc/php/7.0/fpm/php.ini

Прописываем cgi.fix_pathinfo=0:

cgi.fix_pathinfo=0

И применяем изменения:

service php7.0-fpm restart



Так себеНеплохоНормальноХорошоОтлично (1 оценок, в среднем: 5,00 из 5)
Загрузка...


  • Apache
  • Всё о кешировании сайта: nginx, memcached, expires, etag, плагины
  • NGINX
  • ISPmanager
  • Monit — как обеспечить бесперебойную работу NGINX, MySQL, PHP-FPM

Серверная

Свежие записи

  • Squid — свой собственный HTTP Proxy сервер
  • Как исправить ошибку «Обновить WordPress — В настоящий момент выполняется другое обновление»
  • Query Monitor
  • LEMP
  • Telegram

Свежие записи

  • Squid — свой собственный HTTP Proxy сервер
  • Как исправить ошибку «Обновить WordPress — В настоящий момент выполняется другое обновление»
  • Query Monitor
  • LEMP
  • Telegram

Свежие комментарии

  • Sheens к записи Что такое SSL и TLS, как установить и настроить
  • Геомант к записи Что такое SSL и TLS, как установить и настроить
  • Sheens к записи Last-Modified в WordPress
  • Артур к записи Last-Modified в WordPress
  • Sheens к записи EWWW Image Optimizer — плагин для сжатия png, jpeg, gif анимации без потери качества
  • Telegram
  • Вконтакте
  • Facebook
  • Twitter
  • Google+
  • Одноклассники
  • Мой Мир Mail.ru
  • RSS

Copyright © 2025 · Sheensay on Genesis Framework · WordPress · Log in