在 Google Compute Engine 上建立 WordPress教程
事前準備
目錄
- 建立 Compute Engine 執行個體
- 建立 Nginx + PHP + MariaDB 執行環境
- 設定 Nginx 與 PHP
- 安裝 WordPress
- 設定 HTTPS 與 HTTP/2
- Nginx 優化設定
建立 Compute Engine 執行個體
在左方選單列中選擇 Compute Engine 頁面
建立 VM 執行個體
建議設定大致如下:
- 區域:asia-east1-* 或 asia-northeast1-*
- asia-east1 的資料中心位於台灣彰化,對台灣地區的連線速度相當友善
- asia-northeast1 的資料中心位於日本東京,對有需要跨區 VPN 的用戶相當友善
- 機器類型:小型(1個共用 vCPU, 1.7 GB 記憶體)
- 因為 WordPress 普遍不是很吃效能(除非安裝太多插件),所以這邊選擇小型的機器方案。這邊要提的一點是,這邊的機器類型在未來都可以動態做變更,如果發現資源吃緊的話再往上升即可。
- 開機磁碟:新的 10 GB 標準永久磁碟 或 10GB SSD 永久磁碟
- 基本上對於個人網誌而言,磁碟的讀寫並不頻繁,這邊選用標準磁碟或 SSD 磁碟的差別並沒有很大。
- 映像檔:CentOS 7
- 視個人習慣,我喜歡 CentOS 7,以下的教學都會以 CentOS 7 為主。
- 身份及 API 存取權:預設
- 防火牆:允許 HTTP 流量 及 允許 HTTPS 流量
- 基本上會建議如果允許 HTTPS 流量時,都會建議允許 HTTP 流量,如此一來在後面設定 Nginx 讓 HTTP 使用者自動跳轉至 HTTPS 時才能正常運作。
- 其它進階設定
- 網路
- 外部 IP:請預約一個新的靜態 IP 位址
- 網路
接下來可能需要一點時間進行建置(大概 2~3 分鐘)
建立 Nginx + PHP + MariaDB 執行環境
利用 gcloud 以 ssh 登入上一步建立的 VM
可以利用管理介面的「查看 gcloud 指令」或是「在瀏覽器視窗中開啟」
gcloud 指令的格式大致如下:
gcloud compute --project "{PROJECT NAME}" ssh --zone "{PROJECT ZONE}" "{VM NAME}"
首次進入 VM,記得先使用 sudo yum update -y
更新系統
安裝 Nginx stable
設定官方套件源
建立 /etc/yum.repos.d/nginx.repo
檔案
檔案內容如下:
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgkey=http://nginx.org/keys/nginx_signing.key
gpgcheck=1
enabled=1
確認並安裝#
使用 yum info nginx 確認 nginx 是否為 1.10.*
確認版本無誤後,用以下指令安裝 nginx
sudo yum install -y nginx
啟動並設為開機自動啟用
sudo systemctl start nginx
sudo systemctl enable nginx
加入防火牆規則
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload
測試 Nginx 是否正常運作
本機測試
curl localhost
外部測試:利用 GCP 管理介面所提供的 IP 連線至該伺服(注意,請使用 http 協定)
安裝 PHP 7.1
加入 PHP 7.1 的套件源
sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
sudo rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
安裝 wordpress 所需的 PHP 套件
sudo yum install -y php71w-cli \
php71w-common \
php71w-fpm \
php71w-gd \
php71w-mbstring \
php71w-mysql \
php71w-opcache \
php71w-pdo \
php71w-xml \
php71w-xmlrpc
啟動 PHP-FPM 服務並設為開機自動啟用
sudo systemctl start php-fpm
sudo systemctl enable php-fpm
安裝 MariaDB
設定 MariaDB 官方套件源
建立 /etc/yum.repos.d/MaraiDB.repo
檔案
檔案內容如下:
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
確認並安裝
使用 yum info MariaDB-server
確認版本是否為 10.1.*
sudo yum install -y MariaDB-server
啟動 MariaDB 並設為開機自動啟用
sudo systemctl start mariadb
sudo systemctl enable mariadb
設定 MariaDB
sudo mysql_secure_installation
這邊記得設定 root 密碼,其它都照預設值走。
確認 MariaDB 安裝
mysql -u root -p
# Enter 後輸入你上一步所設定的 Root 密碼
如果看見下圖表示成功安裝
設定 Nginx 與 PHP
user 與 group
建立網頁使用的 user 與 group
useradd www
# 這項指令會建立名為 www 的 user 並且建立 www 的 group
# 可以使用 sudo -u www bash 切換為該用戶
變更 Nginx 的使用者
設定檔 /etc/nginx/nginx.conf
變更 user 為 www www
(前面為 user,後面為 group)
變更 PHP-FPM 的使用者
設定檔 /etc/php-fpm.d/www.conf
變更 user = www;變更 group = www
為 Nginx 設定 WordPress 執行環境
建立 /etc/nginx/global/restrictions.conf
# 不去記錄 favicon.ico (網頁圖標)
location = /favicon.ico {
log_not_found off;
access_log off;
}
# 允許搜尋引擎讀取 robots.txt,同時不去記錄
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
# 禁止存取所有隱藏檔(檔名首為 . 的檔案,在 Unix-Like 系統中視為隱藏檔)
location ~ /\. {
deny all;
}
# 在 uploads 與 files 中禁止執行任何 .php 副檔名的程式,避免用戶上傳 Webshell
# 註:這種方法治標不治本,請務必保持良好的程式開發習慣
location ~* /(?:uploads|files)/.*\.php$ {
deny all;
}
建立 /etc/nginx/conf.d/wordpress.conf
server {
# 讓 Nginx 監聽 80 Port(HTTP),晚點會再設定 443 Port(HTTPS)
listen 80;
# 網址
server_name www.awsgood.com;
# 網頁所在目錄
root /var/www/wordpress;
# 設定 index
index index.php;
# 剛才建立的 restrictions.conf 規則
include global/restrictions.conf;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
root /var/www/wordpress;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
安裝 WordPress
下載並佈署
下載 wordpress 並解壓縮
curl -O https://tw.wordpress.org/wordpress-4.7.3-zh_TW.tar.gz
tar xzf wordpress-4.7.3-zh_TW.tar.gz
將解壓出來的 wordpress 資料夾移到 /var/www
之下(需要切換到 root 權限)
將 /var/www/wordpress
的使用者與所屬群組放給 www
sudo chown -R www:www /var/www/wordpress
SELinux 設定
大部份雲端服務廠商預設會直接把 SELinux 關閉(因為真的設定起來有夠麻煩…)
GCP 預設是開啟的,這會造成 nginx 無法讀取 /var/www/wordpress 下的檔案
所以這邊我們要開放部份的 SELinux 規則
# 開放 nginx 讀取
sudo chcon -Rt httpd_sys_content_t /var/www/wordpress
# 開放 nginx 寫入
sudo chcon -Rt httpd_sys_rw_content_t /var/www/wordpress
安裝
最後,直接用網頁的方式即可安裝 WordPress
設定 HTTPS 與 HTTP/2
最後一個步驟是設定 HTTPS 與 HTTP/2
在這邊我們會使用 Let’s Encrypt 所提供的免費憑證
安裝 certbot#
sudo yum install -y certbot
執行 certbot
sudo certbot certonly
在 How would you like to authenticate with the ACME CA
的問題中,選擇 2: Place files in webroot directory
其它依據自己的狀況做選擇即可。
如果有使用 CloudFlare 的話,記得在執行 certbot 之前先將 DNS and Proxy 的選項關掉,讓憑證認證伺服器可以取得正確的 IP 位址
編寫 crontab 以定期執行 certbot
Let’s Encrypt 所頒發的 SSL 憑證每三個月要更新,雖然他們會寄信通知,不過為了避免忘記(並且降低麻煩程度)
所以這邊編寫定時任務(crontab)去做自動更新的工作
sudo crontab -e
放入以下內容
# 在每月的第 1 天執行這個指令
0 0 1 * * certbot renew --post-hook "systemctl reload nginx"
為 Nginx 設定 HTTPS
在 /etc/nginx/conf.d/wordpress.conf
加入以下內容
server {
listen 80; # 原有的
listen 443 ssl http2;
server_name www.awsgood.com; # 原有的
ssl_certificate /etc/letsencrypt/archive/www.awsgood.com/fullchain1.pem;
ssl_certificate_key /etc/letsencrypt/archive/www.awsgood.com/privkey1.pem;
# ...
}
重新導向 HTTP 請求至 HTTPS#
在 /etc/nginx/conf.d/wordpress.conf
加入以下內容
server {
listen 80;
server_name www.awsgood.com;
return 301 https://$host$request_uri;
}
server { # 原有的
listen 443 ssl http2; # 原有的
server_name awsgood.com; # 原有的
ssl_certificate /etc/letsencrypt/archive/awsgood.com/fullchain1.pem; # 原有的
ssl_certificate_key /etc/letsencrypt/archive/awsgood.com/privkey1.pem; # 原有的
# ...
}
建立 Diffie-Hellman 參數
sudo openssl dhparam 2048 -out /etc/nginx/cert/dhparam.pem
上述指令可能會花很長的時間,請耐心等候
在 /etc/nginx/conf.d/wordpress.conf
中加入以下內容
# ...
server {
# ...
ssl_certificate /etc/letsencrypt/archive/awsgood.com/fullchain1.pem; # 原有的
ssl_certificate_key /etc/letsencrypt/archive/awsgood.com/privkey1.pem; # 原有的
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/cert/dhparam.pem;
# ...
}
Nginx 優化設定
設定 Gzip
在 /etc/nginx/nginx.conf
中加入以下內容
# ...
http {
# ...
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary off;
gzip_disable "MSIE [1-6]\.";
# ...
}