Mengotomatiskan instalasi WordPress dengan NGINX Unit dan Ubuntu

Mengotomatiskan instalasi WordPress dengan NGINX Unit dan Ubuntu

Ada banyak bahan untuk menginstal WordPress, pencarian Google untuk "Instal WordPress" akan menghasilkan sekitar setengah juta hasil. Namun, pada kenyataannya, hanya ada sedikit panduan bagus di antara mereka, yang dengannya Anda dapat menginstal dan mengkonfigurasi WordPress dan sistem operasi yang mendasarinya sehingga mampu mendukung untuk jangka waktu yang lama. Mungkin pengaturan yang benar sangat bergantung pada kebutuhan tertentu, atau ini karena penjelasan yang mendetail membuat artikel sulit dibaca.

Pada artikel ini, kami akan mencoba menggabungkan yang terbaik dari kedua dunia dengan menyediakan skrip bash untuk menginstal WordPress secara otomatis di Ubuntu, serta menelusurinya, menjelaskan apa yang dilakukan masing-masing bagian, serta kompromi yang kami buat dalam mengembangkannya. . Jika Anda adalah pengguna tingkat lanjut, Anda dapat melewati teks artikel dan langsung saja ambil naskahnya untuk dimodifikasi dan digunakan di lingkungan Anda. Keluaran dari skrip adalah instalasi WordPress khusus dengan dukungan Lets Encrypt, berjalan di Unit NGINX dan cocok untuk penggunaan produksi.

Arsitektur yang dikembangkan untuk menyebarkan WordPress menggunakan Unit NGINX dijelaskan di artikel yang lebih tua, sekarang kami juga akan mengonfigurasi lebih lanjut hal-hal yang tidak tercakup di sana (seperti di banyak tutorial lainnya):

  • CLI WordPress
  • Ayo Enkripsi dan Sertifikat TLSSSL
  • Perpanjangan sertifikat secara otomatis
  • Caching NGINX
  • Kompresi NGINX
  • Dukungan HTTPS dan HTTP/2
  • Otomatisasi proses

Artikel ini akan menjelaskan penginstalan pada satu server, yang secara bersamaan akan menghosting server pemrosesan statis, server pemrosesan PHP, dan database. Instalasi yang mendukung banyak host dan layanan virtual adalah topik potensial untuk masa depan. Jika Anda ingin kami menulis tentang sesuatu yang tidak ada di artikel ini, tulis di komentar.

Persyaratan

  • Server kontainer (LXC ΠΈΠ»ΠΈ Lxd), mesin virtual, atau server besi biasa dengan setidaknya 512MB RAM dan Ubuntu 18.04 atau yang lebih baru diinstal.
  • Port yang dapat diakses internet 80 dan 443
  • Nama domain yang terkait dengan alamat ip publik server ini
  • Akses root (sudo).

Ikhtisar arsitektur

Arsitekturnya sama seperti yang dijelaskan sebelumnya, aplikasi web tiga tingkat. Ini terdiri dari skrip PHP yang berjalan di mesin PHP dan file statis yang diproses oleh server web.

Mengotomatiskan instalasi WordPress dengan NGINX Unit dan Ubuntu

Prinsip-prinsip umum

  • Banyak perintah konfigurasi dalam skrip dibungkus dalam kondisi if untuk idempotensi: skrip dapat dijalankan berkali-kali tanpa risiko mengubah pengaturan yang sudah ada.
  • Skrip mencoba menginstal perangkat lunak dari repositori, sehingga Anda dapat menerapkan pembaruan sistem dalam satu perintah (apt upgrade untuk Ubuntu).
  • Perintah mencoba untuk mendeteksi bahwa mereka sedang berjalan dalam wadah sehingga mereka dapat mengubah pengaturannya.
  • Untuk menyetel jumlah proses utas yang akan dimulai di setelan, skrip mencoba menebak setelan otomatis untuk bekerja di wadah, mesin virtual, dan server perangkat keras.
  • Saat mendeskripsikan pengaturan, pertama-tama kami selalu memikirkan tentang otomatisasi, yang kami harap akan menjadi dasar untuk membuat infrastruktur Anda sendiri sebagai kode.
  • Semua perintah dijalankan sebagai pengguna akar, karena mereka mengubah pengaturan sistem dasar, tetapi WordPress langsung dijalankan sebagai pengguna biasa.

Mengatur variabel lingkungan

