
本次用到的軟體有:
Debian 11 Bullseye 作業系統, 版本 11.2
PHP 8 版本 8.1.1
Nginx 網站伺服器, Mainline 版本 1.21.4
Debian Linux 作業系統安裝過程簡單, 相信大家會裝 Windows 就會裝 Debian 了, 接著直接進入重點 PHP 8 的安裝, 這裡我採用 Ondřej Surý 打包好的 PHP 8 安裝檔, 首先要裝好必須的軟體
apt-get -y install apt-transport-https lsb-release ca-certificates gnupg2 debian-archive-keyring
取得 Ondřej Surý 的 APT 軟體 GPG 密鑰
curl -ssL -o /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
建立 PHP 的來源安裝位置
sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
更新 APT 的軟體來源列表
apt-get update
接下來就可以裝 Ondřej Surý 提供的最新 PHP 8.1 版, 基本上我們會需要 CLI 工具與 PHP-FPM, 以及大多 PHP 應用程式會用到的 Extension, 請依照自己的需求加裝或刪減, 如果還會用到圖片處理, 建議多裝上 php-imagick
apt-get install php8.1 php8.1-cli php8.1-common php8.1-curl php8.1-mbstring php8.1-mysql php8.1-xml php8.1-fpm php8.1-dev php8.1-zip php8.1-soap php8.1-tidy php-memcache php-mongodb php-msgpack php-igbinary
到此 PHP 8.1 就裝好了, 請再修改 /etc/php/8.1/fpm/php.ini 內的設定為自己的需求, 其實大部分設定值不太需要更動
再來是 Nginx 網站伺服器的安裝, 採用 Nginx 官方 Mainline 版本, 你也可以使用 Stable (穩定版), Mainline 的更新會比較快, 但就有可能遇上 Nginx 的 Bug, 記得追蹤官網, 若有新版就更新
取得 Nginx 的 APT 軟體 GPG 密鑰
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
建立 Nginx 的來源安裝位置
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/mainline/debian `lsb_release -cs` nginx" | tee /etc/apt/sources.list.d/nginx.list
更新 APT 的軟體來源列表
apt-get update
安裝 Nginx 網站伺服器軟體
apt-get install nginx
為了讓 Nginx 使用 Google Brotli 壓縮格式, 採用 DaryL 的 APT 軟體管理包, 這位好心人已經寫成 Shell Script 可以一次完成
curl -s https://packagecloud.io/install/repositories/DaryL/libnginx-mod-brotli-mainline/script.deb.sh | sudo bash
安裝 Nginx Brotli Module
apt-get install libnginx-mod-brotli
比較多改動的是 Nginx 設定檔, 要處理網站根目錄與連接 PHP-FPM
nano /etc/nginx/nginx.conf
以下是範例
user www-data;
worker_processes auto;
worker_rlimit_nofile 65536;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;
events {
use epoll;
worker_connections 65535;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
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 /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
server_tokens off;
charset utf-8;
include /etc/nginx/conf.d/*.conf;
}
保持
server_tokens off
是好習慣, 另外 load_module modules/ngx_http_brotli_filter_module.so
與 load_module modules/ngx_http_brotli_static_module.so
是讓 Google Brotli 壓縮生效, 如果不想採用 Brotli, 可以拿掉它, 改在 http
區段增加 gzip on
來改用 gzip 壓縮, Brotli 的設定檔則是在 /etc/nginx/conf.d/brotli.conf 裡以下為 brotli.conf 範例
brotli on;
brotli_types text/plain text/css application/ecmascript application/json application/pdf application/postscript application/javascript application/x-javascript text/xml application/xml application/xml+rss application/rss+xml text/csv text/javascript image/svg+xml font/opentype application/x-font-ttf;
brotli_comp_level 6;
brotli_min_length 1;
brotli_static on;
比較多改動的是 /etc/nginx/conf.d/default.conf 網站設定檔
server {
listen 80 default_server;
server_name _;
root /home/web;
index index.php index.htm index.html;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
try_files $fastcgi_script_name =404;
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
}
其中
fastcgi_pass unix:/run/php/php8.1-fpm.sock
是使用 PHP-FPM (FastCGI Process Manager)讓 PHP 應用程式得以執行, 而 root /home/web
則是網站根目錄位置有改動 php.ini 的話, 需要重啟 PHP-FPM 讓設定生效
service php8.1-fpm restart
若有改動 nginx.conf 或是預設網站 default.conf, 則也要重啟 Nginx 讓設定生效
service nginx restart
以上就完成基本的 Nginx 網站伺服器搭配 PHP 8.1 來執行網站應用程式, 當然你還需要較為進階的調整 /etc/php/8.1/fpm/pool.d/www.conf 的最佳化設定, 讓網站服務能量充足!