這裡紀錄我在 CentOS Linux 中安裝 Nginx、MySQL/MariaDB 與 RedHat 官方的 PHP 7,打造高效能、高穩定性 LEMP 網頁伺服器的過程。

最近我使用 Linode VPS 虛擬機器安裝了 CentOS Linux 環境,架設一台使用 PHP 7.1 的 LEMP 網頁伺服器,以下是整個架設流程紀錄。

本篇是我一邊測試一邊紀錄下來的筆記,所以只寫重點,請參考使用,不要用複製貼上的方式實作。

我把我在主機上的每個操作步驟都記錄下來給大家參考,請依照自己伺服器的狀況選擇需要執行的步驟。

修改主機名稱

在 Linode VPS 中剛安裝好的 CentOS Linux 需要先設定一下正確的主機名稱。先用 hostnamectl 指令查詢一下目前的主機名稱:

hostnamectl
   Static hostname: localhost.localdomain
Transient hostname: li1895-155.members.linode.com
         Icon name: computer-vm
           Chassis: vm
        Machine ID: e0c9675cb81c416ebcfaa6be69b57691
           Boot ID: 932741bb182d46119309ae15da825624
    Virtualization: kvm
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 4.15.12-x86_64-linode105
      Architecture: x86-64

設定正確的主機名稱:

sudo hostnamectl set-hostname YOUR_HOSTNAME

其中 YOUR_HOSTNAME 要換成自己的主機名稱。設定好之後,再查看一下設定值:

hostnamectl

建立有 sudo 權限的一般使用者帳號

CentOS Linux 預設只有 root 帳號,所以要建立一個可用 sudo 的一般使用者的帳號,平常使用這個帳號登入操作會比較方便,也比較安全:

# 新增使用者
adduser USERNAME

# 設定密碼
passwd USERNAME

# 將 USERNAME 加入 wheel 群組
usermod -aG wheel USERNAME

設定時區

檢查 CentOS Linux 的時間:

date
三  3月 28 10:49:30 UTC 2018

如果時間差很多(幾個小時),就代表系統的時區沒設定好。

使用 timedatectl 列出可選擇的時區:

timedatectl list-timezones

設定時區為亞洲的台北:

sudo timedatectl set-timezone Asia/Taipei

最後再確認一下時間是否正確:

date
三  3月 28 18:50:56 CST 2018

加強 SSH 安全性

設定好 SSH 的公開金鑰認證之後,編輯 /etc/ssh/sshd_config 這個 SSH 服務的設定檔,把密碼認證機制關閉,這樣就算密碼被駭客猜出來,也不會被入侵:

PasswordAuthentication no

禁止 root 管理者從遠端登入:

PermitRootLogin no

最後可以考慮更換連接埠:

Port 2222

重新啟動 SSH 服務:

sudo systemctl status sshd

更新系統套件

由於整個系統是剛裝好的,所以直接用 yum upgrade 更新一下:

sudo yum upgrade

updateupgrade 的差異可以參考 StackExchange

啟用 EPEL

有許多的套件只有 EPEL 中才有,所以一定要啟用:

sudo yum install epel-release
sudo yum update

安裝 Nginx

使用 yum 安裝 Nginx 伺服器:

sudo yum install nginx

啟動 Nginx 服務:

sudo systemctl start nginx

檢查 Nginx 是否正常啟動:

sudo systemctl status nginx

查看伺服器網頁,正常的話應該可看到這樣的畫面:

Nginx 預設畫面

永久啟用 Nginx 服務,讓重新開機後可自動啟動:

sudo systemctl enable nginx

安裝 MySQL/MariaDB

使用 yum 安裝 MariaDB:

yum install mariadb-server mariadb

啟動 MariaDB 服務,並設定開機自動啟動:

systemctl start mariadb
systemctl enable mariadb

強化 MySQL/MariaDB 資料庫設定的安全性:

mysql_secure_installation

安裝好 MariaDB 資料庫之後,檢查一下 /etc/my.cnf 設定檔,看看 bind-address 是否有指定為 127.0.0.1,如果沒有這行的話,就自己加上去:

[mysqld]
bind-address = 127.0.0.1

