第十三章 網頁伺服器

我們最常使用的網路應用莫過於網頁伺服器了, 這裡我們將介紹如何安裝一個功能完整的網頁伺服器。讀完本章後,您可以了解下列網頁伺服器的管理項目:

13.1 概論

UNIX 系統中普遍使用的網頁伺服器軟體主要有 Apache 及 Nginx 二套軟體。根據  Netcraft 的統計 (http://news.netcraft.com/archives/web_server_survey.html), Apache 在 2010 年市佔率超過百分之六十。但到了 2020 年,Nginx 已超越 Apache 成為最多人使用的網頁伺服器軟體。

Apache 在 1995 年發行以來就很受歡迎,除了歷史悠久外,它免費、穩定、並且提供彈性化的介面,可以讓我們依需求加入各種模組 以提供更強大的功能。Apache 的設定也很有彈性,我們不只可以從 Apache 的設定檔去調整各項參數,它還可以經由網頁目錄中的 .htaccess 檔 以針對每一層目錄進行不同的設定。不過,這種彈性也對效能產生負面的影響。另外,早期 Apache 服務網頁的方式是使用 fork() 來為每一個 連線產生一個新的執行程序,造成記憶體使用較多,而難以處理較大量的連線。這個效能問題在新版的 Apache 已得到改善,經由多執行緒及其他 結構上的改變,Apache 所需的系統資源已大幅減少。

Nginx 在 2004 年發行後,經過很多年後來開始流行。從 2000 年開始,網際網路蓬勃發展,網路使用者越來越多,網頁伺服器要處理的 連線數量爆增。加上雲端伺服器的普及,同樣的硬體規格下,若能處理更多的連線要求,對成本而言會降低許多。Ngnix 使用新的事件驅動架構, 因為精簡、擴充性佳、效能好,很多大型網站漸漸改用 Nginx。除了當做網頁伺服器外,Nginx 還以用來做網頁負載平衡、反向代理伺服器等 其他強大的功能。缺點是,它的模組功能不如 Apache 強大,有些網頁軟體套件還是需要 Apache 的功能才能運作。很多大型網站會使用 Apache 做為中心伺服器,並佈署 Nginx 的前端進行負載平衡。

不管是 Apache 或 Nginx 都是作為網頁伺服器很好的選擇,尤其是小型網站,二者沒有太大的差異。在效能上,Apache 在 2.4 版時, 預設使用 Event MPM 而非傳統較耗記憶體及效能的 Prefork MPM。以筆者個人網站而言 Apache 及 Nginx 效能相當,但是 Apache 提供 更多的功能、彈性及相容性。因此,以下我們會以 Apache 的設定為主,並在本章最後說明如何更改設定以改用 Nginx。您可以二者皆使用後, 再自行判斷要使用哪一套系統。

現在主流網頁多少需要使用程式來建立動態網頁以結合資料庫系統來提供服務。PHP 是主流的網頁開發程式,我們可以使用 PHP 與資料庫 結合建立各種應用。PHP 十分容易學習,程式碼也很簡潔,速度更是沒話說。如果你有些微的程式語言基礎,不出二個禮拜,你就能對 PHP 有十足的認識,並且可以自己寫出留言版、權限控制等簡單的程式。

以下,我們就介紹如何安裝一套支援 PHP 的網頁伺服器,並說明如何管理及調校各式設定。

13.2 安裝設定 Apache 及 PHP

不管是 Apache 或 Nginx,在架構上都支援以網頁伺服器的前端處理靜態的網頁內容。當要使用 PHP 時,它們會將 PHP 的連線交給 PHP FPM (FastCGI Process Manager) 處理。如此一來,我們可以將 PHP 獨立開來。之後,如果我們要將 Apache 換成 Nginx, PHP-FPM 的設定可以完全不需要更動。

13.2.1 安裝及啟用 PHP-FPM

首先,我們使用 Port 安裝 PHP,預設的設定中已選取了 FPM,我們只要使用預設選項即可:

#cd /usr/ports/lang/php74
#make install clean

接下來我們必須安裝一些常用的 PHP 模組,請執行下列指令:

#cd /usr/ports/lang/php74-extensions
#make install clean

執行了 make install 後,會出現一個選單讓您選取需要的模組。預設的項目已包含了常用的 PHP 模組,您可以瀏覽一下,看看除了預設 項目外,是否還有其它需要的模組。我通常會再加選下列幾個常用的項目:EXIT、FILEINFO、GD、ICONV、IMAP、MYSQL、PDO、PDO_MYSQL、 PDO_PGSQL、PGSQL、SOAP、SOCKET、ZIP、ZLIB 等。

在上述選項中,我們已經選擇安裝了 MySQL 及 PostgreSQL 的 PHP 客戶端程式。如果要架設資料庫,還必須安裝資料庫伺服器。資料庫 相關的安裝及詳細設定說明,請參考「資料庫系統」一章的說明。

接著,我們要設定 PHP-FPM,請編輯 /usr/local/etc/php-fpm.d/www.conf,找到下列 設定項目,並改成下列設定:

listen = /var/run/php-fpm.sock listen.owner = www listen.group = www listen.mode = 0660

然後,請在 /etc/rc.conf 中加入下列這一行:

php_fpm_enable="YES"

接著啟動 PHP-FPM:

#service php-fpm start
13.2.2 安裝及啟用 Apache

安裝完 PHP 後,接著我們一樣使用 Ports 安裝 Apache:

#cd /usr/ports/www/apache24
#make install clean

安裝完 Apache 後,我們必須先進行一些基本設定才可以開始使用。我們先介紹較常使用的設定項目,讓您可以快速的設定好網頁伺服器,而更詳細的 Apache 設定將於下一小節中說明。請使用文件編輯軟體打開 /usr/local/etc/apache24/httpd.conf

我們按照設定項目在 httpd.conf 中出現的順序說明每一個項目,您可以使用搜尋的方式查找每一個項目的關鍵字,以進行設定。

設定使用 Event MPM

下列的設定中,我們啟用 mod_mpm_event 這個 MPM 模組,並請確定其它的 MPM (prefork 及 worker) 前有使用 # 註解起來。 另外,為了要支援 PHP-FPM,我們必須啟用 mod_proxy 及 mod_proxy_fcgi 這二個模組。

# Dynamic Shared Object (DSO) Support # ... LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so #LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so #LoadModule mpm_worker_module libexec/apache24/mod_mpm_worker.so ... LoadModule proxy_module libexec/apache24/mod_proxy.so ... LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so
ServerAdmin 設定管理者郵件

設定您的信箱,這個信箱位址當網頁出現錯誤訊息時將出現在該頁面上。以下範例為預設值:

ServerAdmin you@example.com
ServerName 設定主機名稱及埠號

ServerName 可以讓您設定您的主機名稱,如果您沒有主機名稱,可以設定為您機器所使用的 IP。ServerName 會被用來重新轉向網址,例如,當您輸入一個網址 「http://www.example.com/dir」時,Apache 會參考您在 ServerName 中的設定,將 www.example.com 改成 ServerName,並在您所輸入的網址後加上一個斜線「/」以連到 dir 目錄中,也就是將網址轉向到「http://www.example.com/dir/」。如果您的網址設定不正確,則使用者可能會連到一個不存在的位址。

所以,如果您沒有主機名稱,可以將這個值設定為 IP,讓網址轉向後還是可以連到正確的地方。在 ServerName 的設定中,我們也指定了 HTTP 的連接埠 80。

如果您的伺服器是位於 NAT 後面,使用 NAT 做 Port Forwarding,建議不要設定這個項目, 改將 extra/httpd-default.conf 中的 UseCanonicalName 設為 On,才不會在轉向網址時導到錯誤的位置。

ServerName www.example.com:80
DocumentRoot 設定網頁根目錄

DocumentRoot 可以讓我們指定網頁根目錄的位置,也就是我們存放網頁的目錄並設定該目錄的權限。以下的設定是假設網頁根目錄為 /home/www。另外,在 Options 的部份,我將 Indexes 拿掉,以免伺服器在目錄中沒有 index 檔時列出目錄內容。

DocumentRoot "/home/www" <Directory "/home/www"> Options FollowSymLinks ... </Directory>
DirectoryIndex 指定預設網頁檔名

當使用者使用網址「http://www.example.com/dir」連到一個目錄中時,如果沒有指定網頁,Apache 會去查找 DirectoryIndex 中所設定的網頁在不在,如果存在則秀出預設的網頁。預設的網頁只有 index.html,我們可以再加 上 index.htm、index.php 等常用的網頁:

<IfModule dir_module> DirectoryIndex index.php index.htm index.html </IfModule>
加入 PHP 支援

接著,我們要設定將 PHP 交給 PHP-FPM 執行。請新增檔案 /usr/local/etc/apache24/Includes/php-fpm.conf, 並加入下列內容。

<FilesMatch \.php$> SetHandler proxy:unix:/var/run/php-fpm.sock|fcgi://localhost/ </FilesMatch>

接下來,我們必在修改 /etc/rc.conf ,並加入下列設定以在開機時啟動 Apache:

apache24_enable="YES"

最後,我們就可以使用下列指令以啟動 Apache 了:

#service apache24 start

如果您要停止 Apache,可以使用下列指令:

#service apache24 stop

我們可以在網頁根目錄中新增一個檔案來測試 PHP 是否有正常運作,請使用文書編輯軟體開一個新檔 test.php,並加入下列內容:

<?php phpinfo(); ?>

接下來您就可以連到該網頁 http://192.168.0.1/test.php (請將 192.168.0.1 改成您的主機 IP) 看看是否可以使用 PHP。如果有支援 PHP,則會顯示 PHP 組態,如果沒有,則只會出現上述檔案內容。如果有任何錯誤,您可以查看 /var/log/httpd-error.log 以找出錯誤的原因。

13.3 SSL 憑證及設定 HTTPS

當我們使用網路服務時,經由網路傳送的資料都有可能被他人攔截竊聽。簡單的說,當您從網頁上輸入帳號密碼時, 如果有人在您所使用的電腦和伺服器之間攔截,就可以輕易的從網路封包中竊聽到您所輸入的資料。隨著網路的蓬勃發展, 不管是一般網站的登入密碼,或是線上交易,各種敏感資料越來越多,對連線安全的要求更加嚴格。現今,絕大多數的 網站預設都使用 HTTPS 連線。

HTTPS 就是使用 SSL/TLS 加密的 HTTP 連線。SSL/TLS 的加密方式是由伺服器端提供了一組加解密用的金鑰,在伺服器 端所使用的是私密金鑰 (Private key),而客戶端所使用的是公開金鑰 (Public key)。在連線建立後,HTTP 伺服器會將公開 金鑰傳給客戶端使用。公開金鑰加密過的資料只能由私密金鑰解密,在客戶端要送出資料之前,會先使用公開金鑰進行加密的動作, 而伺服器收到資料後,會使用私密金鑰進行解密。

本小節將介紹如何取得 SSL/TLS 憑證,並設定 Apache 支援 HTTPS 連線。

13.3.1 取得 Let's Encrypt 憑證

Let's Encrypt 是一個數位憑證認證機構 (CA),它提供免費的 SSL/TLS 憑證申請。為了安全起見,它的憑證有效日期是 三個月,因每三個月就必須換一次憑證。但是這一點都不會麻煩,我們只須要使用 Certbot 這個工具就可以自動檢查、申請、 並更新憑證。

在開始之前,您必需要先具備下列條件:

在網址和 Internet 都設定好後,我們就可以安裝 Certbot。請使用下列指令安裝 Certbot:

#cd /usr/ports/security/py-certbot
#make install clean

接著,請先停掉 Apache 服務:

#service apache24 stop

然後使用 certbot 指令申請憑證。假設您的網域名稱是 your_domain.com:

#certbot certonly --standalone
Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator webroot, Installer None Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): youremail@your_domain.com <- 您的 Email - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must agree in order to register with the ACME server at https://acme-v02.api.letsencrypt.org/directory - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (A)gree/(C)ancel: a <- 同意服務條款 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Would you be willing to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital freedom. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: n <- 是否分享您的 email Please enter in your domain name(s) (comma and/or space separated) (Enter 'c' to cancel): your_domain.com <- 您的網域名稱 Obtaining a new certificate Performing the following challenges: http-01 challenge for twbsd-test.synology.me Input the webroot for twbsd-test.synology.me: (Enter 'c' to cancel): /home/www <- 網頁根目錄位置 Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /usr/local/etc/letsencrypt/live/your_domain.com>/fullchain.pem Your key file has been saved at: /usr/local/etc/letsencrypt/live/your_domain.com>/privkey.pem Your cert will expire on 2020-09-18. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - Your account credentials have been saved in your Certbot configuration directory at /usr/local/etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le