Tetapkan variabel lingkungan berikut sebelum menjalankan skrip:

  • WORDPRESS_DB_PASSWORD - Kata sandi basis data WordPress
  • WORDPRESS_ADMIN_USER - Nama admin WordPress
  • WORDPRESS_ADMIN_PASSWORD - Kata sandi admin WordPress
  • WORDPRESS_ADMIN_EMAIL - Email admin WordPress
  • WORDPRESS_URL adalah URL lengkap dari situs WordPress, mulai dari https://.
  • LETS_ENCRYPT_STAGING - kosong secara default, tetapi dengan menyetel nilainya ke 1, Anda akan menggunakan server pementasan Let's Encrypt, yang diperlukan untuk sering meminta sertifikat saat menguji setelan Anda, jika tidak, Let's Encrypt dapat memblokir sementara alamat ip Anda karena banyaknya permintaan .

Skrip memeriksa apakah variabel terkait WordPress ini telah disetel dan keluar jika tidak.
Baris skrip 572-576 periksa nilainya LETS_ENCRYPT_STAGING.

Menetapkan variabel lingkungan turunan

Skrip pada baris 55-61 menyetel variabel lingkungan berikut, baik ke beberapa nilai hard-coded atau menggunakan nilai yang diperoleh dari variabel yang disetel di bagian sebelumnya:

  • DEBIAN_FRONTEND="noninteractive" - Memberi tahu aplikasi bahwa mereka berjalan dalam skrip dan tidak ada kemungkinan interaksi pengguna.
  • WORDPRESS_CLI_VERSION="2.4.0" adalah versi dari aplikasi WordPress CLI.
  • WORDPRESS_CLI_MD5= "dedd5a662b80cda66e9e25d44c23b25c" β€” checksum dari file eksekusi WordPress CLI 2.4.0 (versi ditentukan dalam variabel WORDPRESS_CLI_VERSION). Skrip pada baris 162 menggunakan nilai ini untuk memeriksa apakah file CLI WordPress yang benar telah diunduh.
  • UPLOAD_MAX_FILESIZE="16M" - ukuran file maksimum yang dapat diunggah di WordPress. Pengaturan ini digunakan di beberapa tempat, jadi lebih mudah untuk mengaturnya di satu tempat.
  • TLS_HOSTNAME= "$(echo ${WORDPRESS_URL} | cut -d'/' -f3)" - nama host sistem, diambil dari variabel WORDPRESS_URL. Digunakan untuk mendapatkan sertifikat TLS/SSL yang sesuai dari Let's Encrypt serta verifikasi internal WordPress.
  • NGINX_CONF_DIR="/etc/nginx" - jalur ke direktori dengan pengaturan NGINX, termasuk file utama nginx.conf.
  • CERT_DIR="/etc/letsencrypt/live/${TLS_HOSTNAME}" β€” jalur ke sertifikat Let's Encrypt untuk situs WordPress, diperoleh dari variabel TLS_HOSTNAME.

Menetapkan nama host ke server WordPress

Skrip menyetel nama host server agar cocok dengan nama domain situs. Ini tidak diperlukan, tetapi akan lebih mudah mengirim email keluar melalui SMTP saat menyiapkan satu server, seperti yang dikonfigurasi oleh skrip.

kode skrip

# 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

Menambahkan nama host ke /etc/hosts

Tambahan WP-Cron digunakan untuk menjalankan tugas berkala, mengharuskan WordPress untuk dapat mengakses dirinya sendiri melalui HTTP. Untuk memastikan WP-Cron berfungsi dengan benar di semua lingkungan, skrip menambahkan baris ke file / Etc / hostssehingga WordPress dapat mengakses dirinya sendiri melalui antarmuka loopback:

kode skrip

# 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 %sn127.0.0.1 %sn" "${TLS_HOSTNAME}" "${TLS_HOSTNAME}" >> /etc/hosts
fi

Memasang alat yang diperlukan untuk langkah selanjutnya

Skrip lainnya membutuhkan beberapa program dan menganggap repositori sudah diperbarui. Kami memperbarui daftar repositori, setelah itu kami menginstal alat yang diperlukan:

kode skrip

# 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

Menambahkan Unit NGINX dan Repositori NGINX

Skrip menginstal NGINX Unit dan open source NGINX dari repositori resmi NGINX untuk memastikan versi dengan patch keamanan terbaru dan perbaikan bug digunakan.

Skrip menambahkan repositori Unit NGINX dan kemudian repositori NGINX, menambahkan kunci repositori dan file konfigurasi apt, menentukan akses ke repositori melalui Internet.

