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.
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.
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
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
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.