如果您的 DNS 設定正確,且伺服器可以公開的從 Internet 被存取,您馬上就可以取得憑證。以上面的範例而 言,憑證會被存放在 /usr/local/etc/letsencrypt/live/your_domain.com/ 目錄中。

因為 Let's Encrypt 的憑證有效期限只有三個月,我們可以設定每週檢查一次憑證,如果憑證快到期 就自動更新憑證。只要在 /etc/crontab 中加入自動更新的指令就可以了。

不過,我們希望憑證更新後,可以重新啟動 Apache 及其它有使用該憑證的服務,例如郵件伺服器等。所以,我們先新增一 執行檔 /usr/local/etc/letsencrypt/cert_renew_hook.sh,並加入下列 內容:

#!/bin/sh service apache24 graceful service dovecot restart service postfix restart

如果您的憑證只給 Apache 使用,您不須要加入最後那二行 dovecot 及 postfix 的部份。如果您有郵件伺服器的服 務,如 dovecot 及 postfix,則須要這二行以重啟該服務。

接著,我們要讓該檔案變成可執行,請使用下列指令:

#chmod 755 /usr/local/etc/letsencrypt/cert_renew_hook.sh

最後,我們就可以編輯 /etc/crontab 並加下列這一行以定時執行憑證更新:

5 13 * * 0 root /usr/local/bin/certbot renew --post-hook '/usr/local/etc/letsencrypt/cert_renew_hook.sh'

Let's Encrypt 憑證有效期很短其實是件好事,因為期限很短,如果憑證外漏,影響的時間有限。而因為我們可 以使用程式自動更新憑證,效期短並不會造成什麼麻煩。不管您建設的是網頁伺服器或是郵件伺服器,都可以使用 Let's Encrypt 的憑證。建議大家都可以申請來試看看。

13.3.2 設定 Apache 支援 HTTPS

申請完憑證後,我們就可以設定 Apache 來支援 HTTPS 連線了。

首先,我們必須先修改 /usr/local/etc/apache24/httpd.conf 以啟用 SSL Module 及使用 SSL 的設定檔:

# 載入 SSL 模組 LoadModule ssl_module libexec/apache24/mod_ssl.so # SSL 也會用到下列這個模組 LoadModule socache_shmcb_module libexec/apache24/mod_socache_shmcb.so ... ... # Secure (SSL/TLS) connections # 將下列註解拿掉以載入 httpd-ssl 的設定檔 Include etc/apache24/extra/httpd-ssl.conf

接著,我們必須先修改 /usr/local/etc/apache24/extra/httpd-ssl.conf 以設定 SSL,請先找到下列區段:

<VirtualHost _default_:443> # General setup for the virtual host DocumentRoot "/home/www" ServerName www.example.com:443 ServerAdmin you@example.com ErrorLog /var/log/httpd-error.log LogFormat "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b \"%{Referer}i\" \"%{User-Agent}i\"" TransferLog /var/log/httpd-access.log ... SSLCertificateFile "/usr/local/etc/letsencrypt/live/your_domain.com/fullchain.pem" ... SSLCertificateKeyFile "/usr/local/etc/letsencrypt/live/your_domain.com/privkey.pem" ... # Per-Server Logging: # The home of a custom SSL log file. Use this when you want a # compact non-error SSL logfile on a virtual host basis. # 因為我們在上方已有啟動 Log, 所以將這個多餘的 log 加上註解。 #CustomLog "/var/log/httpd-ssl_request.log" \ # "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

我們必須修改 DocuemntRoot,並將它設為我們網頁根目錄,然後要修改 ServerName,將它設定為我們的主機名稱。最後 或到 SSLCertificateFile 及 SSLCertificateKeyFile 分別填入您的 SSL 憑證位置。您只要將 your_domain.com 的 部份改成您在 certbot 申請時所填入的網域名稱即可。另外,為了有比較多的 Log 資訊,我們在 TransferLog 前加上 LogFormat 那一行,以設定 TransferLog 所要使用的 Log 格式。

最後,請重新啟動 Apache:

#/usr/local/etc/rc.d/apache24 restart

接下來,您就可以使用 https://your_domain.com 連到您的主機了。

13.3.3 自動將網頁導向 HTTPS

支援了 HTTPS 後,如果您希望所有拜訪您網頁的使用者都使用 HTTPS 連線,你可以使用 mod_rewrite 這個模組的功能, 自動將所有非 HTTPS。首先,請編輯 /usr/local/etc/apache24/httpd.conf

... LoadModule rewrite_module libexec/apache24/mod_rewrite.so ... <Directory "/home/www"> ... Options FollowSymLinks # # AllowOverride controls what directives may be placed in .htaccess files. # It can be "All", "None", or any combination of the keywords: # AllowOverride FileInfo AuthConfig Limit # AllowOverride All # # Controls who can get stuff from this server. # Require all granted ... </Directory>

請找到 mod_rewrite 模組的部份,並將註解符號移除。接著,找到您網頁根目錄的 <Directory "/home/www"> 區塊,在 AllowOverride 的參數改為 All 或是加上 FileInfo 以允許 .htaccess 設定網址導向。

接著,請重新啟動 Apache:

#/usr/local/etc/rc.d/apache24 restart

最後,您就可以在您的網頁根目錄下新增一個 .htaccess 檔。例如,網頁根目錄是 /home/www 則新增檔案 /home/www/.htaccess 內容如下:

RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

現在,請以 HTTP 連線到您的網頁看是不是會自動被導向以 HTTPS 連線。

13.4 Apache 及 PHP 進階設定

Apache 設定檔位於 /usr/local/etc/apache24 目錄下。除了主要設定 檔 httpd.conf 外,在 extra 目錄中 還存在更多的設定內容。您可以瀏覽這些設定檔看看檔案中有什麼設定。如果您對於任何設定有疑問,建議您到 Apache 官網上查詢該設定的說明。Apache 的文件十分完整,我們就不再針對個別設定多做說明。

本章中,我們會以功能為導向,針對這些功能說明如何調整 Apache 設定以支援 HTTP/2、壓縮網頁 資料、虛擬主機、使用者個人網頁及對目錄設定密碼保護等。另外,我們也將說明一些較常調整的 PHP 設定。

更多關於 Apache 的調校,可以參考 Apache 的使用手冊,或是參考 http://httpd.apache.org/docs/2.4/misc/perf-tuning.html
13.4.1 支援 HTTP/2

World Wide Web (WWW) 在 1989 年誔生後,在連線的通訊協定戶面,直到 1996 年才有了 HTTP/1.0 的規格, 並在隔年提出了 HTTP/1.1。HTTP/1.1 一直被廣泛使用,至今已有很長的一段時間。網際網路的發展從最被的純文字 HTML 網頁,到現今網頁充滿各式多媒體資訊 (圖片、影片等)。一個網頁要載入的資料不再是只有單一頁面,而可能被多個圖片、 CSS、Javascript 等各種資料。要顯示一個頁面,瀏覽單可能就要發出數十個連線要求。HTTP/1.1 的問題是, 當一個 request 下載的內容過大時,會阻塞其他 request,即 Head-of-Line blocking 的問題,導致 頻寬沒有被充份利用以加速網頁載入。

HTTP/2 在 2015 年 5 月正式有了 RFC 標準,它解決了 HTTP/1.1 常見的問題,主流瀏覽器也很快的都加入了 HTTP/2 的支援。 它所帶來的好處包含了:

如果您使用瀏覽的開始人員工具 (例如,在 Google Chrome 中按 Ctrl+Shift+I),在載入網頁時,您可以在工具中的網路頁 面看到 Protocol 或通訊協定中看到網站使用的是哪一種 HTTP 協定。理論上,HTTP/2 同時支援加密 (h2) 及未加密 (h2c) 的連線, 但是由於 HTTPS 加密連線已是大勢所趨,主流瀏覽器如 Firefox 和 Google Chrome 都宣布它們只支援加密的 HTTP/2 連線。因此, 在設定 HTTP/2 之前,您必須先設定好 HTTPS。

在您設定好 HTTPS 後,我們就可以開始設定讓 Apache 支援 HTTP/2 了。首先,請編輯 /usr/local/etc/apache24/httpd.conf,找到 http2 模組的部份,並將開頭的註解 # 號 移除:

... LoadModule http2_module libexec/apache24/mod_http2.so ...

接著,請在 /usr/local/etc/apache24/Includes/ 中新增一個檔案 mod_http2.conf 內容如下:

Protocols h2 http/1.1

/usr/local/etc/apache24/Includes/ 目錄中如果有副檔名為 .conf 的檔案都會自動 被載入 Apache 的設定中。我們在此設定預設先使用 HTTP/2,如果不支援則使用 HTTP/1.1。最後,請重新啟動 Apache:

#/usr/local/etc/rc.d/apache24 restart

您現在就可以使用瀏覽器的開發者模式去看看它使用的通訊協定是不是 HTTP/2。有些頁面的資料可能來自快取,所以還是顯示 HTTP/1.1。 您可以需要使用 Ctrl+F5 重新載入才會看到它使用 HTTP/2。

13.4.2 網頁資料壓縮

現在的網頁資料量都很大,除了網頁本身,它還有大量的 Javascript 及 CSS。如果可以在傳輸時,對於這些文字檔進行壓縮,可以 節省大量頻寬並加快網頁載入速度。

要設定網頁壓縮很簡單,只要使用 Apache 的 deflate 模組即可。我們一樣先編輯 /usr/local/etc/apache24/httpd.conf,找到 deflate 模組的部份,並將開頭的註解 # 號 移除:

... LoadModule deflate_module libexec/apache24/mod_deflate.so ...

接著,請在 /usr/local/etc/apache24/Includes/ 中新增一個檔案 mod_deflate.conf 內容如下:

<IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/html text/plain text/xml application/javascript AddOutputFilter DEFLATE js css BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.[0678] no-gzip BrowserMatch \bMSIE\s7 !no-gzip !gzip-only-text/html </IfModule>

我們在這裡設定了只要是文字內容的檔案類型 (text/html、text/plain 等),或是檔名為 js 或 css 都啟動壓縮。並 針對一些較舊的瀏覽器停用或限制壓縮類型。最後,請重新啟動 Apache:

#/usr/local/etc/rc.d/apache24 restart

您現在就可以使用瀏覽器的開發者模式去看一個 Javascript 連線回應的標頭,在標頭中,應該會有 Content-Encoding: gzip 的字樣, 表示內容是經過 gzip 壓縮過的。

HTTP/1.1 200 OK Date: Sat, 20 Jun 2020 03:34:33 GMT Server: Apache Last-Modified: Thu, 25 Jul 2013 20:17:40 GMT ETag: "1469c-4e25bb7c6c100-gzip" Accept-Ranges: bytes Cache-Control: max-age=86400 Expires: Sun, 21 Jun 2020 03:34:33 GMT Vary: Accept-Encoding Content-Encoding: gzip X-Powered-By: Web Server Built Entirely of Legos Content-Length: 29332 Content-Type: application/javascript

另外,您也可以使用第三方網站,如 https://www.whatsmyip.org/http-compression-test/ 來測試您網站的壓縮率。

13.4.3 虛擬主機

如果您想要使用一台主機管理多個不同名稱的網頁,例如,abc.com 及 xyz.com 全都連到同一台伺服器,我們可以經由 Apache 虛擬主機的功能,讓不同的網址秀出不同的網頁內容。其本上,就是在一台機器上設定多個主機名稱或 IP, 並依不同名稱來決定其根目錄所在。當使用者連線到我們的主機時,每一個不同的名稱所看到的根目錄都不同。