若沒有指定 bind-address 的話,MariaDB 預設會傾聽所有的 IP 位址,如果系統又沒有設定防火牆,就會有被攻擊的風險,所以這一行一定要加。

安裝 PHP 7

若要在 CentOS Linux 中安裝 PHP 7,大致上有兩種主要的方式,一種是使用外部套件庫來直接安裝 PHP 7,但這種方式裝的套件並不是 RedHat 官方提供的,無法保證穩定性;另外一種是使用 CentOS 官方所提供的 SCL 環境來安裝 PHP 7,所有的套件都經過充分的測試,比較不會系統的穩定性。

這裡我們選擇使用 SCL 安裝 RedHat 官方的 PHP 7.1,首先安裝 SCL:

sudo yum install centos-release-scl

安裝 RedHat 官方提供的 PHP 7.1:

sudo yum install rh-php71 rh-php71-php-fpm rh-php71-php-mysqlnd

開啟 /etc/opt/rh/rh-php71/php-fpm.d/www.conf 設定檔,確認 listen 的設定:

listen = 127.0.0.1:9000

這裡 PHP-FPM 預設是使用 TCP 的方式,這部份要跟 Nginx 的設定吻合。若要改成 socks 方式亦可,只是必須注意要與 Nginx 的設定檔同步修改。

修改 usergroup,設定為 nginx

user = nginx
group = nginx

啟動 PHP-FPM 服務,並設定開機自動啟動:

sudo systemctl start rh-php71-php-fpm
sudo systemctl enable rh-php71-php-fpm

關於 CentOS 安裝 PHP 7 的方法,可以參考 CentOS WikiPHPerzh與知Software Collections

編輯 /etc/opt/rh/rh-php71/php.ini 設定檔,修正 cgi.fix_pathinfo 漏洞,將 cgi.fix_pathinfo 設為 0

cgi.fix_pathinfo=0

設定 Nginx 與 PHP 7

設定 /etc/nginx/nginx.conf 設定檔,內容大致如下:

server {
  listen 80;
  server_name your_server_name;

  # note that these lines are originally from the "location /" block
  root /usr/share/nginx/html;
  index index.php index.html index.htm;

  location / {
    try_files $uri $uri/ =404;
  }
  error_page 404 /404.html;
  error_page 500 502 503 504 /50x.html;
  location = /50x.html {
    root /usr/share/nginx/html;
  }

  location ~ \.php$ {
    try_files $uri =404;
    #fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }
}

其中 server_name 請自行修改,而 fastcgi_pass 要與 PHP-FPM 的設定吻合。

所有設定都調整好之後,重新啟動 PHP-FPM 與 Nginx 服務:

sudo systemctl restart rh-php71-php-fpm
sudo systemctl restart nginx

關於 Nginx 與 PHP 7 的設定方法,可以參考簡書

測試 PHP 7

使用 phpinfo 寫一個測試的 PHP 指令稿,放在 測試看看 PHP 7 是否有正常執行:

<?php phpinfo(); ?>

設置 Nginx Server Block

確認 PHP 7 與 Nginx 設置無誤後,參考 DigitalOcean 的文件,設置 Nginx 的 server block,先建立兩個目錄:

sudo mkdir /etc/nginx/sites-available
sudo mkdir /etc/nginx/sites-enabled

/etc/nginx/nginx.conf 中的 http {} 區塊結束前,加上兩行:

include /etc/nginx/sites-enabled/*.conf;
server_names_hash_bucket_size 64;

這樣就可以將所有的網站設定檔放在 sites-available 目錄中,要啟用的設定檔則以連結的方式放在 sites-enabled 目錄,這樣會比較好管理。

設定 HTTPS 加密網頁

安裝 certbot

sudo yum install certbot-nginx

取得憑證:

sudo certbot --nginx

測試更新憑證:

sudo certbot renew --dry-run

若測試更新憑證沒問題,則加入 crontab,讓系統定自動定時更新憑證:

# certbot
51 2 * * 0 certbot renew --quiet --no-self-upgrade --post-hook "/bin/systemctl reload nginx.service"

防火牆

正式服務的機器最好開啟防火牆,這部份請參考 CentOS Linux 的防火牆設置教學

參考資料:Hostinger