Để cài đặt WordPress với tên miền mới trên VPS/Cloud server khá là nhiều thao tác mất thời gian. Thế là tôi quyết định làm một Shell Script làm tất tần tật những việc đó.

Script create-wpblog.sh thực hiện những công việc sau:
- Tạo file cấu hình Apache VirtualHost cho domain mới hỗ trợ PHP và CGI.
- Tạo chứng chỉ SSL miễn phí thông qua dịch vụ Let’s Encrypt.
- Cài đặt WordPress.
Mục lục
Cấu hình tên miền trỏ về web server
Đây là công việc duy nhất phải làm bằng tay, bởi vì mỗi nhà cung cấp tên miền sẽ có Control Panel để cấu hình tương ứng. Tôi cũng không đề cập cách làm cụ thể ở đây.
Chỉ lưu ý là sau khi cấu hình tên miền xong thì nên đợi khoảng 5 phút (nhiều khi lâu hơn) để DNS được cập nhật đầy đủ. Vì nếu không không những bạn không truy cập được mà còn dính DNS cache trên máy client.
Chuẩn bị môi trường
Chương trình này cần một số dependencies:
- LAMP (Linux Apache2, MariaDB, PHP)
- certbot
- wp-cli
Tạo chứng chỉ SSL
Mặc định Apache2 có một web root, ví dụ trên Debian sẽ là /var/www/html. Ta sẽ sử dụng web root này để tạo chứng chỉ SSL cho các tên miền gắn với Server này bằng lệnh certbot.
/usr/local/bin/create-cert.sh
#!/bin/bash
# create-cert.sh [-a ALIASES ] [-m EMAIL] DOMAIN
# @author Nguyen Hong Hai
#
WEBROOT=/var/www/html
while getopts ":a:m:" o; do
case "${o}" in
a )
# comma separated domain aliases
ALIASES="${OPTARG}"
;;
m )
EMAIL="${OPTARG}"
;;
\? )
echo "Invalid Option: -${OPTARG}" 1>&2
exit 1
;;
: )
echo "Invalid Option: -${OPTARG} requires an argument" 1>&2
exit 1
;;
esac
done
shift $((OPTIND-1))
DOMAIN="${1}"
certbot_ARGS=( certonly --non-interactive --webroot --agree-tos -w "${WEBROOT}" --expand -d "${DOMAIN}" )
if [ ! -z "${ALIASES}" ]; then
IFS=',' read -ra ALIASES <<< "${ALIASES}"
for domain in "${ALIASES[@]}"; do
certbot_ARGS+=( -d "${domain}" )
done
fi
if [ ! -z "${EMAIL}" ]; then
certbot_ARGS+=( -m "${EMAIL}" )
else
certbot_ARGS+=( --register-unsafely-without-email )
fi
certbot "${certbot_ARGS[@]}"
Tạo Apache2 VirtualHost
Ở đây file cấu hình VirtualHost sẽ được tự động sinh từ một template như dưới đây. Tất nhiên bạn có thể chỉnh sửa nếu muốn.
/etc/icreativ/sample-vhost.conf
<VirtualHost *:80>
ServerName __MY_DOMAIN__
ServerAlias __MY_ALIASES__
ServerAdmin __MY_EMAIL__
DocumentRoot __MY_HTDOCS__
<Directory __MY_HTDOCS__>
Options MultiViews SymLinksIfOwnerMatch IncludesNoExec
AllowOverride All
Require all granted
php_admin_flag engine On
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName __MY_DOMAIN__
ServerAlias __MY_ALIASES__
ServerAdmin __MY_EMAIL__
DocumentRoot __MY_HTDOCS__
<Directory __MY_HTDOCS__>
Options MultiViews SymLinksIfOwnerMatch IncludesNoExec
AllowOverride All
Require all granted
php_admin_flag engine On
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/__MY_CERT__/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/__MY_CERT__/privkey.pem
</VirtualHost>
</IfModule>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
Các biến __MY_DOMAIN__, __MY_ALIASES__, __MY_EMAIL__, __MY_HTDOCS__ và __MY_CERT__ sẽ được script dưới đây xử lý thay thế tương ứng với tham số truyền vào.
Script create-vhost.sh tạo file VirtualHost theo template nêu trên và sẽ xin phép tạo chứng chỉ SSL bằng create-cert.sh nếu tên miền và các domain alias chưa được đăng ký.
/usr/local/bin/create-vhost.sh
#!/bin/bash
# create-vhost.sh [-a ALIASES ] [-w WEBROOT ] [-m EMAIL] DOMAIN
# @author Nguyen Hong Hai
#
CONFIG_TEMPLATE="/etc/icreativ/template-vhost.conf"
# Escape SED command input
sed_esc()
{
echo "$@" | sed -e 's/[]\/$*.^[]/\\&/g'
}
while getopts ":a:m:w:" o; do
case "${o}" in
a )
# Comma separated domain aliases
ALIASES="${OPTARG}"
;;
m )
EMAIL="${OPTARG}"
;;
w )
WEBROOT="${OPTARG}"
;;
\? )
echo "Invalid Option: -${OPTARG}" 1>&2
exit 1
;;
: )
echo "Invalid Option: -${OPTARG} requires an argument" 1>&2
exit 1
;;
esac
done
shift $((OPTIND-1))
DOMAIN="${1}"
certbot_ARGS=( certificates -d "${DOMAIN}")
if [ ! -z "${ALIASES}" ]; then
IFS=',' read -ra DOMAINS <<< "${ALIASES}"
for domain in "${DOMAINS[@]}"; do
certbot_ARGS+=( -d "${domain}" )
done
fi
sed_ARGS=( -r )
sed_ARGS+=( -e "s/__MY_DOMAIN__/$(sed_esc "${DOMAIN}")/g" )
sed_ARGS+=( -e "s/__MY_EMAIL__/$(sed_esc "${EMAIL}")/g" )
sed_ARGS+=( -e "s/__MY_HTDOCS__/$(sed_esc "${WEBROOT}")/g" )
if [ ! -z "${ALIASES}" ]; then
sed_ARGS+=( -e "s/__MY_ALIASES__/$(sed_esc "${DOMAINS[@]}")/" )
else
# Remove ServerAlias directive
sed_ARGS+=( -e "/.*__MY_ALIASES__.*/d" )
fi
while :; do
# Find existing certificate for the following domains
CERTS=( $(certbot "${certbot_ARGS[@]}" 2>/dev/null | \
grep 'Certificate Name: ' | \
sed -r -e 's/^\s+Certificate Name: //g') )
if [ -z "${CERTS}" ]; then
read -p "No available SSL certificate. Type 'c' to create: " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Cc]$ ]]; then
# Attempt to obtain a Let's Encrypt SSL certificate
create-cert.sh -a "${ALIASES}" -m "${EMAIL}"
else
# Remove the HTTPS settings
sed_ARGS+=(-e '/^<IfModule mod_ssl.c>$/,$d')
break
fi
else
sed_ARGS+=( -e "s/__MY_CERT__/$(sed_esc "${CERTS[-1]}")/g" )
break
fi
done
echo "================================================================="
echo "VirtualHost: ${APACHE_SITE_CONF}"
echo "================================================================="
sed "${sed_ARGS[@]}" ${CONFIG_TEMPLATE} | tee ${APACHE_SITE_CONF}
a2ensite ${DOMAIN}.conf
systemctl reload apache2
Cài đặt WordPress
Chương trình sử dụng script wp-install.sh hỗ trợ cài đặt WordPress bằng wp-cli.
Script cài đặt nhanh website WordPress
Với những công cụ hỗ trợ ở trên, quy trình cài đặt nhanh một trang WordPress của tôi có thể được tóm gọn trong một script đơn giản như sau:
/usr/local/bin/create-wpblog.sh
#!/bin/bash
# create-wpblog.sh DOMAIN WEBROOT SITEURL
# @author Nguyen Hong Hai
#
DOMAIN="${1}"
WEBROOT="${2}"
WP_SITE_URL="${3}"
ALIASES="www.${DOMAIN}"
WEBMASTER_EMAIL="webmaster@hainh.me"
WP_SITE_NAME="WordPress"
WP_ADMIN_USER="icreativ"
WP_ADMIN_EMAIL="webmaster@hainh.me"
mkdir -p ${WEBROOT}
chown www-data:www-data ${WEBROOT}
create-vhost.sh -a "${ALIASES}" -m "${EMAIL}" -w "${WEBROOT}" "${DOMAIN}"
# Install WordPress as the user www-data
su -u www-data -i -- wp-install.sh \
-t "${WP_SITE_NAME}" \
-l "${WP_SITE_URL}" \
-u "${WP_ADMIN_USER}" \
-m "${WP_ADMIN_EMAIL}"
Phân quyền executable cho script.
sudo chmod +x \
/usr/local/bin/create-cert.sh \
/usr/local/bin/create-vhost.sh \
/usr/local/bin/create-wpblog.sh
Cách sử dụng
$ sudo create-wpblog.sh mydomain.com /home/mydomain.com/public_html https://mydomain.com
Sau khi cài đặt xong, bạn có thể truy cập website qua địa chỉ https://mydomain.com.