要達到這樣的功能,我們必須先確定主機有多個 DNS 名稱,這樣別人打該主機名稱才會對應到你的 IP。假設你的主機 IP 是 111.222.78.9 , 上面有二個主機名稱,一個是 abc.com,另一個是 xyz.com。您必須先在 DNS 中設定讓這二個主機名稱都可以對應到 11.22.78.9 這個 IP。

在確認 DNS 設定沒問題後,我們就可以開始設定 Apache 虛擬主機的功能了。請編輯 httpd.conf, 以載入虛擬主機設定檔:

# Virtual hosts Include etc/apache24/extra/httpd-vhosts.conf

接著我們修改 extra/httpd-vhost.conf 加入下列設定:

# 設定 abc.com 的管理者帳號、存放網頁的目錄及log 所在 <VirtualHost *:80> ServerAdmin jack@abc.com DocumentRoot /home/www/abc ServerName abc.com ErrorLog /var/log/abc_error.log CustomLog /var/log/abc_access.log common </VirtualHost> # 設定 xyz.com 的資料 <VirtualHost *:80> ServerAdmin tom@xyz.com DocumentRoot /home/www/xyz ServerName xyz.com ErrorLog /var/log/xyz_error.log CustomLog /var/log/xyz_access.log common </VirtualHost>

以這裡的範例而言,當使用者連線到 abc.com 時,系統會把 /home/www/abc 做為它的根目錄。而 xyz.com 則是 以 /home/www/xyz 為根目錄。必須要注意的是,/home/www 應該在你的 httpd.conf 中有設定該目錄的權限。

做完上面的設定後,就可以重新啟動 Apache 了。如果你還有別的 Domain Name 指向 111.222.78.9 的話, 例如 www.fgh.org ,但你並未設定其 Virtual Host 資料,Apache 將以第一個設定的 Virtual Host 資料為主。 在這個範例裡,當你打 www.fgh.org 會連到 abc.com 的設定。

必須要注意的是,有些客戶端的連線軟體並不支援 Name-Based 的虛擬主機,要支援 name-based virtual host,客戶端必須送出 HTTP 的標頭,也就是瀏覽器必須支援 HTTP/1.1。不過,請放心,我們常用的瀏覽器都有支援。

13.4.4 設定使用者個人網頁

如果您的系統中有很多使用者,你想要讓每個使用者都可以有自己的個人網頁,例如,使用者可以使用 http://www.example.com/~username 連到個人網頁。我們可以透過 userdir 這個模組來達成。

首先,請先編輯 httpd.conf 以啟用 userdir 模組,並載入 userdir 的設定檔:

... LoadModule userdir_module libexec/apache24/mod_userdir.so ... # User home directories Include etc/apache24/extra/httpd-userdir.conf

extra/httpd-userdir.conf 中,您可以針對使用者目錄模組做更多的設定。 例如,預設的設定是每個使用者都可以在自己的家目錄中建立一個名為 putblic_html 的目錄,該目錄就使用者的個人網頁目錄。 UserDir 這個項目即定義了使用者個人網頁的路徑名稱。如果您覺得這個名稱太長,更改它的設定, 但記得要修改 <Directory> 中的相對設定。

# Settings for user home directories # # Required module: mod_authz_core, mod_authz_host, mod_userdir # # UserDir: The name of the directory that is appended onto a user's home # directory if a ~user request is received. Note that you must also set # the default access control for these directories, as in the example below. # 使用者個人網頁的目錄名稱 UserDir public_html # 設定哪些使用者不能建立個人網頁 UserDir disabled root toor daemon operator .... pop auditdistd www hast nobody # # Control access to UserDir directories. The following is an example # for a site where these directories are restricted to read-only. # <Directory "/home/*/public_html"> AllowOverride FileInfo AuthConfig Limit Indexes Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec Require method GET POST OPTIONS </Directory>

設定好之後,我們就可以重新啟動 Apache,以讓設定生效。接著,一般使用者就可以在他們的家目錄中建立一個 目錄名為 public_html 的網頁根目錄。例如,使用者 alex 可以建立 /home/alex/public_html 這個目錄,並在裡面放個人網頁。然後, 他就可以使用 http://your_domain.com/~alex 連到該網頁了。

13.4.5 對目錄設定密碼保護

在架設網站時,如果您有特殊需求,必須指定某個目錄只能由某些使用者才能存取,我們可以使用 Apache 內建的目錄保護功能,讓使用者必須輸入使用者名稱及密碼才能存取該目錄。

在開始設定目錄的保護之前,我們必須先修改 httpd.conf,允許使用者可以在網頁目錄中使用認證功能。首先 ,請編輯 /usr/local/etc/apache24/httpd.conf,找到網頁目錄設定的區段:

... <Directory "/home/www"> Options FollowSymLinks # # AllowOverride controls what directives may be placed in .htaccess files. # It can be "All", "None", or any combination of the keywords: # AllowOverride FileInfo AuthConfig Limit # AllowOverride All # # Controls who can get stuff from this server. # Require all granted </Directory>

我們在網頁目錄的區段中 AllowOverride 的部份設定了使用 All,表示可以使用 .htaccess 來設定全部的功能。基本上, 目錄密碼保護只需要把 AllowOverride 設為 AuthConfig。但是,我們還希望可以使用 .htaccess 來達到其他目錄,如自動將導向使用 HTTPS。 所以,我們將 AllowOverride 設為 All。

另外,要使用證證功能,我們必須確定 mod_auth_basic、mod_authn_core 及 mod_authz_core 這三個模組在 httpd.conf 有被啟用。這二個模組預設已經啟用,如果您沒有變更過,就不須特別設定它們。

Apache 允許使用者在目錄下放置一個檔案來控制該目錄的存取權限,預設是使用 .htaccess。 我們可以自行用文書軟體編輯一個檔名為 .htaccess 的檔案來設定檔案所在目錄的權限。假設我們要保護的目錄是 /home/www/private/ 這個目錄,請新增一個文字檔 /home/www/private/.htaccess,內容如下:

