سکریپټ د سایټ د ډومین نوم سره سمون لپاره د سرور کوربه نوم ټاکي. دا اړینه نه ده، مګر دا د 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
# 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
# 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 واحد، PHP ماریاDB، Certbot (راځئ چې کوډ کړئ) او د دوی انحصار نصب کړئ
یوځل چې ټول ذخیره اضافه شي ، میټاډاټا تازه کړئ او غوښتنلیکونه نصب کړئ. د سکریپټ لخوا نصب شوي کڅوړې کې د PHP توسیع هم شامل دي کله چې WordPress.org چلول وړاندیز شوي
سکریپټ کوډ
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 واحد او WordPress سره کارولو لپاره د پی ایچ پی تنظیم کول
سکریپټ په لارښود کې د ترتیباتو فایل رامینځته کوي موندل. دا د PHP اپلوډونو لپاره اعظمي اندازه ټاکي، د پی ایچ پی غلطی تولید STDERR ته بدلوي نو دوی به د NGINX واحد لاګ ته ولیکل شي، او د 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
د ورډپریس لپاره د ماریا ډی بی ډیټابیس تنظیمات مشخص کول
موږ د MySQL په اړه ماریا ډی بی غوره کړی ځکه چې دا د ټولنې ډیر فعالیت لري او احتمال هم لري د ډیفالټ لخوا غوره فعالیت چمتو کوي (شاید، دلته هرڅه ساده دي: د MySQL نصبولو لپاره، تاسو اړتیا لرئ یو بل ذخیره اضافه کړئ، نږدې ژباړن).
سکریپټ یو نوی ډیټابیس رامینځته کوي او د لوپ بیک انٹرفیس له لارې ورڈپریس ته لاسرسي لپاره اسناد رامینځته کوي:
سکریپټ کوډ
# 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;"
د ورڈپریس CLI برنامه نصب کول
پدې مرحله کې ، سکریپټ برنامه نصبوي WP 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
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 واحد تنظیم کول
سکریپټ د PHP چلولو او د ورڈپریس لارې پروسس کولو لپاره د NGINX واحد تنظیموي، د PHP پروسې نوم ځای جلا کوي او د فعالیت ترتیبات غوره کوي. دلته د لیدلو لپاره درې ځانګړتیاوې شتون لري:
د نوم ځایونو لپاره ملاتړ د شرایطو له مخې ټاکل کیږي، د دې چک کولو پر بنسټ چې سکریپټ په کانتینر کې روان دی. دا اړینه ده ځکه چې ډیری کانټینر تنظیمات د کانټینرونو د نیست شوي لانچ ملاتړ نه کوي.
که د نوم ځای لپاره ملاتړ شتون ولري، د نوم ځای غیر فعال کړئ شبکه. دا د دې لپاره دی چې WordPress ته اجازه ورکړي چې دواړه پای ټکي سره وصل شي او په ورته وخت کې په ویب کې شتون ولري.
د پروسې اعظمي شمیر په لاندې ډول تعریف شوی: (د MariaDB او NGINX Uniy چلولو لپاره موجود حافظه) / (په پی ایچ پی + 5 کې د رام حد)
دا ارزښت د NGINX واحد ترتیباتو کې ټاکل شوی.
دا ارزښت دا هم په ګوته کوي چې تل لږترلږه دوه د پی ایچ پی پروسې پرمخ ځي، کوم چې مهم دي ځکه چې ورڈپریس ځان ته ډیری غیر متناسب غوښتنې کوي، او د اضافي پروسو پرته، د مثال په توګه د 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. د سمبالونکي پروسو شمیر او د اپلوډ لپاره د اعظمي فایل اندازې ترتیب ته پام وکړئ. دلته یو کرښه هم شتون لري چې پکې د کمپریشن ترتیبات فایل شامل دي چې په راتلونکې برخه کې تعریف شوي، د کیچ کولو ترتیبات تعقیبوي.
مراجعینو ته د لیږلو دمخه په الوتنه کې د مینځپانګې فشارول د سایټ فعالیت ښه کولو عالي لاره ده ، مګر یوازې هغه وخت چې کمپریشن په سمه توګه تنظیم شوی وي. د سکریپټ دا برخه د ترتیباتو پراساس ده له دې ځایه.
سکریپټ کوډ
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
د WordPress لپاره د NGINX تنظیم کول
بیا، سکریپټ د ورڈپریس لپاره د ترتیب کولو فایل جوړوي default.conf په کتالګو کې موندل. دا دلته ترتیب شوی دی:
د لیټس انکریپټ څخه د Certbot له لارې ترلاسه شوي د TLS سندونو فعالول (د دې تنظیم کول به په راتلونکي برخه کې وي)