+86 13541016684Mon. - Fri. 10:00-22:00

在 Google Compute Engine 上建立 WordPress教程

在 Google Compute Engine 上建立 WordPress教程

在 Google Compute Engine 上建立 WordPress教程

事前準備

  1. 安裝 gcloud
  2. 設定 gcloud
  3. 建立 GCP 專案

目錄

  1. 建立 Compute Engine 執行個體
  2. 建立 Nginx + PHP + MariaDB 執行環境
  3. 設定 Nginx 與 PHP
  4. 安裝 WordPress
  5. 設定 HTTPS 與 HTTP/2
  6. Nginx 優化設定

建立 Compute Engine 執行個體

在左方選單列中選擇 Compute Engine 頁面

R2j3HlP

建立 VM 執行個體

VCXLAM2

建議設定大致如下:

  • 區域: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 位址

37OMj5J

接下來可能需要一點時間進行建置(大概 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.*

K33p1pM

確認版本無誤後,用以下指令安裝 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

vCGsY3K

外部測試:利用 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.*

Q3P03Hc

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 密碼

如果看見下圖表示成功安裝

Gtj4i8O

設定 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)

pgLnjoD

變更 PHP-FPM 的使用者

設定檔 /etc/php-fpm.d/www.conf

變更 user = www;變更 group = www

M0dSbsn

為 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]\.";
    # ...
}