AuthName "Login Required" AuthType Basic AuthUserFile "/usr/local/etc/apache24/passwords" Require valid-user

其中請注意各參數的大小寫。這裡我們設定儲存使用者帳號及密碼的檔案是 /usr/local/etc/apache24/passwords

接下來我們就可以新增使用者及密碼了。Apache 用來新增密碼的指令為 htpasswd:

#htpasswd -c /usr/local/etc/apache24/passwords username
New password: 輸入 username 的密碼
Re-type new password: 再輸入一次

上述指令會建立密碼檔 /usr/local/etc/apache24/passwords 並加入使用者 username。如果您還要再加入第二個使用者, 不需要加參數 -c。

接著,我們使用使用瀏覽器連到該目錄時,將出現登入畫面。此時輸入你設定的使用者名稱及密碼即可。若輸入的帳號密碼正確,即可正常看到該目錄的內容,否則在輸入三次錯誤之後,將出現禁止存取的頁面。

在您通過身份認證後,瀏覽器會自動將身份認證的資料暫存起來,以便下次連線時使用。所以在通過認證後, 您不會每次要連受保護的目錄時都要輸入帳號密碼。如果您將瀏覽器關閉後,下次再連到該頁面時,才會再被要求輸入密碼。
13.4.6 PHP 常用設定說明

在安裝完 PHP 後,您會發現在 /usr/local/etc 中有二個 PHP 的設定檔。 php.ini-productionphp.ini-development, 顧名思義,這兩個檔案一個是建議在正式站 (production) 中使用的設定,而另一個則是開發環境使用的設定。我們先把 php.ini-production 複製一份成為 php.ini, 接著,我們就可以經由修改 php.ini 來調整 PHP 的功能。

php.ini 中,開頭為 ";" 的項目為註解、以 [ ] 包起來的是區段的名稱, 二種都不會代表任何意義。在修改完 php.ini 後,我們必須也要重跑 PHP-FPM 才可以有作用。

以下就讓我們針對最常調整的幾個項目做說明。

short_open_tag

PHP 語法中,開始 PHP 程式的語法為 <? 或 <?php,其中 <? 即所謂的 Short Open Tag。在沒有 php.ini 檔案存在時,預設可以使用 Short Open Tag。 但是在 /usr/local/etc/php.ini-production 中,Short Open Tag 已經被關閉。如果您有一些舊的 PHP 程式,可能要將這個設定值打開。

short_open_tag = Off
max_execution_time

這個選項設定了 PHP scripts 最長的執行時間,如果您的 PHP 程式需要執行很長的時間,則可以將它延長。預設的最長執行時間是 30 秒。

max_execution_time = 30
memory_limit

設定每一個 scripts 所能耗用的記憶體大小,預設是 128 MB。

memory_limit = 128M
error_reporting

預設的錯誤回報內容為何。這個選項設定了 PHP scripts 在發生何種錯誤時要回報訊息。預設是除了 DEPRECATED 及 STRICT 的錯誤以外都回報。 這個選項的設定使用了 bit operation,在 php.ini 運算表示式可以使用「|」表示 bit OR、「&」表示 AND、「~」表示 NOT。 以下列範例而言,就是 E_ALL AND (NOT E_DEPRECATED) AND (NOT E_STRICT)。如果您發現 PHP log 有很多 PHP Notice 的訊息, 您也可以在這裡加上 & ~E_NOTICE 以移除 Notice 訊息。

error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
error_log

我們可以將錯誤訊息記錄在檔案中,或是使用 syslog 將錯誤記錄在 /var/log/messages 中。以下的範例即是使用 syslog。

error_log = syslog
post_max_size

當使用者從網頁中使用 HTML FORM 以 POST method 送出資料時,最大的資料上限為何。預設值是 8 MB。

post_max_size = 8M
file_uploads

是否允許使用者以 HTTP 上傳檔案。預設為 On。

file_uploads = On
upload_max_filesize

當使用者從網頁中使用 PHP 上傳檔案時,檔案最大的大小為何。預設是 2 MB。如果您要允許網頁上傳大一點的檔案, 則可以把這個值往上調整。一般上傳檔案是以 POST 的方式上傳,如果這個值加大,post_max_size 也必須相對應的加大。

upload_max_filesize = 2M
allow_url_fopen

是否允許 PHP 程式使用 open() 載入遠端檔案,通常為了安全,我都會把這個功能關閉。

allow_url_fopen = On
date.timezone

設定 PHP 執行時的時區。你可以在 https://www.php.net/manual/en/timezones.php 查到支援的時區名稱。

[Date] ; Defines the default timezone used by the date functions ; http://php.net/date.timezone date.timezone = Asia/Taipei
13.5 Apache 伺服器狀態與管理

身為系統管理者,必須時常查看系統狀態,檢查、注意主機是否有異常的情形發生。Apache 提供了詳細的系統記錄檔,我們可以經由這些檔案了解伺服器、網頁是否有異常的情形。 另外,Apache 也提供了一些工具,可以讓我們了解伺服器的運作情形。

13.5.1 維護伺服器記錄檔

查看伺服器記錄檔可以讓我們了解伺服器的運作情形。Apache 預設會有二個記錄檔,一個是所有連線的記錄, 預設的名稱是 /var/log/httpd-access.log; 另一個是連線錯誤記錄檔,預設的位置是 /var/log/httpd-error.log。 記錄檔的位置及檔名是由 httpd.conf 決定,如果您修改過記錄檔的設定, 則路徑可能就不太一定。以下為 httpd.conf 關於記錄檔的設定:

... ErrorLog /var/log/httpd-error.log ... LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common ... CustomLog /var/log/httpd-access.log combined ...

另外,如果您有啟動 HTTPS 的話,在 extra/httpd-ssl.conf 中也有針對 HTTPS 連線設定 Log 格式及位置。

我們來看一下 httpd-access.log 的內容:

#LogFormat "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b \"%{Referer}i\" \"%{User-Agent}i\"" [20/Jun/2020:19:47:42 -0700] 182.234.190.170 TLSv1.3 TLS_AES_256_GCM_SHA384 "GET /cht/book/index.php?ch=03 HTTP/2.0" 32244 "https://www.google.com/" "Mozilla/5.0 (Linux; Android 10; SM-A920F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Mobile Safari/537.36"

上面這一行 log 的格式是如第一行 LogFormat 所設定的樣子。以下是每個部份所代表的意義:

另外,我們也可以查看錯誤記錄檔。經由查看錯誤記錄檔,我們可以知道網頁中沒有有連結是壞的、使用者有沒有嘗試連到一個不存在的網頁。

隨著使用人數的增加,網站的 log 檔可能會越來越大,我們可以使用 FreeBSD 內建系統日誌自動循環備份的功能,來備份舊的 log 檔。 一般系統內建程式的日誌備份設定是在放 /etc/newsyslog.conf 中。而 /etc/newsyslog.conf 最後面會執行放在 /usr/local/etc/newsyslog.conf.d 目錄中檔案名稱為 *.conf 的設定檔。所以,我們可以新增一個文字檔 /usr/local/etc/newsyslog.conf.d/httpd.conf , 加入下列內容:

# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num] /var/log/httpd-access.log 644 7 * $W0D1 J /var/run/httpd.pid /var/log/httpd-error.log 644 7 * $W0D2 J /var/run/httpd.pid

以上二行的意義是將 /var/log/httpd-access.log 這個檔案做備份, 備份後的檔案名稱像這樣 httpd-access.log.0.bz2 。 備份後該檔案的權限是 644,最大的數字到 7,也就是最多八個檔案,不限制檔案多大時要備份, 選在每週日半夜 1 點時備份,並將該檔以 bzip2 壓縮。在備份完後,要將 /var/run/httpd.pid 所記錄的 Process ID 重新啟動。

13.5.2 效能測試

Apache 提供了一個測試 Apache 效能的工具 - ab。你可以使用 ab 針對某個 URL 來模擬出連續的連線請求 (不限本地主機),並設定同時間要模擬多少連線。

以下為 ab 這個指令比較常用的參數說明:

參數 說明
-n requests 要做多少次連線請求,requests 為次數。
-c concurrency 同時有多少個連線,concurrency 為個數。
-t timelimit 最多等待回應的秒數。
-p postfile 要以 POST 方法連線所欲送出的參數檔案。postfile 為存放參數的檔案名稱。

例如,我要對自己的機器中的 index.php 作測試,模擬 1000 次請求,每次最多同時 20 個連線,只要在命令列執行指令:

#/usr/local/bin/ab -n 1000 -c 20 http://127.0.0.1/index.php

等了幾秒之後出現:

