這裡紀錄我在 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 的公開金鑰認證之後,編輯 /etc/ssh/sshd_config
這個 SSH 服務的設定檔,把密碼認證機制關閉,這樣就算密碼被駭客猜出來,也不會被入侵:
PasswordAuthentication no
禁止 root
管理者從遠端登入:
PermitRootLogin no
最後可以考慮更換連接埠:
Port 2222
重新啟動 SSH 服務:
sudo systemctl status sshd
由於整個系統是剛裝好的,所以直接用 yum upgrade
更新一下:
sudo yum upgrade
update
與 upgrade
的差異可以參考 StackExchange。
有許多的套件只有 EPEL 中才有,所以一定要啟用:
sudo yum install epel-release sudo yum update
使用 yum
安裝 Nginx 伺服器:
sudo yum install nginx
啟動 Nginx 服務:
sudo systemctl start nginx
檢查 Nginx 是否正常啟動:
sudo systemctl status nginx
查看伺服器網頁,正常的話應該可看到這樣的畫面:
永久啟用 Nginx 服務,讓重新開機後可自動啟動:
sudo systemctl enable nginx
使用 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 位址,如果系統又沒有設定防火牆,就會有被攻擊的風險,所以這一行一定要加。
若要在 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 的設定檔同步修改。
修改 user
與 group
,設定為 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 Wiki、PHPerzh、與知、Software Collections。
編輯 /etc/opt/rh/rh-php71/php.ini
設定檔,修正 cgi.fix_pathinfo
漏洞,將 cgi.fix_pathinfo
設為 0
:
cgi.fix_pathinfo=0
設定 /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 的設定方法,可以參考簡書。
使用 phpinfo
寫一個測試的 PHP 指令稿,放在 /usr/share/nginx/html
目錄下測試看看 PHP 7 是否有正常執行:
<?php phpinfo(); ?>
確認 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
目錄,這樣會比較好管理。
安裝 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