首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Ubuntu 搭建 Nginx + PHP 環境最簡指南

     編輯:PHP 相關知識

前言

網上教程良莠不齊,很多過時或配置錯誤。本文記錄在 Ubuntu 20.04/22.04 LTS 上使用官方倉庫 apt 快速部署 Nginx + PHP-FPM 生產環境的標準流程,驗證可用,適合快速上手與自動化腳本。

系統環境與軟件版本

  • OS: Ubuntu 20.04 / 22.04 LTS
  • Nginx: 1.18 / 1.22 (官方倉庫版本)
  • PHP: 7.4 / 8.1 / 8.2 (官方倉庫版本)
  • PHP-FPM: 對應版本

一鍵安裝核心包

# 更新包索引
sudo apt update

# 安裝 Nginx、PHP-FPM 及常用擴展
sudo apt install -y nginx php-fpm php-mysql php-redis php-gd php-xml php-mbstring php-curl php-zip php-bcmath php-intl

# 驗證安裝
nginx -v
php -v
php-fpm -v

核心配置:Nginx 虛擬主機

編輯默認站點配置(或新建 /etc/nginx/sites-available/your_site 並軟鏈到 sites-enabled):

sudo vim /etc/nginx/sites-available/default

關鍵配置段落

server {
    listen 80;
    listen [::]:80;
    server_name your_domain.com www.your_domain.com; # 替換為你的域名或 _

    root /var/www/html; # 站點根目錄
    index index.php index.html index.htm; # 關鍵:添加 index.php

    # 靜態文件優化
    location / {
        try_files $uri $uri/ =404;
        # 可選:開啟目錄瀏覽 autoindex on;
    }

    # PHP 處理核心配置
    location ~ \.php$ {
        # 防止惡意腳本執行 (cgi.fix_pathinfo=0 需在 php.ini 設置)
        # fastcgi_split_path_info ^(.+\.php)(/.+)$;
        
        # 連接 PHP-FPM:推薦 Unix Socket (性能更好、安全)
        fastcgi_pass unix:/run/php/php8.1-fpm.sock; # 注意版本號對應
        
        # 或 TCP 連接(跨服務器/容器場景)
        # fastcgi_pass 127.0.0.1:9000;
        
        fastcgi_index index.php;
        include fastcgi_params;
        
        # 關鍵參數傳遞
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }

    # 拒絕訪問隱藏文件、版本控制目錄
    location ~ /\.(git|svn|env|htaccess) {
        deny all;
    }
}

PHP-FPM 配置優化

編輯 /etc/php/8.1/fpm/pool.d/www.conf (版本號對應):

# 運行用戶/組 (與 Nginx 一致,通常 www-data)
user = www-data
group = www-data

# 監聽方式:Unix Socket 推薦
listen = /run/php/php8.1-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

# 進程管理模式:動態調整 (生產環境可改 static 固定數量)
pm = dynamic
pm.max_children = 50      # 最大進程數 (根據內存:總內存/單進程內存)
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

# 請求生命週期控制
pm.max_requests = 500     # 防止內存洩漏,處理 500 請求後重啟進程

# 慢日誌 (排查性能瓶頸)
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/www-slow.log

PHP.ini 關鍵安全與性能設置

編輯 /etc/php/8.1/fpm/php.ini:

# 安全
cgi.fix_pathinfo = 0          # 防止任意文件執行漏洞
expose_php = Off              # 隱藏 PHP 版本
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

# 性能
memory_limit = 256M
max_execution_time = 30
max_input_time = 60
post_max_size = 50M
upload_max_filesize = 50M

# OPcache (生產必開)
opcache.enable = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 10000
opcache.revalidate_freq = 2
opcache.validate_timestamps = 1

# 錯誤日誌
log_errors = On
error_log = /var/log/php-fpm/error.log
display_errors = Off

啟動與驗證

# 測試配置語法
sudo nginx -t
sudo php-fpm8.1 -t

# 重啟服務
sudo systemctl restart php8.1-fpm
sudo systemctl restart nginx

# 設置開機自啟
sudo systemctl enable php8.1-fpm nginx

# 驗證 PHP 處理
echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php
curl https://localhost/info.php | grep "PHP Version"

進階:多站點與 HTTPS

多站點隔離

為每個站點創建獨立 PHP-FPM 池(不同 Socket、用戶、權限),實現賬號級隔離:

# /etc/php/8.1/fpm/pool.d/site1.conf
[site1]
user = site1_user
group = site1_group
listen = /run/php/site1.sock
...

Let's Encrypt 自動 HTTPS

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d your_domain.com -d www.your_domain.com
# 自動續期已配置 systemd timer

常見問題速查

現象排查方向
502 Bad GatewayPHP-FPM 未啟動、Socket 路徑錯誤、權限不足、進程數耗盡
File not foundSCRIPT_FILENAME 參數錯誤、root 路徑不匹配、cgi.fix_pathinfo=1
權限拒絕目錄所有者非 www-data、Socket 權限 0660 導致 Nginx 讀取失敗
上傳大文件失敗client_max_body_size、upload_max_filesize、post_max_size 限制

總結

使用 Ubuntu 官方倉庫部署 Nginx + PHP-FPM 是最穩健、可維護的方式:版本經過測試、安全更新及時、配置規範。關鍵點在於:Unix Socket 通信、OPcache 啟用、進程池合理配置、權限正確、禁用危險函數。掌握此流程,可輕鬆擴展至 Ansible/Docker 自動化部署。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved