áááľáá¨áľá áĽáá´áľ áĽáá°ááá áĽá áááŞáŤáá˝ á áᣠááá ááá âWordPress installâ áá° ááá˝ áááŽá á¨áá á áá¤áľ áŤáľáááᢠááá áá, á áĽáááą, á ááŤá¨áá¸á á áŁá áĽááľ áĽáŠ áááŞáŤáá˝ á á, á áá áá á¨áľ WordPress áĽá áľá áŤááá áľááá° ááá áá¨á á áá áá°áá áĽáá˛á˝á ááŤá áĽá áááá áá˝áá. ááááŁáľ áľááááááš ááźáśá˝ á á°áá°á ááááśá˝ áá á áŁá áĽáá áá¸á, ááá áá á¨ááá áľ ááááŤáľ áááá ááĽáŤáŞáŤ á˝ááá áááá ἠá áľá¸á᪠áŤá°áááá.
á áá
á˝áá ááľáĽ áááľáá¨áľá á áĄáĄááą áá á áŤáľ á°á áááŤá ᨠbash áľááŞááľ á áá
á¨áĽ á¨áááąá á áá áááŚá˝á áááŁáá áĽááááŤáá áĽáá˛áá á áĽáᨠááááłá˝á áĽáŤááłááą ááá á¨áá°áŤáá áĽáá˛áá áĽáąá á áááááľ áá áŤá°á¨áááá áľááááľ á ááĽáŤáŤáľ . á¨áá á°á áá á¨ááá á¨á˝ááá á˝áá áááá áľá˝ááá
ᨠNGINX áááá á áá áá áááľáá¨áľá ááá°ááŤáľ á¨á°áááŁá á ááá´áá¸á á ááľáĽ á°áááżá::
- WordPress CLI
- ᨠTLSSSL á°áá°ááŹáśá˝á áĽáááľáĽá
- á¨ááľáá áá¨ááśá˝á á áŤáľ á°á áĽáľáłáľ
- NGINX áá¸ááŤ
- NGINX áááááŤ
- HTTPS áĽá HTTP/2 áľáá
- á¨áá°áľ áŤáľ-á°á
á˝áá á á ááľ á áááá áá ááŤáá áááááᣠáĽáąá á á°ááłáłá áá á¨áááááłááľ ááŽá°á˛áá á ááááᣠáá¤á˝á ááŽá°á˛áá á áááá áĽá á¨ááἠááł áŤáľá°áááłáᢠá ááŤáł áááŁá á áľá°áááá˝á áĽá á áááááśá˝á á¨áá°áá áááľ ááá°ááą áľáá áááľ ááᢠá áĽááá á˝ááá˝ ááľáĽ áľáááá ááá áĽááľáá˝á á¨ááá á á áľá°áŤá¨áśáš ááľáĽ ááťá.
ááľáááśá˝
- ááŤáŁ á áááá (
á¤á.á˛.Რáááá¤á.á¤áľ.á˛. )ᣠá¨áášáá áá˝áᣠááá á˘áŤááľ 512MB RAM áĽá áĄáĄááą 18.04 ááá á¨á፠á áá á¨á°áŤá áá°á á á¨áĽá¨áľ á ááááᢠ- á áááá¨áĽ á°á°áŤá˝ áá°áŚá˝ 80 áĽá 443
- á¨áá á áááá ááá á áá á áľáŤáť áá á¨á°ááłá á¨á፠áľá
- áľáá ááłá¨áť (áąáś)á˘
á¨ááá á á ááá áĽááł
á ááá´áá¸á á¨á°áááá áá á°ááłáłá ááá˘
á á ááá áááŞáŤáá˝
- á áľááŞááľ ááľáĽ áŤá áĽá á¨áááá áľáĽááá˝ á idempotency á¨á°á áááᥠáľááŞááą áá°á á˛á á¨áá áŠáľá ááźáśá˝ á¨ááá¨á á á°á áłáŤáľá¨áľá áĽá áá áá°áŤ áá˝ááá˘
- áľááŞááą áśááľááŽá˝á á¨áá¨ááťáá˝ áááŤá ááááŤáᣠáľááá
á¨áľáááľ ááááá˝á á á ááľ áľááá áá°áá á áá˝áá (
apt upgrade
ááĄáĄááą)ᢠ- áľááááš á áŽáá´ááá ááľáĽ áĽá¨áŽáĄ áááá¸áá áááá ááááŤá áľááá á ááĽáŽáťá¸áá á áá áá°á¨áľ ááá¨á áá˝ááá˘
- á á ááĽáŽá˝ ááľáĽ ááááá á¨áá áá°áśá˝á ááĽá ááááááľ áľááŞááą á ááŤáŁáὠᣠá á¨áášáá áá˝áá˝ áĽá á áááľáá á ááááŽá˝ ááľáĽ áááľáŤáľ á ááśáá˛á ááźáśá˝á áááááľ ááááŤáá˘
- ááźáśá˝á áľáááá˝ á ááááŞáŤ áľá á ááśáá˝á áĽááľáŁáá, áá á á¨áŤáľáá áá á¨á° áááľ áĽáá° áŽáľ áááá á áá°á¨áľ áááá áĽáá á°áľá áĽáá°áááá.
- ááá áľáááá˝ áĽáá° á°á áá áá á¨áááąáľá˘ áĽá, ááááŤáąá áá°á¨áłá á¨áľáááľ á ááĽáŽá˝á áľáááááŠ, áá á ááĽáł WordPress áĽáá° áá°á á á°á áá áá°áŤá.
á¨á áŤáŁá˘ á°ááááŽá˝á áááá á
áľááŞááąá á¨áááľá á ááľ á¨áá¨á°ááľá á¨á áŤáŁá˘ á°ááááŽá˝ áŤáááá˘
WORDPRESS_DB_PASSWORD
- á¨áááľáá¨áľ áłáłá¤á ááá ááWORDPRESS_ADMIN_USER
- á¨áááľáá¨áľ á áľá°áłáłáŞ áľáWORDPRESS_ADMIN_PASSWORD
- á¨áááľáá¨áľ á áľá°áłáłáŞ ááá ááWORDPRESS_ADMIN_EMAIL
- á¨áááľáá¨áľ á áľá°áłáłáŞ á˘áááWORDPRESS_URL
ᨠááᎠᨠWordPress áŁá˘áŤ áá áŠá áá¤á ááá˘https://
.LETS_ENCRYPT_STAGING
- á ááŁáŞ áŁáś ááá áá áĽá´áąá áá° 1 á áááááľ á´á˛áááá á˛ááአá á°á°ááá á¨ááľáá áá¨ááśá˝á ááá á¨á á áľááá á¨áááľá Let's Encrypt staging serversá áľá áááá ᣠáŤááá áá á˘áááŞááľ áĽááľáá á áĽá áĽáŤááá˝ á¨á°ááł á¨á á á á áľáŤáťá á áááá áááá áá˝ááᢠ.
áľááŞááą áĽááá
á¨áááľáá¨áľ áá á¨á°ááá á°ááááŽá˝ áááááłá¸áá áŤá¨áááŁá áĽá áŤááá áááŁáąá áŤá¨áááŁáá˘
á¨áľááŞááľ ááľááŽá˝ 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 áá áŤáá áľááŞááľ áľáááááá á¨áááľáá¨áľ CLI ááá ááŤáá ááá¨ááἠáá áá áĽá´áľ áá áááá˘UPLOAD_MAX_FILESIZE="16M"
- á WordPress ááľáĽ áá°áá á¨áá˝á á¨áá°áá á¨ááá áá áᢠáá á ááĽá á á°ááŤáŠ áŚáłáá˝ áĽá á áá ááááᣠáľááá á á ááľ áŚáł áá áááá ááá ááá˘TLS_HOSTNAME= "$(echo ${WORDPRESS_URL} | cut -d'/' -f3)"
- á¨áľáááą á áľá°ááá áľáᣠá¨WORDPRESS_URL á°áááá á¨á°ááᢠá°áá˘áá á¨TLS/SSL á°áá°ááŹáśá˝á ᨠLet's Encrypt áĽá áĽáá˛áá á¨ááľáĽ á¨áááľáá¨áľ áá¨áá፠áááááľ áá á ááá˘NGINX_CONF_DIR="/etc/nginx"
- áááá ááá á¨áᎠᨠNGINX á ááĽáŽá˝ áá áá° áááŤá á¨áááľá°á ááááľnginx.conf
.CERT_DIR="/etc/letsencrypt/live/${TLS_HOSTNAME}"
- á¨á°áááá á¨á°áá ááááľáá¨áľ áŁá˘áŤ á¨ááľáá áá¨ááśá˝á áĽáááľáĽá á¨áááľá°á ááááľTLS_HOSTNAME
.
á¨á áľá°ááá áľá ááááľáá¨áľ á áááá ááá°áĽ
áľááŞááą á¨á ááááŠá á áľá°ááá áľá á¨áŁá˘áŤá á፠áľá áá áĽáá˛áááľ áŤááááᢠáá á áŤáľááááᣠááá áá á áľááŞááą áĽáá°á°ááᨠá ááľ á áááá á˛áŤáá አá¨á᪠á°áĽáłá¤ á SMTP á áŠá áááá á¨á áá ááš ááá˘
á¨áľááŞááľ áŽáľ
# 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
á¨á áľá°ááá áľá áá° /etc/hosts á áá¨á áá
á°á¨ááŞ
á¨áľááŞááľ áŽáľ
# 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
áááŁá á°á¨ááá˝ á¨ááŤáľááááľá ááłáŞáŤáá˝ ááŤá
á¨á°áá¨á áľááŞááľ á ááłááľ ááŽááŤáá˝á ááááá áĽá áá¨ááťááš á¨á°ááá áá¸á áĽá áŤáľáŁáᢠá¨áá áŤáááŤáá˝á áááá áĽááááááá ᣠá¨á፠á áá á áľááááášá ááłáŞáŤáá˝ áĽáááááá-
á¨áľááŞááľ áŽáľ
# 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 ááá áĽá NGINX áá¨ááťáá˝á á áá¨á áá
áľááŞááą á¨á áἠááááš á¨á°á áááľ áá áááá˝ áĽá á¨áłá፠áĽáááá˝ áĽá á áá áááá¸áá ááá¨ááἠá¨áŚáá´ááá á¨NGINX áá¨ááťáá˝ NGINX Unit áĽá áááľ ááá NGINX ááááá˘
áľááŞáṠᨠNGINX áŠááľ áá¨ááť áĽá ᨠNGINX áá¨ááťá áá¨ááŤááŁá¨áá¨ááťáá˝ ááá áĽá á¨áááá áááá˝á áá¨ááŤáᢠapt
, á á áááá¨áĽ á áŠá áá° áá¨ááťáá˝ ááłá¨áťá ááá°á.
áľááááá ᨠNGINX áŠááľ áĽá NGINX ááŤá á áááĽáá ááá áá¨á°áłáᢠááłáłáłáá áĽá áá áĽááłáááá áááľá¨á áá¨ááťáášá á áľááľáá áĽáá¨ááŤááᣠáá á ááŤáá ááŁá áŤá°ááááá˘
á¨áľááŞááľ áŽáľ
# 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 (áĽáááľáĽá) áĽá áĽááááťá¸áá á ááŤá áá
á áá´ ááá áá¨ááťáá˝ á¨á°á¨áአááłáłáłáá áŤááá áĽá áá°áá áŞáŤáášá ááŤáᢠá áľááŞááą á¨á°áŤááľ áĽá áá˝ WordPress.orgá á˛áŤááą á¨ááá¨áŠáľá á¨PHP á áĽáŤáá˝áá áŤáŤáľáłá
á¨áľááŞááľ áŽáľ
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
áá¤á˝áá á¨NGINX áŠááľ áĽá á¨áááľáá¨áľ áá ááá áá áááá
áľááŞááą á áááŤá ááľáĽ á¨á ááĽáŽá˝ ááá áááĽáŤá conf.d. áá áPHP á°áááá˝ á¨áá°ááá áá á áŤááááᣠá¨PHP áľá á°áľ áá ááľá áá° STDERR áŤá áŤá áľááá áá° NGINX Unit áááἠááá áĽá ᨠNGINX áááá áĽáá°áá áŤáľáááŤáá˘
á¨áľááŞááľ áŽáľ
# 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
á WordPress ᨠMariaDB áłáłá¤á á ááĽáŽá˝á á áááá˝ áá
ááŞáŤ á˛á˘á ᨠMySQL á áá ááá áá ᣠááááŤáąá áĽá á¨áá
á á¨á°áĽ áĽáá
áľáá´ áľááá áĽá á á°á¨ááŞá ááá áá˝ááá˘
áľááŞááą á á˛áľ á¨ááἠááł áááĽáŤá áĽá áááľáá¨áľá á loopback á áááá˝ á áŠá áááľá¨áľ ááľááááśá˝á áááĽáŤááĄ
á¨áľááŞááľ áŽáľ
# 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 ááŽááŤáá á ááŤá áá
á áá
á°á¨á, áľááŞááą ááŽááŤáá áááá
á¨áľááŞááľ áŽáľ
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 á ááŤá áĽá áááá
áľááŞááą á¨á
áἠáááá á¨áááľáá¨áľ áĽáŞáľ á áá፠ááľáĽ ááááᢠ/var/www/wordpress
áĽá áĽáá˛áá á
ááĽáŽášá ááááŁá:
- á¨áá¨á ááą áááááľ á¨TCP áľáŤááá áááááľ á loopback áá á¨TCP ááá á áŠáááľ á፠áśáŹáľ áá áá°áŤáá˘
- WordPress á áľá á áĽáŤ áŤááá https:// á°áá áá˝ á¨NGINX á HTTPS á¨á°ááá áĽá á¨áááľ á áľá°ááá áľá (á NGINX áĽáá°áá¨á á) áá° PHP á¨áᨠáá° URLᢠáá áá ááááááľ á ááľ áŽáľ áĽáá áááá.
- WordPress ááááŁáľ HTTPS áŤáľááááá
- ááŁáŞá á¨áŠá áá¤á ááá á á ááĽá¨áśá˝ áá á¨á°áá°á¨á° ááá˘
- á WordPress áá፠áľáááá áááśá˝á á ááá áľáááą áá áŤááááá˘
á¨áľááŞááľ áŽáľ
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 áááá á áááááľ áá
áľááŞááą áá¤á˝áá áĽáá˛áŤááľ áĽá á¨áááľáá¨áľ ááááśá˝á áĽáá˛áŤáľáŹáľ á¨NGINX áááá áŤáá áŤááŁá¨PHP áá°áąá á¨áľá áŚáł ááĽá áĽá á¨á ááťá¸á á ááĽáŽá˝á áŤáťá˝ááᢠáĽáá ááłáŠ á¨áááŁá¸á áśáľáľ áŁá áŞáŤáľ á ááĄ
- áľááŞááą á áĽá ááŤá˘áŤ ááľáĽ áĽá¨á°áŤ áááá á ááŁáŤáľ áá á áááľá¨áľ á¨áľá áŚáłáá˝ áľáá á áááłáá˝ ááá°áá. áá á áľááá áá ááááŤáąá á áĽááá á¨áĽá ááŤá˘áŤ á áá áśá˝ á¨áá ááŤáŁáá˝á ááľááá á áá°áááá˘
- ááľá áŚáłáá˝ áľáá áŤá á¨áľá áŚáłáá áŤá°áááᢠá ááłá¨ áá¨áĽ. áá WordPress á¨áááąá á¨áá¨á¨áť ááĽáŚá˝ áá áĽáá˛ááá áĽá á á°ááłáłá áá á áľáŠ áá áĽáá˛áá áááľá¨á ááá˘
- á¨áá°áá á¨áá°áśá˝ áĽááľ áĽáá°áá¨á°áá ááááťá. (MariaDB áĽá NGINX Uniy á áááľáŹáľ á¨ááŤáľá˝á áá
á°á¨ áľááľáł)/(á¨áŤá áá°áĽ á PHP + 5)
áá áá á NGINX áŠááľ á áá áśá˝ ááľáĽ á°áááĽáŻáá˘
áá áĽá´áľ ááááá á˘áŤááľ áááľ á¨PHP áá°áśá˝ áĽáá°áááą áá áááᣠáá á áľááá áá ááááŤáąá WordPress áĽá áŤáá°ááłá°á áĽáŤááá˝á ááŤáą áľáááŤá°áá áĽá áŤá á°á¨á᪠áá°áśá˝ ᣠáááłá WP-Cron ááľááá ááá¨áŁáᢠá á áŤáŁá˘á á ááĽáŽá˝ áá á áááľá¨áľ áĽááá á áá°áŚá˝ áá¨áá ááá ááááľ áááá ááááᣠááááŤáąá áĽáá á¨á°áá áŠáľ á ááĽáŽá˝ áá á áĽáŁá áá¸áᢠá á áĽááááš á¨áááľ áľáááśá˝áŁ á áá áśáš á 10 áĽá á 100 ááŤá¨á áá¸áá˘
á¨áľááŞááľ áŽáľ
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
NGINX á áááá áá
áá°á¨áłá ᨠNGINX á ááĽáŽá˝á á áááá áá
áľááŞááą á NGINX áá¸á፠áá፠áááĽáŤá á¨ááŤá áááá á¨áá
á ááá áááĽáŤá nginx.conf
. áá°ááŁáŁáŞ áá°áśá˝ áĽááľ áĽá áááľáá á¨áá°áá á¨ááá áá á á
ááĽá áľáŠá¨áľ ááľáĄá˘ áĽáá˛áá á áááĽáá ááá á¨á°ááááá á¨ááá፠á
áá
áśá˝ áááá áĽá á¨áá¸á፠á
áá
áśá˝á á¨ááŤáŤáľáľ ááľáá á áá˘
á¨áľááŞááľ áŽáľ
# 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 áááá፠á áááááľ áá
áááąá áá° á°áá áá˝ á¨ááአá ááľ á á á¨áŤ áá áá¨ááá
á¨áŁá˘áŤá á áááá áááťáťá áĽáŠ ááááľ áá ᣠáá áááá
á áľááá á¨á°ááᨠáĽáť ááᢠáá
á¨áľááŞááą ááá á á
ááĽáŽá˝ áá á¨á°áá°á¨á° ááá˘
á¨áľááŞááľ áŽáľ
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 á°áá°ááŹáśá˝á ááá á (áááá á áááĽáá ááá ááľáĽ áááá)
- á¨á á˘áááŞááľ á áᥠáááŽá˝ áá á áááľá¨áľ á¨TLS á¨á°á áááľ á ááĽáŽá˝á á áááá áá
- á ááŁáŞááľ á1 á°á áľ á¨áá¸á፠áĽáŤááá˝á ááááá á áá
- ááááľ á¨á°áááą á¨á°á á¨á áááá˝áĄ- favicon.ico áĽá robots.txt á¨ááłá¨áť áááἠááľáłááťá áĽáá˛áá ááá áŤáá°áá á¨áľá á°áľ áááἠááľáłááťá áŤá°áááá˘
- á¨á°á°á á áááá˝á áĽá á ááłááľ áááá˝á ááľá¨áľá áá¨áááá .phpáá-áἠááłá¨áťá ááá áŤááłá°á á ááá ááá¨áá¨á
- á¨áááááłááą áĽá á¨á áá¸-ááá áááá˝á á¨ááłá¨áť áááἠááľáłááťá áŤá°áááá˘
- á¨áŤáľá á
ááĽá
á¨ááłá¨áť-ááĽáĽá-áááľ-áááť áá áá¸-ááá áááá˝ - áindex.php áĽá áááá˝ áľáłá˛áľá˛ááľ áááŞáŤá á áá¨á ááá˘
á¨áľááŞááľ áŽáľ
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
á°ááľáŚáľá á¨á á˘áááŞááľ áĽáááľáĽá áá á°áá°ááŹáśá˝ á áááááľ áĽá á áŤáľ-áĽáľáłáľ
- NGINXá áŤááá
- ááá¨áśá˝ á¨ááá¨áŠ á¨TLS á ááĽáŽá˝
- ááŁá˘áŤá á¨ááľáá áá¨ááśá˝á áááááľ Certbot á áŤáľáŹáłá
- á¨ááľáá áá¨ááśá˝á ááá áá NGINXá áĽáá°áá áŤáľáááŤáá˘
- á¨ááľáá áá¨ááśá˝ ááłá°áľ áŤááŁá¸á áááá°á˝ Certbot á á¨áá 3áĄ24 AM áá áĽáá˛á°áŤ áŤáá áŤáᣠáĽá á áľááá á¨áá á á˛áľ á¨ááľáá áá¨ááśá˝á áŤáááą áĽá NGINXá áĽáá°áá áŤáľáááŠá˘
á¨áľááŞááľ áŽáľ
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á ááááľ ááá á¨áá áŁá˘áŤ á TLSSSL áĽáá˛áŤáááá áĽáá´áľ áĽáá°ááŤáá á á¨áá á°áááá¨ááᢠáĽáá˛áá áĽáá° ááááśá˝á áá°ááľ áá¨á áá˝áááĄ
- áľáá
áĽáá ᣠá HTTPS áá á á á¨áŤ áá á¨á°áťáťá áááá፠Mod á°á áááľ Ńᨠwordpress á áá˝ á áŁá˘áŤá áá á ááśáá˛á áĽááśá˝á ááá¨áá¨áááľáŹ ááĽááľá á¨ááľáá ááááľáá¨áľáĽá á á áĽááá ááŞáá (á áĄáĄááą áá)- áááľáá¨áľ á°áĽáłá¤ ááá áĽáá˛á˝á Postfix ááá msmtp
- áá áŤá á áľáŤáá ááľá°áááľ áĽáá°áá˝á ááá¨áłáľ áŁá˘áŤáá á ááá°á˝ áá
áá°áťá á¨áŁá˘áŤ á ááťá¸áᣠáá° ááá
áĽááááŤáá
ááłá°á˘áŤ á áŁá á¨á°áŤá áŁá˘áŤá ááá°áá, áľááťááľáśá˝á ááááá áá˝áá
Southbridge . á ááááá áááľ ááľáĽ á¨áĽááľáá áľá áŁá˘áŤ ááá á áááááľ ááŁá áĽá á áľá°ááá á á áŤá áĽáá¨áááŁááá˘
ááá: hab.com