在網頁開發領域,PHP 和 NGINX 的組合相當常見。透過套件管理器安裝 PHP 與 NGINX,能有效簡化佈署流程。Red Hat 系統可使用 dnf install php-fpm 指令安裝 PHP-FPM,Debian 系統則使用 apt install php-fpm。安裝後,需設定 php.ini,特別注意 cgi.fix_pathinfo 的安全設定,建議設定為 0 以避免潛在漏洞。PHP-FPM 的組態檔 php-fpm.conf 需設定使用者、群組、監聽地址和埠等引數,並可透過 systemctl 指令管理 PHP-FPM 服務。NGINX 的設定檔需設定伺服器名稱、監聽埠、網站根目錄和預設請求檔案,並在 location 區塊中設定 fastcgi_pass 等引數,使 NGINX 能與 PHP-FPM 正確溝通。最後,可建立一個簡單的 PHP 檔案測試組態是否成功。此外,文章也提及 Python Django 框架與 NGINX 的整合,說明 Django 的特性及透過 WSGI 模組佈署的方式,並提供 Gunicorn 和 uWSGI 兩種排程應用程式的範例,以及對應的 NGINX 組態方法,讓開發者能更深入瞭解如何將 Python 網頁應用佈署到 NGINX 伺服器上。

使用套件管理器安裝 PHP 與 NGINX

PHP 是一門廣泛應用於網頁開發的程式語言,而 NGINX 則是一個高效能的網頁伺服器。這篇文章將介紹如何在不同的作業系統上使用套件管理器安裝 PHP,並組態 NGINX 來處理 PHP 指令碼。以下是具體的步驟及詳細說明。

選擇最新穩定版本

截至撰寫本文時,PHP 的最新穩定版本為 8.3,但依據你所使用的作業系統和其內建的 PHP 版本,這個版本可能會有所不同。

在 Red Hat 基礎系統上安裝 PHP-FPM

對於使用 dnf 作為套件管理器的 Red Hat 基礎系統(如 Fedora、CentOS、RHEL 等),可以執行以下命令來安裝 PHP-FPM:

[root@local ~]# dnf install php-fpm

在 Ubuntu 和 Debian 上安裝 PHP-FPM

對於使用 apt 作為套件管理器的 Ubuntu 和 Debian 基礎系統,可以執行以下命令來安裝 PHP-FPM:

[root@local ~]# apt install php-fpm

安裝後的組態

安裝完成後,需要進行一些基本的組態。首先,可以將之前設定的 php.ini 檔案複製到新的 PHP 安裝目錄中。

關於 cgi.fix_pathinfo 的安全設定

由於 NGINX 的運作方式可能會導致安全漏洞,特別是當 cgi.fix_pathinfo=1 的時候。建議在 php.ini 檔案中將這個選項設定為 0(大多數分佈版本已經預設為 0)。更多關於這個安全問題的資訊,可以參考以下文章: http://cnedelcu.blogspot.in/2010/05/nginx-php-via-fastcgi-important.html

組態 PHP-FPM

接著,需要編輯 php-fpm.conf 檔案。以下是一些重要的組態指令:

  1. 編輯工作程式所使用的使用者和群組。
  2. 指定 PHP-FPM 的監聽地址和埠。
  3. 設定同時處理的請求數量。
  4. 指定允許連線到 PHP-FPM 的 IP 地址。

組態範例

[www]
user = www-data
group = www-data
listen = /run/php/php8.3-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

啟動與控制 PHP-FPM

完成組態後,可以使用以下命令來啟動或重啟 PHP-FPM:

[root@local ~]# systemctl restart php-fpm

如果還沒有啟動過 PHP-FPM,可以使用 start 命令來啟動它:

[root@local ~]# systemctl start php-fpm

檢視 PHP-FPM 的狀態

可以使用以下命令來檢視目前 PHP-FPM 的負載和請求情況:

[root@local ~]# systemctl status php-fpm

這個命令非常有用,因為它可以幫助你瞭解伺服器是否正常執行或已經達到飽和狀態。

NGINX 組態

完成 PHP-FPM 的組態後,下一步是修改 NGINX 組態檔案,以便它能夠正確地與 PHP-FPM 溝通。以下是一個簡單且有效的伺服器區塊範例:

server {
    server_name .website.com; # 接受 www 的伺服器名稱
    listen 80; # 監聽埠 80
    root /home/website/www; # 網站根目錄路徑
    index index.php; # 預設請求檔案名稱:index.php

    location ~* \.php$ { # 對於以 .php 命名結尾的請求
        # 指定監聽地址和埠
        fastcgi_pass 127.0.0.1:9000;
        # 傳遞給 PHP-FPM 的檔案路徑
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        # 傳遞給 PHP-FPM 的指令碼檔名稱
        fastcgi_param PATH_INFO $fastcgi_script_name;
        # 包含其他 FastCGI 應用相關組態設定
        include fastcgi_params;
    }
}

儲存組態檔案後,重新載入 NGINX:

[root@local ~]# systemctl reload nginx

測試 PHP 組態

在網站根目錄中建立一個簡單的指令碼來測試是否正確解釋了 PHP:

[user@local ~]# echo "<?php phpinfo(); ?>" > /home/website/www/index.php

開啟瀏覽器並載入 http://localhost/(或你的網站 URL),應該會看到類別似以下圖片的 PHP 資訊頁面:

PHP 資訊頁面

注意事項

如果遇到 HTTP 錯誤程式碼 403 Forbidden,這通常是因為檔案和目錄許可權設定不正確。請確認 php-fpm.conf 中指定的使用者和群組是正確的,並且目錄和檔案對於 PHP 是可讀取的。

接下來:Python 與 NGINX

玄貓在這篇文章中介紹瞭如何在不同系統上安裝並組態 PHP 與 NGINX。接下來玄貓將會講解如何在 NGINX 中運作 Python 指令碼,特別是在使用 Django 框架時。

Python 與 Django 框架與 NGINX

Python 是一種廣泛應用於多平台上的物件導向程式語言。Django 是一個強大且易於使用的 Python 網頁框架,適合快速開發網頁應用。玄貓將介紹如何組態 Django 框架與 NGINX 一起執行。

Django 框架簡介

Django 是一個開源的 Python 網頁開發框架,旨在讓網頁開發更加簡單且高效。它擁有豐富的功能,包括動態管理介面、快取框架及單元測試等。

Django 特點

  1. 簡單易用:Django 提供了豐富的功能模組及快速開發工具。
  2. 安全性:內建保護機制及安全措施。
  3. 擴充套件性:可輕鬆擴充套件及整合其他 Python 函式庫。
  4. 社群支援:擁有一個龐大且活躍的開發者社群。

更多資訊可參考 Django 專案網站

安裝 Django

首先需要安裝 Django。可以使用 pip 工具來進行安裝:

pip install django==4.x.x   # 根據需要指定版本號碼號或最新版本號碼即可安裝最新版本。

組態 Django 與 FastCGI

Django 本身並不直接支援 FastCGI,但可以透過一些第三方擴充套件來實作這一點。然而,最常見的是透過 WSGI 模組來佈署 Django 應用。玄貓將介紹如何透過 FastCGI 模式來執行 Python 指令碼。

安裝 Flask 模組

Flask 是另一個輕量級且靈活的 Python 網頁框架。你可以選擇 Flask 和 WSGI 模式來執行 Python 指令碼。

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run()

組態 Nginx 和 Flask WSGI 模式連線模組連結Gunicorn 排程應用程式:

這裡有兩種方式去排程應用程式:

  1. Gunicorn
  2. uWSGI
Gunicorn:
# vim gunicorn.service file setting the unit:
[Unit]
Description=gunicorn daemon for my project name here project_name_flask.wsgi application group=www-data

[Service]
User=your_user_name_here_username_for_group_www-data_here.
Group=www-data_here.
WorkingDirectory=/home/your_project_name_here.
ExecStart=/usr/local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/your_project_name_here.your_project_name_flask.sock your_project_name_flask.wsgi:application_here_with_project_folder_wsgi_file:

ExecReload=/bin/kill -s HUP $MAINPID:
ExecStop=/bin/kill -s TERM $MAINPID:
PrivateTmp=true:

[Install]
WantedBy=multi-user.target:

# systemctl enable gunicorn.service:
systemctl enable gunicorn.service:
uWSGI:
Enable uWSGI to start automatically:
Add uWSGI to the startup sequence:

Create a new file named uwsgi at /etc/init/uwsgi.conf and add the following content to it:
description "uWSGI"
start on runlevel [2345]
stop on runlevel [!2345]
respawn:
setuid www-data:
setgid www-data:
exec /usr/local/bin/uwsgi -s /tmp/uwsgi.sock -M -p 4 -H path/to/your/virtualenv -w myapp.wsgi:application:
Save and exit the file.

Start the uWSGI service and enable it to start on boot:

sudo start uwsgi:
sudo initctl enable uwsgi:

在 Nginx 中組態應用程式連結

NGINX 是高效率 Web Server 機構上透過反向代理方式透過 URL 在各種不同之 WSGI 模式中排程應用程式。 下面介紹其範例:

    server_name you_project_domain.com or IP address here;

location / {
    include proxy_params;
    proxy_pass http://unix:/home/you_project_your_project_fastcgi.sock;
}}

在 Nginx 中透過 Gunicorn 排程應用程式範例:

server {
    listen       [::]:80;
    listen       80;
    server_name example.com;

location / {
            include proxy_params;
            proxy_pass http://unix:/home/myapp/myproject.sock;

}}}

在 Nginx 中透過 uWSGI 排程應用程式範例:

server {
    listen       [::]:80;
    listen       80;
    server_name example.com;

location / {
            include proxy_params;
            proxy_pass http://unix:/tmp/uwsgi.sock;}

}}}

以上就是如何透過 Nginx 排程 Gunicorn、uWSGI 模式下之 Django、Flask WSGI 模式下之應用程式排程方法總結以及其實際範例相關資訊,

未完待續….

Future Scope(未來展望)

在未來我們會看到更多技術進步與革新我們必須隨時保持學習與進步,

希望各位讀者能夠從此文章中獲得實際幫助與相關知識,

期待大家多多支援與鼓勵,

未完待續….

感謝閱讀