Instalasi sebenarnya dari NGINX Unit dan NGINX terjadi di bagian selanjutnya. Kami menambahkan repositori terlebih dahulu sehingga kami tidak perlu memperbarui metadata berkali-kali, yang membuat penginstalan lebih cepat.

kode skrip

# 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

Menginstal NGINX, Unit NGINX, PHP MariaDB, Certbot (Let's Encrypt) dan dependensinya

Setelah semua repositori ditambahkan, perbarui metadata dan instal aplikasi. Paket yang diinstal oleh skrip juga menyertakan ekstensi PHP yang direkomendasikan saat menjalankan WordPress.org

kode skrip

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

Menyiapkan PHP untuk digunakan dengan NGINX Unit dan WordPress

Skrip membuat file pengaturan di direktori conf.d. Ini menetapkan ukuran maksimum untuk unggahan PHP, menyalakan keluaran kesalahan PHP ke STDERR sehingga akan ditulis ke log Unit NGINX, dan memulai ulang Unit NGINX.

kode skrip

# 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

Menentukan Pengaturan Database MariaDB untuk WordPress

Kami telah memilih MariaDB daripada MySQL karena memiliki lebih banyak aktivitas komunitas dan kemungkinan juga demikian memberikan kinerja yang lebih baik secara default (mungkin, semuanya lebih sederhana di sini: untuk menginstal MySQL, Anda perlu menambahkan repositori lain, kira-kira. Penerjemah).

Skrip membuat database baru dan membuat kredensial untuk mengakses WordPress melalui antarmuka loopback:

kode skrip

# 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;"

Menginstal Program CLI WordPress

Pada langkah ini, skrip menginstal program WP-CLI. Dengannya, Anda dapat menginstal dan mengelola pengaturan WordPress tanpa harus mengedit file secara manual, memperbarui database, atau masuk ke panel kontrol. Itu juga dapat digunakan untuk menginstal tema dan add-on dan memperbarui WordPress.

kode skrip

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

Menginstal dan mengkonfigurasi WordPress

Skrip menginstal versi terbaru WordPress di direktori /var/www/wordpressdan juga mengubah pengaturan:

  • Koneksi basis data berfungsi melalui soket domain unix alih-alih TCP di loopback untuk mengurangi lalu lintas TCP.
  • WordPress menambahkan awalan https:// ke URL jika klien terhubung ke NGINX melalui HTTPS, dan juga mengirimkan nama host jarak jauh (sebagaimana disediakan oleh NGINX) ke PHP. Kami menggunakan sepotong kode untuk mengatur ini.
  • WordPress membutuhkan HTTPS untuk login
  • Struktur URL default didasarkan pada sumber daya
  • Menetapkan izin yang benar pada sistem file untuk direktori WordPress.

kode skrip

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

Menyiapkan Unit NGINX

Skrip mengonfigurasi Unit NGINX untuk menjalankan PHP dan memproses jalur WordPress, mengisolasi ruang nama proses PHP dan mengoptimalkan pengaturan kinerja. Ada tiga fitur yang harus diperhatikan di sini:

  • Dukungan untuk ruang nama ditentukan oleh kondisi, berdasarkan pemeriksaan bahwa skrip berjalan dalam sebuah wadah. Ini diperlukan karena sebagian besar penyiapan kontainer tidak mendukung pengoperasian kontainer bersarang.
  • Jika ada dukungan untuk ruang nama, nonaktifkan ruang nama tersebut jaringan. Ini untuk memungkinkan WordPress terhubung ke kedua titik akhir dan tersedia di web secara bersamaan.
  • Jumlah maksimum proses didefinisikan sebagai berikut: (Memori yang tersedia untuk menjalankan MariaDB dan NGINX Uniy)/(Batas RAM di PHP + 5)
    Nilai ini diatur dalam pengaturan NGINX Unit.

Nilai ini juga menyiratkan bahwa selalu ada setidaknya dua proses PHP yang berjalan, yang penting karena WordPress membuat banyak permintaan asinkron untuk dirinya sendiri, dan tanpa proses tambahan, menjalankan misalnya WP-Cron akan rusak. Anda mungkin ingin menambah atau mengurangi batas ini berdasarkan setelan lokal Anda, karena setelan yang dibuat di sini bersifat konservatif. Pada sebagian besar sistem produksi, pengaturannya antara 10 dan 100.

kode skrip

if [ "${container:-unknown}" != "lxc" ] && [ "$(grep -m1 -a container=lxc /proc/1/environ | tr -d '')" == "" ]; 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

Menyiapkan NGINX

Mengonfigurasi Pengaturan NGINX Dasar

Skrip membuat direktori untuk cache NGINX dan kemudian membuat file konfigurasi utama nginx.conf. Perhatikan jumlah proses handler dan pengaturan ukuran maksimal file untuk upload. Ada juga baris yang menyertakan file pengaturan kompresi yang ditentukan di bagian selanjutnya, diikuti dengan pengaturan caching.

kode skrip

# 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

Menyiapkan kompresi NGINX

Mengompresi konten dengan cepat sebelum mengirimkannya ke klien adalah cara yang bagus untuk meningkatkan kinerja situs, tetapi hanya jika kompresi dikonfigurasi dengan benar. Bagian skrip ini didasarkan pada pengaturan karenanya.

kode skrip

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

Menyiapkan NGINX untuk WordPress

Selanjutnya, skrip membuat file konfigurasi untuk WordPress default.conf di katalog conf.d. Ini dikonfigurasi di sini:

  • Mengaktifkan sertifikat TLS yang diterima dari Let's Encrypt melalui Certbot (pengaturannya ada di bagian selanjutnya)
  • Mengonfigurasi pengaturan keamanan TLS berdasarkan rekomendasi dari Let's Encrypt
  • Aktifkan permintaan lewati caching selama 1 jam secara default
  • Nonaktifkan pencatatan akses, serta pencatatan kesalahan jika file tidak ditemukan, untuk dua file yang sering diminta: favicon.ico dan robots.txt
  • Cegah akses ke file tersembunyi dan beberapa file . Phpuntuk mencegah akses ilegal atau start yang tidak disengaja
  • Nonaktifkan logging akses untuk file statis dan font
  • Pengaturan tajuk Akses-Kontrol-Izinkan-Asal untuk file font
  • Menambahkan perutean untuk index.php dan statika lainnya.

kode skrip

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

Menyiapkan Certbot untuk sertifikat dari Let's Encrypt dan memperbaruinya secara otomatis

Certbot adalah alat gratis dari Electronic Frontier Foundation (EFF) yang memungkinkan Anda memperoleh dan memperbarui sertifikat TLS secara otomatis dari Let's Encrypt. Skrip melakukan hal berikut untuk mengonfigurasi Certbot untuk memproses sertifikat dari Let's Encrypt di NGINX:

  • Menghentikan NGINX
  • Mengunduh setelan TLS yang direkomendasikan
  • Menjalankan Certbot untuk mendapatkan sertifikat untuk situs tersebut
  • Mulai ulang NGINX untuk menggunakan sertifikat
  • Mengonfigurasi Certbot agar berjalan setiap hari pada pukul 3 untuk memeriksa apakah sertifikat perlu diperpanjang, dan jika perlu, unduh sertifikat baru dan mulai ulang NGINX.

kode skrip

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

Kustomisasi tambahan untuk situs Anda

Kami berbicara di atas tentang bagaimana skrip kami mengonfigurasi Unit NGINX dan NGINX untuk melayani situs siap produksi dengan TLSSSL diaktifkan. Anda juga dapat, tergantung pada kebutuhan Anda, menambahkan di masa mendatang:

  • Mendukung Brotli, peningkatan kompresi on-the-fly melalui HTTPS
  • ModSecurity с aturan untuk wordpressuntuk mencegah serangan otomatis di situs Anda
  • backup untuk WordPress yang cocok untuk Anda
  • Perlindungan melalui AppArmor (di Ubuntu)
  • Postfix atau msmtp agar WordPress dapat mengirim email
  • Memeriksa situs Anda sehingga Anda memahami berapa banyak lalu lintas yang dapat ditanganinya

Untuk kinerja situs yang lebih baik lagi, kami sarankan untuk meningkatkan ke NGINX Ditambah, produk komersial kelas perusahaan kami berdasarkan NGINX sumber terbuka. Pelanggannya akan menerima modul Brotli yang dimuat secara dinamis, serta (dengan biaya tambahan) WAF Keamanan Mod NGINX. Kami juga menawarkan Perlindungan Aplikasi NGINX, modul WAF untuk NGINX Plus berdasarkan teknologi keamanan terdepan di industri dari F5.

NB Untuk dukungan situs yang sarat muatan, Anda dapat menghubungi spesialis Southbridge. Kami akan memastikan pengoperasian situs web atau layanan Anda yang cepat dan andal di bawah beban apa pun.

Sumber: www.habr.com