This is ApacheBench, Version 2.3 <$Revision: 1874286 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 127.0.0.1 (be patient) Completed 100 requests Completed 200 requests Completed 300 requests Completed 400 requests Completed 500 requests Completed 600 requests Completed 700 requests Completed 800 requests Completed 900 requests Completed 1000 requests Finished 1000 requests Server Software: Apache/2.4.43 Server Hostname: 127.0.0.1 Server Port: 80 Document Path: /index.php Document Length: 7064 bytes Concurrency Level: 20 Time taken for tests: 1.131 seconds Complete requests: 1000 Failed requests: 0 Total transferred: 7618000 bytes HTML transferred: 7064000 bytes Requests per second: 884.17 [#/sec] (mean) Time per request: 22.620 [ms] (mean) Time per request: 1.131 [ms] (mean, across all concurrent requests) Transfer rate: 6577.72 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.3 0 8 Processing: 2 22 3.3 22 39 Waiting: 2 19 4.7 21 38 Total: 3 22 3.4 22 39 Percentage of the requests served within a certain time (ms) 50% 22 66% 22 75% 22 80% 22 90% 23 95% 25 98% 32 99% 38 100% 39 (longest request)

您可以增加最多同時連線數目及連線次數,操看看你機器的上限在哪裡。

還有更多的參數,詳細用法請 man ab

13.5.3 MRTG 流量分析

一個對外提供服務的網站,您可能會想知道網站流量的使用情形,我們可以安裝 MRTG 這套軟體經由網頁來監看網路流量。 MRTG 會去收取 SNMP (Simple Network Management Protocol) 所產生的資料,因此所要記錄的機器必須要安裝 SNMP。 您可以在一台內部使用的伺服器上安裝 MRTG,並在其它主機及網路設備上啟用 SNMP。如此一來,您就可以在一個頁面同時看到多 台網路設備的流量了。

安裝 SNMP

SNMP 是一個 網路管理協定,很多網路設備都支援 SNMP 協定。從 SNMP 協定,我們可以取得系統負載情形、網路使用情形等資訊。 在安裝 MRTG 之前,我們先使用 ports 來安裝 SNMP:

#cd /usr/ports/net-mgmt/net-snmp
#make install clean

安裝完成後,我們必須要先新增一個可以讀取 SNMP 資訊的 community name。所謂的 community name 是一個明碼的字串,我們可以將它視為 management station 和 agent 之間的密碼,是 MRTG 和 net-SNMP 溝通時必須要先傳送的字串。我們可以依不同的網域或主機給予不同的權限,依 community name 的設定來決定不同權限。

一個網路元件可以有多個 community name,一般 SNMP Agent 所預設公開的 community name 是 public。我們不一定要將 community name 設定為 public,因為 public 是一般 SNMP 的預設值,為了安全的問題,我們不將它設為 public。這裡我們將設定 community name 為 mrtg,而且只有 read only 的權限。

要設定 community name 請先新增一個文字檔 /usr/local/share/snmp/snmpd.conf 並加入下列設定:

rocommunity mrtg syslocation Office syscontact email@example.com

上述設定中,mrtg 為唯讀的 community name,Office 是您機器所在位置,而 syscontact 所接的字串是您的 Eamil。另外, 我們還必須在 /etc/rc.conf 中加入下列這一行:

snmpd_enable="YES"

接著,請使用下列指令啟動 SNMP:

#service snmpd start
安裝 MRTG

我們使用 ports 來安裝 MRTG:

#cd /usr/ports/net-mgmt/mrtg
#make install clean

接著要產生 MRTG 的設定檔

#cd /usr/local/etc/mrtg
#rehash
#cfgmaker mrtg@example.com >mrtg.cfg

這裡的 mrtg 是我們在安裝 net-snmp 時所設定的值。如果你使用錯的 community name,你可能會從要記錄的設備上得到錯誤回應。 而 example.com 是你所要記錄的主機位置。mrtg.cfg 就是所要產生的設定檔名。

如果您想要記錄多個主機,只要在 cfgmaker 時多加入主機名稱即可,例如:

#cfgmaker mrtg@example.com public@ftp.example.com >mrtg.cfg

這樣就會同時記錄上面二台主機的流量了。

產生基本的設定檔後,我們可以再編輯剛才產生的設定檔 /usr/local/etc/mrtg/mrtg.cfg,在檔案開頭的部份加入一些客製化的設定:

# 如果要使用中文的 MRTG 則加入下面這一行 Language: big5 # 設定你的 MRTG 要放在哪個目錄,應該要放在網頁可以 # 連結到的地方,我的網頁根目錄是 /home/www,所以我將 # MRTG 放在下面的目錄。 WorkDIR:/home/www/mrtg # 預設的 MRTG 所產生的圖時間是由右到左 # 我喜歡由左到右,故加入下面這一行 Options[_]: growright

接著請建立一個你在 mrtg.cfg 中設定的 WorkDIR 的目錄:

#mkdir /home/www/mrtg

然後使用指令 indexmaker 來建立 MRTG 的首頁:

#indexmaker -title 'Traffic Statistic' -output /home/www/mrtg/index.html /usr/local/etc/mrtg/mrtg.cfg

這裡的參數 -title 是該 index.html 檔的 title,而 -output 就是要輸出的檔案位置,預設是stdio(通常指的是螢幕) 。

輸出的檔案 index.html 你也可以使用其他的網頁編輯軟體再去修改美化它。最後執行 MRTG:

#env LANG=C /usr/local/bin/mrtg /usr/local/etc/mrtg/mrtg.cfg

第一次執行上面的指令可能會有一些錯誤訊息,不要理它,因為是第一次執行 mrtg,所沒有一些舊的圖,只要再多執行幾次就好了。 沒問題之後,請編輯 /etc/crontab 來 讓上述指令每 5 分鐘執行一次,加入下面這一行:

*/5 * * * * root env LANG=C /usr/local/bin/mrtg /usr/local/etc/mrtg/mrtg.cfg

現在你可以使用 http://yourserver/mrtg 來連去看看。

圖 13-1
如果您不希望任何人都可以看到流量統計的頁面,你可以參考前面章節為目錄加上密碼保護。如此一來,就只有有權限的人才能查看流量資訊了。
13.6 使用 Nginx 做為網頁伺服器

Nginx 是目前最多大型網站使用的網頁伺服器,它對於靜態網頁有絕佳的處理效能。另外,以 Nginx 做為反相代理伺服器, 並進行負載平衡很也常見,做為單純的網頁伺服器更是游刃有餘。

Nginx 的安裝設定很簡單,我們先使用 Ports 安裝 Nginx:

#cd /usr/ports/www/nginx
#make install clean

安裝完後,請編輯 /usr/local/etc/nginx/nginx.conf。在設定檔中,有二個主要的區段:

... http { ... server { listen 80; ... } server { listen 443 ssl; ... } }

在預設的 nginx.conf 檔案中包含了一個 http 的區塊,另外有二個 server 區塊分別代表了二個虛擬主機,即 Port 80 的 HTTP 連線及 Port 443 的 HTTPS 連線。

我們先來看看在 http 區塊外的設定有哪些:

... http { include mime.types; default_type application/octet-stream; # 以下為預設的 Log 檔格式及位置。 #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; # sendfile 一種有效率的傳檔方式,它允許系統核心直接讀取檔案並送到網路而不經過 Nginx 本身。 sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; # 啟動網頁壓縮 gzip on; }

在 http 的主要區塊中,我們只變動了 gzip 的部份,將網頁壓縮功能啟用。

接著,請看第一個 server 區塊

... http { ... server { listen 80; # 請設定你的主機名稱 server_name your_domain.com; # 設定網頁根目錄的位置,並增加 index.php location / { root /volume1/home/www; index index.php index.html index.htm; } # 這個區塊是將所有 PHP 都交給 PHP-FPM 處理。我們設定 PHP-FPM # 接收 PHP 的位置為 /var/run/php-fpm.sock。這個設定應該和您的 # PHP-FPM 設定一致。 location ~ \.php$ { root /volume1/home/www; fastcgi_pass unix:/var/run/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } ... }

在 server 區塊,最主要的就是設定主機名稱、網頁根目錄、及將 PHP 交由 PHP-FPM 處理。

接下來,我們設定 HTTPS 的 server 區塊:

... http { ... server { # 設定 HTTPS 連線埠,並使用 SSL listen 443 ssl; # 設定主機名稱 server_name your_domain.com; # 設定 SSL/TLS 憑證的位置,請參考前面章節中 Let's Encrypt 憑證的申請,將 # 目置指向您所申請的憑證。 ssl_certificate /usr/local/etc/letsencrypt/live/your_domain.com/fullchain.pem; ssl_certificate_key /usr/local/etc/letsencrypt/live/your_domain.com/privkey.pem; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # 設定網頁根目錄 location / { root /volume1/home/www; index index.php index.html index.htm; } # 將 PHP 交給 PHP-FPM location ~ \.php$ { root /volume1/home/www; fastcgi_pass unix:/var/run/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } }

就這樣,我們已經設定完 Nginx 了。接著,請編輯 /etc/rc.conf 並加入下列內容:

nginx_enable="YES"

如果您之前使用 Apache,請將 Apache 停掉,並編輯 /etc/rc.conf 將 Apache 移除。最後,我們就可以啟動 Nginx 了:

#service nginx start

在將 Apache 改用 Nginx 的過程中,我們完全不需要更動到 PHP 的設定,簡單的幾個步驟就完成了。 這也是將網頁伺服器和 PHP 處理分開的好處啊。