[Системное администрирование, Серверное администрирование] Автоматизируем установку WordPress с NGINX Unit и Ubuntu (перевод)
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Есть множество материалов по установке WordPress, поиск в Google по ключевым словам "WordPress install" выдаст порядка полумиллиона результатов. Но тем не менее фактически среди них весьма мало годных руководств, по которым можно установить и настроить WordPress и нижележащую операционную систему так, чтобы они были способны к поддержке в течение длительного периода времени. Возможно, правильные настройки сильно зависят от конкретных потребностей, или же это связано с тем, что подробное объяснение делает статью тяжелой для чтения.
В этой статье мы постараемся собрать лучшее из двух подходов, предоставляя скрипт на bash для автоматической установки WordPress на Ubuntu, а также пройдемся по нему, поясняя, что делает каждый его кусочек, а также на какие компромиссы мы пошли при его разработке. Если вы опытный пользователь — можете пропустить текст статьи и просто взять скрипт для модификации и использования в ваших окружениях. На выходе скрипта получается настраиваемая установка Wordpress с поддержкой Lets Encrypt, работающая на NGINX Unit и пригодная для промышленного применения.
Разработанная архитектура для развертывания WordPress с использованием NGINX Unit описана в более старой статье, сейчас мы также дополнительно настроим вещи, которые там не были охвачены (как и во многих других руководствах):
- WordPress CLI
- Let's Encrypt и сертификаты TLS\SSL
- Автоматическое обновление сертификатов
- Кэширование NGINX
- Сжатие NGINX
- Поддержка HTTPS и HTTP/2
- Автоматизация процесса
В статье будет описана установка на одном сервере, на котором будут размещены одновременно сервер обработки статики, сервер обработки PHP, база данных. Установка с поддержкой множества виртуальных хостов и сервисов — потенциальная тема на будущее. Хотите, чтобы мы написали о чем-то, чего нет в этих статьях — пишите в комментариях.
Требования
- Сервер-контейнер (LXC или LXD), виртуальная машина, или обычный железный сервер, с не менее чем 512Мб оперативной памяти и установленной Ubuntu 18.04 или более свежей.
- Доступные из интернета порты 80 и 443
- Доменное имя, связанное с публичным ip-адресом этого сервера
- Доступ с правами root (sudo).
Обзор архитектуры
Архитектура такая же, как было описано ранее, трехуровневое web-приложение. Оно состоит из скриптов PHP, исполняемых на обработчике PHP, и статических файлов, обрабатываемых веб-сервером.
Общие принципы
- Многие команды для настройки в скрипте обернуты в условия (if) для идемпотентности: скрипт можно запускать несколько раз без риска изменения настроек, которые уже готовы.
- Скрипт старается устанавливать ПО из репозиториев, так что вы можете применять обновления системы в одну команду (apt upgrade для Ubuntu).
- Команды стараются определить, что они запускаются в контейнере, чтобы изменить соответствующим образом свои настройки.
- Для того, чтобы задать число запускаемых процессов\потоков в настройках, скрипт пробует угадать автоматические параметры настройки для работы в контейнерах, виртуальных машинах, «железных» серверах.
- При описании настроек всегда думаем в первую очередь об автоматизации, которая, как мы надеемся, станет основой для создания вашей собственной инфраструктуры как кода.
- Все команды запускаются от пользователя root, потому что они изменяют основные системные настройки, но непосредственно WordPress работает от обычного пользователя.
Установка переменных окружения
Установите следующие переменные окружения, прежде чем запускать скрипт:
- WORDPRESS_DB_PASSWORD — пароль к базе данных WordPress
- WORDPRESS_ADMIN_USER — имя администратора WordPress
- WORDPRESS_ADMIN_PASSWORD — пароль администратора WordPress
- WORDPRESS_ADMIN_EMAIL — email администратора WordPress
- WORDPRESS_URL — полный URL сайта WordPress, начиная с https://.
- LETS_ENCRYPT_STAGING — пустая по-умолчанию, но, выставив значение в 1, вы будете использовать staging сервера Let’s Encrypt, необходимые для частого запроса сертификатов при тестировании ваших настроек, иначе Let’s Encrypt может временно заблокировать ваш ip-адрес из-за большого числа запросов.
Скрипт проверяет, что эти связанные с WordPress переменные выставлены, и завершает работу, если нет.
Строки скрипта 572-576 проверяют значение LETS_ENCRYPT_STAGING.
Установка производных переменных окружения
Скрипт в строках 55-61 выставляет следующие переменные окружения, либо в некоторое жестко заданное значение, либо с применением значения, полученного из переменных, установленных в предыдущем разделе:
- DEBIAN_FRONTEND="noninteractive" — сообщает приложениям, что они запускаются в скрипте и нет возможности взаимодействия с пользователем.
- WORDPRESS_CLI_VERSION="2.4.0" — версия приложения WordPress CLI.
- WORDPRESS_CLI_MD5= "dedd5a662b80cda66e9e25d44c23b25c" — контрольная сумма исполняемого файла WordPress CLI 2.4.0 (версия указывается в переменной WORDPRESS_CLI_VERSION). Скрипт на 162 строке использует это значение для проверки, что был скачан корректный файл WordPress CLI.
- UPLOAD_MAX_FILESIZE="16M" — максимальный размер файла, который может быть закачан в WordPress. Эта настройка используется в нескольких местах, так что проще задавать ее в одном месте.
- TLS_HOSTNAME= "$(echo ${WORDPRESS_URL} | cut -d'/' -f3)" — hostname системы, извлекаемый из переменной WORDPRESS_URL. Используется для получения соответствующих TLS/SSL сертификатов от Let’s Encrypt, а также для внутренней проверки WordPress.
- NGINX_CONF_DIR="/etc/nginx" — путь к каталогу с настройками NGINX, включая основной файл nginx.conf.
- CERT_DIR="/etc/letsencrypt/live/${TLS_HOSTNAME}" — путь к сертификатам Let’s Encrypt для сайта WordPress, получаемый из переменной TLS_HOSTNAME.
Назначение hostname WordPress серверу
Скрипт устанавливает hostname серверу, чтобы значение соответствовало доменному имени сайта. Это не обязательно, но так удобнее отправлять исходящую почту через SMTP при настройке единственного сервера, как это настраивается скриптом.
код скрипта
SPL
# Change the hostname to be the same as the WordPress hostname
if [ ! "$(hostname)" == "${TLS_HOSTNAME}" ]; then
echo " Changing hostname to ${TLS_HOSTNAME}"
hostnamectl set-hostname "${TLS_HOSTNAME}"
fi
Добавление hostname в /etc/hosts
Дополнение WP‑Cron используется для запуска периодических задач, требует, чтобы WordPress мог получить доступ к самому себе через HTTP. Чтобы убедиться, что WP-Cron работает корректно на всех окружениях, скрипт добавляет строчку в файл /etc/hosts, так что WordPress может получить доступ к самому себе через интерфейс loopback:
код скрипта
SPL
# Add the hostname to /etc/hosts
if [ "$(grep -m1 "${TLS_HOSTNAME}" /etc/hosts)" = "" ]; then
echo " Adding hostname ${TLS_HOSTNAME} to /etc/hosts so that WordPress can ping itself"
printf "::1 %s\n127.0.0.1 %s\n" "${TLS_HOSTNAME}" "${TLS_HOSTNAME}" >> /etc/hosts
fi
Установка инструментов, требуемых для последующих шагов
Оставшаяся часть скрипта нуждается в некоторых программах и подразумевает, что репозитории актуальны. Мы обновляем список репозиториев, после чего устанавливаем нужные инструменты:
код скрипта
SPL
# Make sure tools needed for install are present
echo " Installing prerequisite tools"
apt-get -qq update
apt-get -qq install -y \
bc \
ca-certificates \
coreutils \
curl \
gnupg2 \
lsb-release
Добавление репозиториев NGINX Unit и NGINX
Скрипт устанавливает NGINX Unit и NGINX с открытым исходным кодом из официальных репозиториев NGINX, чтобы удостовериться, что используются версии с последними обновлениями безопасности и исправлениями ошибок.
Скрипт добавляет репозиторий NGINX Unit, а затем — репозиторий NGINX, добавляя ключ репозиториев и файлы настроек apt, задающих доступ к репозиториям через интернет.
Реальная установка NGINX Unit и NGINX происходит в следующем разделе. Мы предварительно добавляем репозитории, чтобы не обновлять метаданные несколько раз, что делает установку быстрее.
код скрипта
SPL
# Install the NGINX Unit repository
if [ ! -f /etc/apt/sources.list.d/unit.list ]; then
echo " Installing NGINX Unit repository"
curl -fsSL https://nginx.org/keys/nginx_signing.key | apt-key add -
echo "deb https://packages.nginx.org/unit/ubuntu/ $(lsb_release -cs) unit" > /etc/apt/sources.list.d/unit.list
fi
# Install the NGINX repository
if [ ! -f /etc/apt/sources.list.d/nginx.list ]; then
echo " Installing NGINX repository"
curl -fsSL https://nginx.org/keys/nginx_signing.key | apt-key add -
echo "deb https://nginx.org/packages/mainline/ubuntu $(lsb_release -cs) nginx" > /etc/apt/sources.list.d/nginx.list
fi
Установка NGINX, NGINX Unit, PHP MariaDB, Certbot (Let’s Encrypt) и их зависимостей
Как только все репозитории добавлены, обновляем метаданные и устанавливаем приложения. Пакеты, устанавливаемые скриптом, также включают расширения PHP, рекомендуемые при запуске WordPress.org
код скрипта
SPL
echo " Updating repository metadata"
apt-get -qq update
# Install PHP with dependencies and NGINX Unit
echo " Installing PHP, NGINX Unit, NGINX, Certbot, and MariaDB"
apt-get -qq install -y --no-install-recommends \
certbot \
python3-certbot-nginx \
php-cli \
php-common \
php-bcmath \
php-curl \
php-gd \
php-imagick \
php-mbstring \
php-mysql \
php-opcache \
php-xml \
php-zip \
ghostscript \
nginx \
unit \
unit-php \
mariadb-server
Настройка PHP для использования с NGINX Unit и WordPress
Скрипт создает файл настроек в каталоге conf.d. Тут задается максимальный размер загружаемых файлов для PHP, включается вывод ошибок PHP в STDERR, так что они будут записаны в журнал NGINX Unit, а также перезапускается NGINX Unit.
код скрипта
SPL
# Find the major and minor PHP version so that we can write to its conf.d directory
PHP_MAJOR_MINOR_VERSION="$(php -v | head -n1 | cut -d' ' -f2 | cut -d'.' -f1,2)"
if [ ! -f "/etc/php/${PHP_MAJOR_MINOR_VERSION}/embed/conf.d/30-wordpress-overrides.ini" ]; then
echo " Configuring PHP for use with NGINX Unit and WordPress"
# Add PHP configuration overrides
cat > "/etc/php/${PHP_MAJOR_MINOR_VERSION}/embed/conf.d/30-wordpress-overrides.ini" << EOM
; Set a larger maximum upload size so that WordPress can handle
; bigger media files.
upload_max_filesize=${UPLOAD_MAX_FILESIZE}
post_max_size=${UPLOAD_MAX_FILESIZE}
; Write error log to STDERR so that error messages show up in the NGINX Unit log
error_log=/dev/stderr
EOM
fi
# Restart NGINX Unit because we have reconfigured PHP
echo " Restarting NGINX Unit"
service unit restart
Задание настроек базы данных MariaDB для WordPress
Мы выбрали MariaDB вместо MySQL, поскольку у нее больше активность сообщества, кроме того, она, возможно, предоставляет более высокую производительность по умолчанию (вероятно, тут все проще: чтобы поставить MySQL, надо добавить еще один репозиторий, прим. переводчика).
Скрипт создает новую базу данных и создает учетные данные для доступа WordPress через интерфейс loopback:
код скрипта
SPL
# Set up the WordPress database
echo " Configuring MariaDB for WordPress"
mysqladmin create wordpress || echo "Ignoring above error because database may already exist"
mysql -e "GRANT ALL PRIVILEGES ON wordpress.* TO "wordpress"@"localhost" IDENTIFIED BY "$WORDPRESS_DB_PASSWORD"; FLUSH PRIVILEGES;"
Установка программы WordPress CLI
На этом шаге скрипт устанавливает программу WP-CLI. С его помощью можно установить и управлять настройками WordPress без необходимости ручной правки файлов, обновления базы или входа в панель управления. Также с его помощью можно установить темы и дополнения и выполнить обновление WordPress.
код скрипта
SPL
if [ ! -f /usr/local/bin/wp ]; then
# Install the WordPress CLI
echo " Installing the WordPress CLI tool"
curl --retry 6 -Ls "https://github.com/wp-cli/wp-cli/releases/download/v${WORDPRESS_CLI_VERSION}/wp-cli-${WORDPRESS_CLI_VERSION}.phar" > /usr/local/bin/wp
echo "$WORDPRESS_CLI_MD5 /usr/local/bin/wp" | md5sum -c -
chmod +x /usr/local/bin/wp
fi
Установка и настройка WordPress
Скрипт устанавливает последнюю версию WordPress в каталог /var/www/wordpress, а также изменяет настройки:
- Соединение с базой данных работает через unix domain socket вместо TCP на loopback, чтобы сократить трафик TCP.
- WordPress добавляет префикс https:// к URL, если клиенты соединяются с NGINX по протоколу HTTPS, а также отправляет удаленный hostname (как это предоставляет NGINX) в PHP. Мы применяем кусочек кода, чтобы это настроить.
- WordPress нужно HTTPS для входа
- Структура URL по молчанию основывается на ресурсах
- Выставляются правильные права на файловой системе для каталога WordPress.
код скрипта
SPL
if [ ! -d /var/www/wordpress ]; then
# Create WordPress directories
mkdir -p /var/www/wordpress
chown -R www-data:www-data /var/www
# Download WordPress using the WordPress CLI
echo " Installing WordPress"
su -s /bin/sh -c 'wp --path=/var/www/wordpress core download' www-data
WP_CONFIG_CREATE_CMD="wp --path=/var/www/wordpress config create --extra-php --dbname=wordpress --dbuser=wordpress --dbhost="localhost:/var/run/mysqld/mysqld.sock" --dbpass="${WORDPRESS_DB_PASSWORD}""
# This snippet is injected into the wp-config.php file when it is created;
# it informs WordPress that we are behind a reverse proxy and as such
# allows it to generate links using HTTPS
cat > /tmp/wp_forwarded_for.php << 'EOM'
/* Turn HTTPS 'on' if HTTP_X_FORWARDED_PROTO matches 'https' */
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) {
$_SERVER['HTTPS'] = 'on';
}
if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
$_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
}
EOM
# Create WordPress configuration
su -s /bin/sh -p -c "cat /tmp/wp_forwarded_for.php | ${WP_CONFIG_CREATE_CMD}" www-data
rm /tmp/wp_forwarded_for.php
su -s /bin/sh -p -c "wp --path=/var/www/wordpress config set 'FORCE_SSL_ADMIN' 'true'" www-data
# Install WordPress
WP_SITE_INSTALL_CMD="wp --path=/var/www/wordpress core install --url="${WORDPRESS_URL}" --title="${WORDPRESS_SITE_TITLE}" --admin_user="${WORDPRESS_ADMIN_USER}" --admin_password="${WORDPRESS_ADMIN_PASSWORD}" --admin_email="${WORDPRESS_ADMIN_EMAIL}" --skip-email"
su -s /bin/sh -p -c "${WP_SITE_INSTALL_CMD}" www-data
# Set permalink structure to a sensible default that isn't in the UI
su -s /bin/sh -p -c "wp --path=/var/www/wordpress option update permalink_structure '/%year%/%monthnum%/%postname%/'" www-data
# Remove sample file because it is cruft and could be a security problem
rm /var/www/wordpress/wp-config-sample.php
# Ensure that WordPress permissions are correct
find /var/www/wordpress -type d -exec chmod g+s {} \;
chmod g+w /var/www/wordpress/wp-content
chmod -R g+w /var/www/wordpress/wp-content/themes
chmod -R g+w /var/www/wordpress/wp-content/plugins
fi
Настройка NGINX Unit
Скрипт настраивает NGINX Unit для запуска PHP и обработки путей WordPress, изолируя пространство имен процессов PHP и оптимизируя настройки производительности. Тут есть три функции, на которые стоит обратить внимание:
- Поддержка пространств имен определяется по условию, основана на проверке запуска скрипта в контейнере. Это нужно, поскольку большинство настроек контейнеров не поддерживают вложенный запуск контейнеров.
- Если есть поддержка пространств имен, отключается пространство имен network. Это нужно, чтобы позволить WordPress одновременно подключаться и к endpoints и быть доступным в интернете.
- Максимальное число процессов определяется следующим образом: (Доступная память для запущенных MariaDB и NGINX Uniy)/(предел по оперативной памяти в PHP + 5)
Это значение устанавливается в настройках NGINX Unit.
Также это значение подразумевает, что всегда есть как минимум два запущенных процесса PHP, что важно, поскольку WordPress делает много асинхронных запросов к самому себе, а без дополнительных процессов запуск, к примеру, WP-Cron, сломается. Вы, возможно, захотите увеличить или уменьшить эти ограничения, основываясь на ваших локальных настройках, потому что созданные настройки здесь — консервативные. На большинстве производственных систем настройки находятся между 10 и 100.
код скрипта
SPL
if [ "${container:-unknown}" != "lxc" ] && [ "$(grep -m1 -a container=lxc /proc/1/environ | tr -d '\0')" == "" ]; then
NAMESPACES='"namespaces": {
"cgroup": true,
"credential": true,
"mount": true,
"network": false,
"pid": true,
"uname": true
}'
else
NAMESPACES='"namespaces": {}'
fi
PHP_MEM_LIMIT="$(grep 'memory_limit' /etc/php/7.4/embed/php.ini | tr -d ' ' | cut -f2 -d= | numfmt --from=iec)"
AVAIL_MEM="$(grep MemAvailable /proc/meminfo | tr -d ' kB' | cut -f2 -d: | numfmt --from-unit=K)"
MAX_PHP_PROCESSES="$(echo "${AVAIL_MEM}/${PHP_MEM_LIMIT}+5" | bc)"
echo " Calculated the maximum number of PHP processes as ${MAX_PHP_PROCESSES}. You may want to tune this value due to variations in your configuration. It is not unusual to see values between 10-100 in production configurations."
echo " Configuring NGINX Unit to use PHP and WordPress"
cat > /tmp/wordpress.json << EOM
{
"settings": {
"http": {
"header_read_timeout": 30,
"body_read_timeout": 30,
"send_timeout": 30,
"idle_timeout": 180,
"max_body_size": $(numfmt --from=iec ${UPLOAD_MAX_FILESIZE})
}
},
"listeners": {
"127.0.0.1:8080": {
"pass": "routes/wordpress"
}
},
"routes": {
"wordpress": [
{
"match": {
"uri": [
"*.php",
"*.php/*",
"/wp-admin/"
]
},
"action": {
"pass": "applications/wordpress/direct"
}
},
{
"action": {
"share": "/var/www/wordpress",
"fallback": {
"pass": "applications/wordpress/index"
}
}
}
]
},
"applications": {
"wordpress": {
"type": "php",
"user": "www-data",
"group": "www-data",
"processes": {
"max": ${MAX_PHP_PROCESSES},
"spare": 1
},
"isolation": {
${NAMESPACES}
},
"targets": {
"direct": {
"root": "/var/www/wordpress/"
},
"index": {
"root": "/var/www/wordpress/",
"script": "index.php"
}
}
}
}
}
EOM
curl -X PUT --data-binary @/tmp/wordpress.json --unix-socket /run/control.unit.sock http://localhost/config
Настройка NGINX
Настройка основных параметров NGINX
Скрипт создает каталог для кэша NGINX, а затем создает основной файл настройки nginx.conf. Обратите внимание на число процессов-обработчиков и задание максимального размера файла для загрузки. Также есть строка, на которой подключается файл настройки сжатия, определяемый в следующем разделе, далее идут настройки кэширования.
код скрипта
SPL
# Make directory for NGINX cache
mkdir -p /var/cache/nginx/proxy
echo " Configuring NGINX"
cat > ${NGINX_CONF_DIR}/nginx.conf << EOM
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include ${NGINX_CONF_DIR}/mime.types;
default_type application/octet-stream;
log_format main '\$remote_addr - \$remote_user [\$time_local] "\$request" '
'\$status \$body_bytes_sent "\$http_referer" '
'"\$http_user_agent" "\$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
client_max_body_size ${UPLOAD_MAX_FILESIZE};
keepalive_timeout 65;
# gzip settings
include ${NGINX_CONF_DIR}/gzip_compression.conf;
# Cache settings
proxy_cache_path /var/cache/nginx/proxy
levels=1:2
keys_zone=wp_cache:10m
max_size=10g
inactive=60m
use_temp_path=off;
include ${NGINX_CONF_DIR}/conf.d/*.conf;
}
EOM
Настройка сжатия NGINX
Сжатие содержимого на лету перед отправкой его клиентам — отличный способ улучшения производительности сайта, но только если сжатие настроено правильно. Этот раздел скрипта основан на настройках отсюда.
код скрипта
SPL
cat > ${NGINX_CONF_DIR}/gzip_compression.conf << 'EOM'
# Credit: https://github.com/h5bp/server-configs-nginx/
# ----------------------------------------------------------------------
# | Compression |
# ----------------------------------------------------------------------
# https://nginx.org/en/docs/http/ngx_http_gzip_module.html
# Enable gzip compression.
# Default: off
gzip on;
# Compression level (1-9).
# 5 is a perfect compromise between size and CPU usage, offering about 75%
# reduction for most ASCII files (almost identical to level 9).
# Default: 1
gzip_comp_level 6;
# Don't compress anything that's already small and unlikely to shrink much if at
# all (the default is 20 bytes, which is bad as that usually leads to larger
# files after gzipping).
# Default: 20
gzip_min_length 256;
# Compress data even for clients that are connecting to us via proxies,
# identified by the "Via" header (required for CloudFront).
# Default: off
gzip_proxied any;
# Tell proxies to cache both the gzipped and regular version of a resource
# whenever the client's Accept-Encoding capabilities header varies;
# Avoids the issue where a non-gzip capable client (which is extremely rare
# today) would display gibberish if their proxy gave them the gzipped version.
# Default: off
gzip_vary on;
# Compress all output labeled with one of the following MIME-types.
# `text/html` is always compressed by gzip module.
# Default: text/html
gzip_types
application/atom+xml
application/geo+json
application/javascript
application/x-javascript
application/json
application/ld+json
application/manifest+json
application/rdf+xml
application/rss+xml
application/vnd.ms-fontobject
application/wasm
application/x-web-app-manifest+json
application/xhtml+xml
application/xml
font/eot
font/otf
font/ttf
image/bmp
image/svg+xml
text/cache-manifest
text/calendar
text/css
text/javascript
text/markdown
text/plain
text/xml
text/vcard
text/vnd.rim.location.xloc
text/vtt
text/x-component
text/x-cross-domain-policy;
EOM
Настройка NGINX для WordPress
Далее скрипт создает файл настройки для WordPress default.conf в каталоге conf.d. Здесь настраивается:
- Активация сертификатов TLS, полученных от Let's Encrypt через Certbot (его настройка будет в следующем разделе)
- Настройка параметров безопасности TLS, основанная на рекомендациях от Let's Encrypt
- Подключение кэширования пропускаемых запросов на 1 час по умолчанию
- Отключение журналирования доступа, а также журналирования ошибок, если файл не найден, для двух общих запрашиваемых файлов: favicon.ico и robots.txt
- Запрет доступа к скрытым файлам и некоторым файлам .php, чтобы предотвратить нелегальный доступ или непреднамеренный запуск
- Отключение журналирования доступа для статики и файлов шрифтов
- Задание заголовка Access-Control-Allow-Origin для файлов шрифтов
- Добавление маршрутизации для index.php и прочей статики.
код скрипта
SPL
cat > ${NGINX_CONF_DIR}/conf.d/default.conf << EOM
upstream unit_php_upstream {
server 127.0.0.1:8080;
keepalive 32;
}
server {
listen 80;
listen [::]:80;
# ACME-challenge used by Certbot for Let's Encrypt
location ^~ /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://${TLS_HOSTNAME}\$request_uri;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name ${TLS_HOSTNAME};
root /var/www/wordpress/;
# Let's Encrypt configuration
ssl_certificate ${CERT_DIR}/fullchain.pem;
ssl_certificate_key ${CERT_DIR}/privkey.pem;
ssl_trusted_certificate ${CERT_DIR}/chain.pem;
include ${NGINX_CONF_DIR}/options-ssl-nginx.conf;
ssl_dhparam ${NGINX_CONF_DIR}/ssl-dhparams.pem;
# OCSP stapling
ssl_stapling on;
ssl_stapling_verify on;
# Proxy caching
proxy_cache wp_cache;
proxy_cache_valid 200 302 1h;
proxy_cache_valid 404 1m;
proxy_cache_revalidate on;
proxy_cache_background_update on;
proxy_cache_lock on;
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
# Deny all attempts to access hidden files such as .htaccess, .htpasswd,
# .DS_Store (Mac)
# Keep logging the requests to parse later (or to pass to firewall utilities
# such as fail2ban)
location ~ /\. {
deny all;
}
# Deny access to any files with a .php extension in the uploads directory;
# works in subdirectory installs and also in multi-site network.
# Keep logging the requests to parse later (or to pass to firewall utilities
# such as fail2ban).
location ~* /(?:uploads|files)/.*\.php\$ {
deny all;
}
# WordPress: deny access to wp-content, wp-includes PHP files
location ~* ^/(?:wp-content|wp-includes)/.*\.php\$ {
deny all;
}
# Deny public access to wp-config.php
location ~* wp-config.php {
deny all;
}
# Do not log access for static assets, media
location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {
access_log off;
}
location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff2?)$ {
add_header Access-Control-Allow-Origin "*";
access_log off;
}
location / {
try_files \$uri @index_php;
}
location @index_php {
proxy_socket_keepalive on;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
proxy_set_header Host \$host;
proxy_pass http://unit_php_upstream;
}
location ~* \.php\$ {
proxy_socket_keepalive on;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
proxy_set_header Host \$host;
try_files \$uri =404;
proxy_pass http://unit_php_upstream;
}
}
EOM
Настройка Certbot для сертификатов от Let's Encrypt и их автоматическое продление
Certbot — бесплатный инструмент от Electronic Frontier Foundation (EFF), с помощью которого можно получать и автоматически обновлять сертификаты TLS от Let's Encrypt. Скрипт выполняет следующие действия, приводящие к настройке Certbot для обработки сертификатов от Let's Encrypt в NGINX:
- Останавливает NGINX
- Скачивает рекомендуемые параметры TLS
- Запускает Certbot, чтобы получить сертификаты для сайта
- Перезапускает NGINX для использования сертификатов
- Настраивает ежедневный запуск Certbot в 3:24 ночи для проверки необходимости обновления сертификатов, а также, при необходимости, скачивания новых сертификатов и перезагрузки NGINX.
код скрипта
SPL
echo " Stopping NGINX in order to set up Let's Encrypt"
service nginx stop
mkdir -p /var/www/certbot
chown www-data:www-data /var/www/certbot
chmod g+s /var/www/certbot
if [ ! -f ${NGINX_CONF_DIR}/options-ssl-nginx.conf ]; then
echo " Downloading recommended TLS parameters"
curl --retry 6 -Ls -z "Tue, 14 Apr 2020 16:36:07 GMT" \
-o "${NGINX_CONF_DIR}/options-ssl-nginx.conf" \
"https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf" \
|| echo "Couldn't download latest options-ssl-nginx.conf"
fi
if [ ! -f ${NGINX_CONF_DIR}/ssl-dhparams.pem ]; then
echo " Downloading recommended TLS DH parameters"
curl --retry 6 -Ls -z "Tue, 14 Apr 2020 16:49:18 GMT" \
-o "${NGINX_CONF_DIR}/ssl-dhparams.pem" \
"https://raw.githubusercontent.com/certbot/certbot/master/certbot/certbot/ssl-dhparams.pem" \
|| echo "Couldn't download latest ssl-dhparams.pem"
fi
# If tls_certs_init.sh hasn't been run before, remove the self-signed certs
if [ ! -d "/etc/letsencrypt/accounts" ]; then
echo " Removing self-signed certificates"
rm -rf "${CERT_DIR}"
fi
if [ "" = "${LETS_ENCRYPT_STAGING:-}" ] || [ "0" = "${LETS_ENCRYPT_STAGING}" ]; then
CERTBOT_STAGING_FLAG=""
else
CERTBOT_STAGING_FLAG="--staging"
fi
if [ ! -f "${CERT_DIR}/fullchain.pem" ]; then
echo " Generating certificates with Let's Encrypt"
certbot certonly --standalone \
-m "${WORDPRESS_ADMIN_EMAIL}" \
${CERTBOT_STAGING_FLAG} \
--agree-tos --force-renewal --non-interactive \
-d "${TLS_HOSTNAME}"
fi
echo " Starting NGINX in order to use new configuration"
service nginx start
# Write crontab for periodic Let's Encrypt cert renewal
if [ "$(crontab -l | grep -m1 'certbot renew')" == "" ]; then
echo " Adding certbot to crontab for automatic Let's Encrypt renewal"
(crontab -l 2>/dev/null; echo "24 3 * * * certbot renew --nginx --post-hook 'service nginx reload'") | crontab -
fi
Дополнительная настройка вашего сайта
Мы выше рассказали о том, как наш скрипт настраивает NGINX и NGINX Unit для обслуживания готового к промышленной работе сайта с включенным TLS\SSL. Вы можете также, в зависимости от ваших нужд, добавить в будущем:
- Поддержку Brotli, улучшенное сжатие на лету по HTTPS
- ModSecurity с правилами для WordPress, чтобы предотвратить автоматические атаки на ваш сайт
- Резервное копирование для WordPress, подходящее вам
- Защиту с помощью AppArmor (на Ubuntu)
- Postfix или msmtp, чтобы WordPress мог отправлять почту
- Проверки вашего сайта, чтобы вы понимали, сколько трафика он может выдержать
Для еще более лучшей производительности сайта мы рекомендуем обновиться до NGINX Plus, наш коммерческий продукт корпоративного уровня, основанный на NGINX c открытым исходным кодом. Его подписчики получат динамически загружаемый модуль Brotli, а также (за дополнительную оплату) NGINX ModSecurity WAF. Мы также предлагаем NGINX App Protect, модуль WAF для NGINX Plus, основанный на технологии, ведущей в отрасли безопасности, от F5.
===========
Источник:
habr.com
===========
===========
Автор оригинала: Elijah Zupancic
===========Похожие новости:
- [Системное администрирование, Серверное администрирование, DevOps, Kubernetes] Как использовать HashiCorp Waypoint для совместной работы с GitLab CI/CD (перевод)
- [Системное администрирование, Серверное администрирование, DevOps, Kubernetes] Доступна бесплатная версия cloud-native хранилища для Kubernetes от robin.io (перевод)
- [Карьера в IT-индустрии, DevOps, Системное администрирование, Серверное администрирование, Настройка Linux] DevOps Roadmap или пора бы автоматизироваться?
- [Системное администрирование, Серверное администрирование, DevOps] FAQ: новые ограничения использования сервисов Docker с 1 ноября 2020 (перевод)
- [Системное администрирование, Сетевые технологии, Облачные сервисы, Сетевое оборудование] Маршрутизируем и защищаем сеть
- [Системное администрирование, Резервное копирование, Хранение данных, Софт] Откуда берутся логи? Veeam Log Diving
- [Информационная безопасность, Системное администрирование, Сетевые технологии, Сетевое оборудование] 4. FortiAnalyzer Getting Started v6.4. Работа с отчетами
- [Системное администрирование, IT-инфраструктура, SAN] Мониторинг СХД IBM Storwize при помощи Zabbix
- [Управление персоналом, Управление проектами, Управление разработкой] ТОП самых неудачных мотиваций разработчиков
- [Настройка Linux, Системное администрирование, Разработка под Linux] Барьеры и журналируемые файловые системы (перевод)
Теги для поиска: #_sistemnoe_administrirovanie (Системное администрирование), #_servernoe_administrirovanie (Серверное администрирование), #_nginx, #_nginx_unit, #_setup, #_bash, #_wordpress, #_mariadb, #_letsencrypt, #_blog_kompanii_southbridge (
Блог компании Southbridge
), #_sistemnoe_administrirovanie (
Системное администрирование
), #_servernoe_administrirovanie (
Серверное администрирование
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 07:23
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Есть множество материалов по установке WordPress, поиск в Google по ключевым словам "WordPress install" выдаст порядка полумиллиона результатов. Но тем не менее фактически среди них весьма мало годных руководств, по которым можно установить и настроить WordPress и нижележащую операционную систему так, чтобы они были способны к поддержке в течение длительного периода времени. Возможно, правильные настройки сильно зависят от конкретных потребностей, или же это связано с тем, что подробное объяснение делает статью тяжелой для чтения. В этой статье мы постараемся собрать лучшее из двух подходов, предоставляя скрипт на bash для автоматической установки WordPress на Ubuntu, а также пройдемся по нему, поясняя, что делает каждый его кусочек, а также на какие компромиссы мы пошли при его разработке. Если вы опытный пользователь — можете пропустить текст статьи и просто взять скрипт для модификации и использования в ваших окружениях. На выходе скрипта получается настраиваемая установка Wordpress с поддержкой Lets Encrypt, работающая на NGINX Unit и пригодная для промышленного применения. Разработанная архитектура для развертывания WordPress с использованием NGINX Unit описана в более старой статье, сейчас мы также дополнительно настроим вещи, которые там не были охвачены (как и во многих других руководствах):
В статье будет описана установка на одном сервере, на котором будут размещены одновременно сервер обработки статики, сервер обработки PHP, база данных. Установка с поддержкой множества виртуальных хостов и сервисов — потенциальная тема на будущее. Хотите, чтобы мы написали о чем-то, чего нет в этих статьях — пишите в комментариях. Требования
Обзор архитектуры Архитектура такая же, как было описано ранее, трехуровневое web-приложение. Оно состоит из скриптов PHP, исполняемых на обработчике PHP, и статических файлов, обрабатываемых веб-сервером. Общие принципы
Установка переменных окружения Установите следующие переменные окружения, прежде чем запускать скрипт:
Скрипт проверяет, что эти связанные с WordPress переменные выставлены, и завершает работу, если нет. Строки скрипта 572-576 проверяют значение LETS_ENCRYPT_STAGING. Установка производных переменных окружения Скрипт в строках 55-61 выставляет следующие переменные окружения, либо в некоторое жестко заданное значение, либо с применением значения, полученного из переменных, установленных в предыдущем разделе:
Назначение hostname WordPress серверу Скрипт устанавливает hostname серверу, чтобы значение соответствовало доменному имени сайта. Это не обязательно, но так удобнее отправлять исходящую почту через SMTP при настройке единственного сервера, как это настраивается скриптом. код скриптаSPL# Change the hostname to be the same as the WordPress hostname
if [ ! "$(hostname)" == "${TLS_HOSTNAME}" ]; then echo " Changing hostname to ${TLS_HOSTNAME}" hostnamectl set-hostname "${TLS_HOSTNAME}" fi Добавление hostname в /etc/hosts Дополнение WP‑Cron используется для запуска периодических задач, требует, чтобы WordPress мог получить доступ к самому себе через HTTP. Чтобы убедиться, что WP-Cron работает корректно на всех окружениях, скрипт добавляет строчку в файл /etc/hosts, так что WordPress может получить доступ к самому себе через интерфейс loopback: код скриптаSPL# Add the hostname to /etc/hosts
if [ "$(grep -m1 "${TLS_HOSTNAME}" /etc/hosts)" = "" ]; then echo " Adding hostname ${TLS_HOSTNAME} to /etc/hosts so that WordPress can ping itself" printf "::1 %s\n127.0.0.1 %s\n" "${TLS_HOSTNAME}" "${TLS_HOSTNAME}" >> /etc/hosts fi Установка инструментов, требуемых для последующих шагов Оставшаяся часть скрипта нуждается в некоторых программах и подразумевает, что репозитории актуальны. Мы обновляем список репозиториев, после чего устанавливаем нужные инструменты: код скриптаSPL# Make sure tools needed for install are present
echo " Installing prerequisite tools" apt-get -qq update apt-get -qq install -y \ bc \ ca-certificates \ coreutils \ curl \ gnupg2 \ lsb-release Добавление репозиториев NGINX Unit и NGINX Скрипт устанавливает NGINX Unit и NGINX с открытым исходным кодом из официальных репозиториев NGINX, чтобы удостовериться, что используются версии с последними обновлениями безопасности и исправлениями ошибок. Скрипт добавляет репозиторий NGINX Unit, а затем — репозиторий NGINX, добавляя ключ репозиториев и файлы настроек apt, задающих доступ к репозиториям через интернет. Реальная установка NGINX Unit и NGINX происходит в следующем разделе. Мы предварительно добавляем репозитории, чтобы не обновлять метаданные несколько раз, что делает установку быстрее. код скриптаSPL# Install the NGINX Unit repository
if [ ! -f /etc/apt/sources.list.d/unit.list ]; then echo " Installing NGINX Unit repository" curl -fsSL https://nginx.org/keys/nginx_signing.key | apt-key add - echo "deb https://packages.nginx.org/unit/ubuntu/ $(lsb_release -cs) unit" > /etc/apt/sources.list.d/unit.list fi # Install the NGINX repository if [ ! -f /etc/apt/sources.list.d/nginx.list ]; then echo " Installing NGINX repository" curl -fsSL https://nginx.org/keys/nginx_signing.key | apt-key add - echo "deb https://nginx.org/packages/mainline/ubuntu $(lsb_release -cs) nginx" > /etc/apt/sources.list.d/nginx.list fi Установка NGINX, NGINX Unit, PHP MariaDB, Certbot (Let’s Encrypt) и их зависимостей Как только все репозитории добавлены, обновляем метаданные и устанавливаем приложения. Пакеты, устанавливаемые скриптом, также включают расширения PHP, рекомендуемые при запуске WordPress.org код скриптаSPLecho " Updating repository metadata"
apt-get -qq update # Install PHP with dependencies and NGINX Unit echo " Installing PHP, NGINX Unit, NGINX, Certbot, and MariaDB" apt-get -qq install -y --no-install-recommends \ certbot \ python3-certbot-nginx \ php-cli \ php-common \ php-bcmath \ php-curl \ php-gd \ php-imagick \ php-mbstring \ php-mysql \ php-opcache \ php-xml \ php-zip \ ghostscript \ nginx \ unit \ unit-php \ mariadb-server Настройка PHP для использования с NGINX Unit и WordPress Скрипт создает файл настроек в каталоге conf.d. Тут задается максимальный размер загружаемых файлов для PHP, включается вывод ошибок PHP в STDERR, так что они будут записаны в журнал NGINX Unit, а также перезапускается NGINX Unit. код скриптаSPL# Find the major and minor PHP version so that we can write to its conf.d directory
PHP_MAJOR_MINOR_VERSION="$(php -v | head -n1 | cut -d' ' -f2 | cut -d'.' -f1,2)" if [ ! -f "/etc/php/${PHP_MAJOR_MINOR_VERSION}/embed/conf.d/30-wordpress-overrides.ini" ]; then echo " Configuring PHP for use with NGINX Unit and WordPress" # Add PHP configuration overrides cat > "/etc/php/${PHP_MAJOR_MINOR_VERSION}/embed/conf.d/30-wordpress-overrides.ini" << EOM ; Set a larger maximum upload size so that WordPress can handle ; bigger media files. upload_max_filesize=${UPLOAD_MAX_FILESIZE} post_max_size=${UPLOAD_MAX_FILESIZE} ; Write error log to STDERR so that error messages show up in the NGINX Unit log error_log=/dev/stderr EOM fi # Restart NGINX Unit because we have reconfigured PHP echo " Restarting NGINX Unit" service unit restart Задание настроек базы данных MariaDB для WordPress Мы выбрали MariaDB вместо MySQL, поскольку у нее больше активность сообщества, кроме того, она, возможно, предоставляет более высокую производительность по умолчанию (вероятно, тут все проще: чтобы поставить MySQL, надо добавить еще один репозиторий, прим. переводчика). Скрипт создает новую базу данных и создает учетные данные для доступа WordPress через интерфейс loopback: код скриптаSPL# Set up the WordPress database
echo " Configuring MariaDB for WordPress" mysqladmin create wordpress || echo "Ignoring above error because database may already exist" mysql -e "GRANT ALL PRIVILEGES ON wordpress.* TO "wordpress"@"localhost" IDENTIFIED BY "$WORDPRESS_DB_PASSWORD"; FLUSH PRIVILEGES;" Установка программы WordPress CLI На этом шаге скрипт устанавливает программу WP-CLI. С его помощью можно установить и управлять настройками WordPress без необходимости ручной правки файлов, обновления базы или входа в панель управления. Также с его помощью можно установить темы и дополнения и выполнить обновление WordPress. код скриптаSPLif [ ! -f /usr/local/bin/wp ]; then
# Install the WordPress CLI echo " Installing the WordPress CLI tool" curl --retry 6 -Ls "https://github.com/wp-cli/wp-cli/releases/download/v${WORDPRESS_CLI_VERSION}/wp-cli-${WORDPRESS_CLI_VERSION}.phar" > /usr/local/bin/wp echo "$WORDPRESS_CLI_MD5 /usr/local/bin/wp" | md5sum -c - chmod +x /usr/local/bin/wp fi Установка и настройка WordPress Скрипт устанавливает последнюю версию WordPress в каталог /var/www/wordpress, а также изменяет настройки:
код скриптаSPLif [ ! -d /var/www/wordpress ]; then
# Create WordPress directories mkdir -p /var/www/wordpress chown -R www-data:www-data /var/www # Download WordPress using the WordPress CLI echo " Installing WordPress" su -s /bin/sh -c 'wp --path=/var/www/wordpress core download' www-data WP_CONFIG_CREATE_CMD="wp --path=/var/www/wordpress config create --extra-php --dbname=wordpress --dbuser=wordpress --dbhost="localhost:/var/run/mysqld/mysqld.sock" --dbpass="${WORDPRESS_DB_PASSWORD}"" # This snippet is injected into the wp-config.php file when it is created; # it informs WordPress that we are behind a reverse proxy and as such # allows it to generate links using HTTPS cat > /tmp/wp_forwarded_for.php << 'EOM' /* Turn HTTPS 'on' if HTTP_X_FORWARDED_PROTO matches 'https' */ if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) { $_SERVER['HTTPS'] = 'on'; } if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) { $_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST']; } EOM # Create WordPress configuration su -s /bin/sh -p -c "cat /tmp/wp_forwarded_for.php | ${WP_CONFIG_CREATE_CMD}" www-data rm /tmp/wp_forwarded_for.php su -s /bin/sh -p -c "wp --path=/var/www/wordpress config set 'FORCE_SSL_ADMIN' 'true'" www-data # Install WordPress WP_SITE_INSTALL_CMD="wp --path=/var/www/wordpress core install --url="${WORDPRESS_URL}" --title="${WORDPRESS_SITE_TITLE}" --admin_user="${WORDPRESS_ADMIN_USER}" --admin_password="${WORDPRESS_ADMIN_PASSWORD}" --admin_email="${WORDPRESS_ADMIN_EMAIL}" --skip-email" su -s /bin/sh -p -c "${WP_SITE_INSTALL_CMD}" www-data # Set permalink structure to a sensible default that isn't in the UI su -s /bin/sh -p -c "wp --path=/var/www/wordpress option update permalink_structure '/%year%/%monthnum%/%postname%/'" www-data # Remove sample file because it is cruft and could be a security problem rm /var/www/wordpress/wp-config-sample.php # Ensure that WordPress permissions are correct find /var/www/wordpress -type d -exec chmod g+s {} \; chmod g+w /var/www/wordpress/wp-content chmod -R g+w /var/www/wordpress/wp-content/themes chmod -R g+w /var/www/wordpress/wp-content/plugins fi Настройка NGINX Unit Скрипт настраивает NGINX Unit для запуска PHP и обработки путей WordPress, изолируя пространство имен процессов PHP и оптимизируя настройки производительности. Тут есть три функции, на которые стоит обратить внимание:
Также это значение подразумевает, что всегда есть как минимум два запущенных процесса PHP, что важно, поскольку WordPress делает много асинхронных запросов к самому себе, а без дополнительных процессов запуск, к примеру, WP-Cron, сломается. Вы, возможно, захотите увеличить или уменьшить эти ограничения, основываясь на ваших локальных настройках, потому что созданные настройки здесь — консервативные. На большинстве производственных систем настройки находятся между 10 и 100. код скриптаSPLif [ "${container:-unknown}" != "lxc" ] && [ "$(grep -m1 -a container=lxc /proc/1/environ | tr -d '\0')" == "" ]; then
NAMESPACES='"namespaces": { "cgroup": true, "credential": true, "mount": true, "network": false, "pid": true, "uname": true }' else NAMESPACES='"namespaces": {}' fi PHP_MEM_LIMIT="$(grep 'memory_limit' /etc/php/7.4/embed/php.ini | tr -d ' ' | cut -f2 -d= | numfmt --from=iec)" AVAIL_MEM="$(grep MemAvailable /proc/meminfo | tr -d ' kB' | cut -f2 -d: | numfmt --from-unit=K)" MAX_PHP_PROCESSES="$(echo "${AVAIL_MEM}/${PHP_MEM_LIMIT}+5" | bc)" echo " Calculated the maximum number of PHP processes as ${MAX_PHP_PROCESSES}. You may want to tune this value due to variations in your configuration. It is not unusual to see values between 10-100 in production configurations." echo " Configuring NGINX Unit to use PHP and WordPress" cat > /tmp/wordpress.json << EOM { "settings": { "http": { "header_read_timeout": 30, "body_read_timeout": 30, "send_timeout": 30, "idle_timeout": 180, "max_body_size": $(numfmt --from=iec ${UPLOAD_MAX_FILESIZE}) } }, "listeners": { "127.0.0.1:8080": { "pass": "routes/wordpress" } }, "routes": { "wordpress": [ { "match": { "uri": [ "*.php", "*.php/*", "/wp-admin/" ] }, "action": { "pass": "applications/wordpress/direct" } }, { "action": { "share": "/var/www/wordpress", "fallback": { "pass": "applications/wordpress/index" } } } ] }, "applications": { "wordpress": { "type": "php", "user": "www-data", "group": "www-data", "processes": { "max": ${MAX_PHP_PROCESSES}, "spare": 1 }, "isolation": { ${NAMESPACES} }, "targets": { "direct": { "root": "/var/www/wordpress/" }, "index": { "root": "/var/www/wordpress/", "script": "index.php" } } } } } EOM curl -X PUT --data-binary @/tmp/wordpress.json --unix-socket /run/control.unit.sock http://localhost/config Настройка NGINX Настройка основных параметров NGINX Скрипт создает каталог для кэша NGINX, а затем создает основной файл настройки nginx.conf. Обратите внимание на число процессов-обработчиков и задание максимального размера файла для загрузки. Также есть строка, на которой подключается файл настройки сжатия, определяемый в следующем разделе, далее идут настройки кэширования. код скриптаSPL# Make directory for NGINX cache
mkdir -p /var/cache/nginx/proxy echo " Configuring NGINX" cat > ${NGINX_CONF_DIR}/nginx.conf << EOM user nginx; worker_processes auto; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include ${NGINX_CONF_DIR}/mime.types; default_type application/octet-stream; log_format main '\$remote_addr - \$remote_user [\$time_local] "\$request" ' '\$status \$body_bytes_sent "\$http_referer" ' '"\$http_user_agent" "\$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; client_max_body_size ${UPLOAD_MAX_FILESIZE}; keepalive_timeout 65; # gzip settings include ${NGINX_CONF_DIR}/gzip_compression.conf; # Cache settings proxy_cache_path /var/cache/nginx/proxy levels=1:2 keys_zone=wp_cache:10m max_size=10g inactive=60m use_temp_path=off; include ${NGINX_CONF_DIR}/conf.d/*.conf; } EOM Настройка сжатия NGINX Сжатие содержимого на лету перед отправкой его клиентам — отличный способ улучшения производительности сайта, но только если сжатие настроено правильно. Этот раздел скрипта основан на настройках отсюда. код скриптаSPLcat > ${NGINX_CONF_DIR}/gzip_compression.conf << 'EOM'
# Credit: https://github.com/h5bp/server-configs-nginx/ # ---------------------------------------------------------------------- # | Compression | # ---------------------------------------------------------------------- # https://nginx.org/en/docs/http/ngx_http_gzip_module.html # Enable gzip compression. # Default: off gzip on; # Compression level (1-9). # 5 is a perfect compromise between size and CPU usage, offering about 75% # reduction for most ASCII files (almost identical to level 9). # Default: 1 gzip_comp_level 6; # Don't compress anything that's already small and unlikely to shrink much if at # all (the default is 20 bytes, which is bad as that usually leads to larger # files after gzipping). # Default: 20 gzip_min_length 256; # Compress data even for clients that are connecting to us via proxies, # identified by the "Via" header (required for CloudFront). # Default: off gzip_proxied any; # Tell proxies to cache both the gzipped and regular version of a resource # whenever the client's Accept-Encoding capabilities header varies; # Avoids the issue where a non-gzip capable client (which is extremely rare # today) would display gibberish if their proxy gave them the gzipped version. # Default: off gzip_vary on; # Compress all output labeled with one of the following MIME-types. # `text/html` is always compressed by gzip module. # Default: text/html gzip_types application/atom+xml application/geo+json application/javascript application/x-javascript application/json application/ld+json application/manifest+json application/rdf+xml application/rss+xml application/vnd.ms-fontobject application/wasm application/x-web-app-manifest+json application/xhtml+xml application/xml font/eot font/otf font/ttf image/bmp image/svg+xml text/cache-manifest text/calendar text/css text/javascript text/markdown text/plain text/xml text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy; EOM Настройка NGINX для WordPress Далее скрипт создает файл настройки для WordPress default.conf в каталоге conf.d. Здесь настраивается:
код скриптаSPLcat > ${NGINX_CONF_DIR}/conf.d/default.conf << EOM
upstream unit_php_upstream { server 127.0.0.1:8080; keepalive 32; } server { listen 80; listen [::]:80; # ACME-challenge used by Certbot for Let's Encrypt location ^~ /.well-known/acme-challenge/ { root /var/www/certbot; } location / { return 301 https://${TLS_HOSTNAME}\$request_uri; } } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name ${TLS_HOSTNAME}; root /var/www/wordpress/; # Let's Encrypt configuration ssl_certificate ${CERT_DIR}/fullchain.pem; ssl_certificate_key ${CERT_DIR}/privkey.pem; ssl_trusted_certificate ${CERT_DIR}/chain.pem; include ${NGINX_CONF_DIR}/options-ssl-nginx.conf; ssl_dhparam ${NGINX_CONF_DIR}/ssl-dhparams.pem; # OCSP stapling ssl_stapling on; ssl_stapling_verify on; # Proxy caching proxy_cache wp_cache; proxy_cache_valid 200 302 1h; proxy_cache_valid 404 1m; proxy_cache_revalidate on; proxy_cache_background_update on; proxy_cache_lock on; proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504; location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { allow all; log_not_found off; access_log off; } # Deny all attempts to access hidden files such as .htaccess, .htpasswd, # .DS_Store (Mac) # Keep logging the requests to parse later (or to pass to firewall utilities # such as fail2ban) location ~ /\. { deny all; } # Deny access to any files with a .php extension in the uploads directory; # works in subdirectory installs and also in multi-site network. # Keep logging the requests to parse later (or to pass to firewall utilities # such as fail2ban). location ~* /(?:uploads|files)/.*\.php\$ { deny all; } # WordPress: deny access to wp-content, wp-includes PHP files location ~* ^/(?:wp-content|wp-includes)/.*\.php\$ { deny all; } # Deny public access to wp-config.php location ~* wp-config.php { deny all; } # Do not log access for static assets, media location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ { access_log off; } location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff2?)$ { add_header Access-Control-Allow-Origin "*"; access_log off; } location / { try_files \$uri @index_php; } location @index_php { proxy_socket_keepalive on; proxy_http_version 1.1; proxy_set_header Connection ""; proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto \$scheme; proxy_set_header Host \$host; proxy_pass http://unit_php_upstream; } location ~* \.php\$ { proxy_socket_keepalive on; proxy_http_version 1.1; proxy_set_header Connection ""; proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto \$scheme; proxy_set_header Host \$host; try_files \$uri =404; proxy_pass http://unit_php_upstream; } } EOM Настройка Certbot для сертификатов от Let's Encrypt и их автоматическое продление Certbot — бесплатный инструмент от Electronic Frontier Foundation (EFF), с помощью которого можно получать и автоматически обновлять сертификаты TLS от Let's Encrypt. Скрипт выполняет следующие действия, приводящие к настройке Certbot для обработки сертификатов от Let's Encrypt в NGINX:
код скриптаSPLecho " Stopping NGINX in order to set up Let's Encrypt"
service nginx stop mkdir -p /var/www/certbot chown www-data:www-data /var/www/certbot chmod g+s /var/www/certbot if [ ! -f ${NGINX_CONF_DIR}/options-ssl-nginx.conf ]; then echo " Downloading recommended TLS parameters" curl --retry 6 -Ls -z "Tue, 14 Apr 2020 16:36:07 GMT" \ -o "${NGINX_CONF_DIR}/options-ssl-nginx.conf" \ "https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf" \ || echo "Couldn't download latest options-ssl-nginx.conf" fi if [ ! -f ${NGINX_CONF_DIR}/ssl-dhparams.pem ]; then echo " Downloading recommended TLS DH parameters" curl --retry 6 -Ls -z "Tue, 14 Apr 2020 16:49:18 GMT" \ -o "${NGINX_CONF_DIR}/ssl-dhparams.pem" \ "https://raw.githubusercontent.com/certbot/certbot/master/certbot/certbot/ssl-dhparams.pem" \ || echo "Couldn't download latest ssl-dhparams.pem" fi # If tls_certs_init.sh hasn't been run before, remove the self-signed certs if [ ! -d "/etc/letsencrypt/accounts" ]; then echo " Removing self-signed certificates" rm -rf "${CERT_DIR}" fi if [ "" = "${LETS_ENCRYPT_STAGING:-}" ] || [ "0" = "${LETS_ENCRYPT_STAGING}" ]; then CERTBOT_STAGING_FLAG="" else CERTBOT_STAGING_FLAG="--staging" fi if [ ! -f "${CERT_DIR}/fullchain.pem" ]; then echo " Generating certificates with Let's Encrypt" certbot certonly --standalone \ -m "${WORDPRESS_ADMIN_EMAIL}" \ ${CERTBOT_STAGING_FLAG} \ --agree-tos --force-renewal --non-interactive \ -d "${TLS_HOSTNAME}" fi echo " Starting NGINX in order to use new configuration" service nginx start # Write crontab for periodic Let's Encrypt cert renewal if [ "$(crontab -l | grep -m1 'certbot renew')" == "" ]; then echo " Adding certbot to crontab for automatic Let's Encrypt renewal" (crontab -l 2>/dev/null; echo "24 3 * * * certbot renew --nginx --post-hook 'service nginx reload'") | crontab - fi Дополнительная настройка вашего сайта Мы выше рассказали о том, как наш скрипт настраивает NGINX и NGINX Unit для обслуживания готового к промышленной работе сайта с включенным TLS\SSL. Вы можете также, в зависимости от ваших нужд, добавить в будущем:
Для еще более лучшей производительности сайта мы рекомендуем обновиться до NGINX Plus, наш коммерческий продукт корпоративного уровня, основанный на NGINX c открытым исходным кодом. Его подписчики получат динамически загружаемый модуль Brotli, а также (за дополнительную оплату) NGINX ModSecurity WAF. Мы также предлагаем NGINX App Protect, модуль WAF для NGINX Plus, основанный на технологии, ведущей в отрасли безопасности, от F5. =========== Источник: habr.com =========== =========== Автор оригинала: Elijah Zupancic ===========Похожие новости:
Блог компании Southbridge ), #_sistemnoe_administrirovanie ( Системное администрирование ), #_servernoe_administrirovanie ( Серверное администрирование ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 07:23
Часовой пояс: UTC + 5