13、配置NGINX与PHP、Python协同工作及作为反向代理的完整指南

配置NGINX与PHP、Python协同工作及作为反向代理的完整指南

一、NGINX FastCGI缓存配置

在使用NGINX时,FastCGI缓存模块能显著提升性能。你可以在官方网站https://nginx.org获取完整的NGINX FastCGI缓存模块列表。以下是一个完整的NGINX FastCGI缓存配置示例:

fastcgi_cache phpcache;
fastcgi_cache_key "$scheme$host$request_uri"; # $request_uri包含请求参数(如 /page.php?arg=value)
fastcgi_cache_min_uses 2; # 两次命中后,请求将收到缓存响应
fastcgi_cache_path /tmp/cache levels=1:2 keys_zone=phpcache:10m inactive=30m max_size=500M;
fastcgi_cache_use_stale updating timeout;
fastcgi_cache_valid 404 1m;
fastcgi_cache_valid 500 502 504 5m;

由于这些指令适用于几乎所有虚拟主机配置,你可以将它们保存到一个单独的文件(如 fastcgi_cache )中,并在适当的位置包含该文件:

server {
    server_name website.com;
    location ~* \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME /home/website.com/www$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_script_name;
        include fastcgi_params;
        include fastcgi_cache;
    }
}
二、配置PHP与NGINX协同工作

我们将通过FastCGI配置PHP与NGINX协同工作。自PHP 5.3.3版本起,所有版本都集成了FastCGI进程管理器,只需在构建PHP时使用 --enable-fpm 参数即可。也可以通过包管理器安装 php-fpm php8-fpm

1. 架构理解

FastCGI是通过套接字运行的通信协议,有客户端和服务器。客户端是NGINX,服务器方面,除了PHP本身,我们还将使用PHP-FPM来改善整体进程管理。

2. PHP-FPM介绍

PHP-FPM是一个管理PHP进程的脚本,它接收NGINX的指令,并在你配置的环境中运行请求的PHP脚本。它具有以下优点:
- 自动将PHP作为守护进程运行(转为后台进程)
- 在chroot(或沙箱)环境中执行脚本
- 改进日志记录、IP地址限制、池分离等

3. 安装PHP和PHP-FPM
  • 使用包管理器安装
    • 对于基于Red Hat的系统及使用 dnf 作为包管理器的系统,执行: [root@local ~]# dnf install php-fpm
    • 对于Ubuntu、Debian及使用 apt 的系统,执行: [root@local ~]# apt install php-fpm
4. 安装后配置
  • 配置PHP :复制之前设置的 php.ini 文件覆盖新的文件。同时,建议将 cgi.fix_pathinfo 设置为0,以避免安全漏洞。
  • 配置PHP-FPM :打开 php-fpm.conf 文件,需要关注以下重要配置指令:
    • 编辑工作进程和Unix套接字使用的用户和组
    • 设置PHP-FPM监听的地址和端口
    • 确定同时处理的请求数量
    • 允许连接到PHP-FPM的IP地址
5. 运行和控制

完成PHP-FPM配置文件的更改后,可以使用以下命令启动或重启它:

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

你可以使用 systemctl status php-fpm 查看当前 php-fpm 的负载和请求情况。

6. NGINX配置

若正确配置并启动了PHP-FPM,可调整NGINX配置文件以建立两者之间的连接:

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;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_script_name;
        include fastcgi_params;
    }
}

保存配置文件后,重新加载NGINX:

[root@local ~]# systemctl reload nginx

在网站根目录创建一个简单的脚本以验证PHP是否正确解析:

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

打开浏览器,访问 http://localhost/ (或你的网站URL),应看到PHP服务器信息页面。若遇到403 Forbidden错误,需确保在 php-fpm.conf 文件中指定了正确的用户和组,并确保目录和文件对PHP可读。

三、配置Python与NGINX协同工作

我们将使用Python作为服务器端Web编程语言,并借助Django框架。

1. Django介绍

Django是一个开源的Python Web开发框架,旨在使Web开发简单易行。它带有FastCGI管理器,虽然通常通过WSGI部署Django,但使用其FastCGI管理器能简化通过NGINX运行Python脚本的过程。

2. 安装Python和Django
  • 安装Python
    • 对于基于Red Hat的系统及使用 dnf 的系统,执行: [root@local ~]# dnf install python python-devel
    • 对于Ubuntu、Debian及使用 apt 的系统,执行: [root@local ~]# apt install python python-dev
  • 安装Django
    • 先安装 pip
      • 对于基于Red Hat的系统及使用 dnf 的系统,执行: [root@local ~]# dnf install python-pip
      • 对于Ubuntu、Debian及使用 apt 的系统,执行: [root@local ~]# apt install python-pip
    • 安装Django 5.0.3: [root@website.com ~]# pip install Django==5.0.3
    • 最后安装 flup 库:
      • 对于基于Red Hat的系统及使用 dnf 的系统,执行: [root@local ~]# dnf install python-flup
      • 对于Ubuntu、Debian及使用 apt 的系统,执行: [root@local ~]# apt install python-flup
3. 启动FastCGI进程管理器

使用以下命令开始构建Django项目:

[root@website.com ~]# django-admin startproject mysite

进入 mysite 目录,运行以下命令启动FastCGI进程管理器:

[root@website.com mysite]# python manage.py runfcgi method=prefork host=127.0.0.1 port=9000 pidfile=/var/run/django.pid

若一切配置正确且依赖项安装无误,该命令应无输出。可以使用 ps aux | grep python 验证应用是否正在运行。

4. NGINX配置

NGINX配置与PHP类似:

server {
    server_name .website.com;
    listen 80;
    root /home/website/www;
    index index.html;
    location / {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_script_name;
        include fastcgi_params;
    }
}
四、NGINX作为反向代理

随着Web的发展,现代Web应用变得更加复杂,NGINX不仅是一个快速的静态文件服务器,还可作为反向代理。

1. 反向代理机制

运行NGINX作为应用服务器类似于前面章节描述的FastCGI架构。NGINX作为前端服务器,接收来自外部世界的所有请求,过滤后,直接向客户端提供静态文件或将动态内容请求转发到后端服务器。后端服务器仅与NGINX通信,可位于同一台计算机上,也可使用多台后端服务器进行负载均衡。

2. NGINX代理模块

默认的NGINX构建包含代理模块,可将HTTP请求从客户端转发到后端服务器。需要配置以下方面:
- 后端服务器的基本地址和端口信息
- 缓存、缓冲和临时文件选项
- 限制、超时和错误行为
- 其他杂项选项

3. 主要指令
指令 描述
proxy_pass 指定请求应转发到的后端服务器位置,支持多种语法,如 http://hostname:port; http://unix:/path/to/file.socket; 等,也可引用上游块。
proxy_method 允许覆盖转发到后端服务器的请求的HTTP方法。
proxy_hide_header 可指定要对客户端隐藏的额外响应头。
proxy_pass_header 强制将一些被忽略的响应头传递给客户端。
proxy_pass_request_body proxy_pass_request_headers 分别定义请求体和额外请求头是否应传递到后端服务器。
proxy_redirect 允许重写后端服务器触发的重定向中 Location HTTP头中出现的URL。

示例配置如下:

upstream backend {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
}
location ~* .php$ {
    proxy_pass http://backend;
    proxy_method POST;
    proxy_hide_header Cache-Control;
    proxy_pass_header Date;
    proxy_pass_request_body on;
    proxy_pass_request_headers on;
    proxy_redirect http://localhost:8080/ http://example.com/;
}

通过以上步骤,你可以实现NGINX与PHP、Python的协同工作,并将NGINX作为反向代理,提升Web应用的性能和安全性。

配置NGINX与PHP、Python协同工作及作为反向代理的完整指南

五、操作步骤总结与流程图
1. 操作步骤总结

为了更清晰地展示整个配置过程,下面将配置NGINX与PHP、Python协同工作以及作为反向代理的步骤进行总结:
- 配置NGINX FastCGI缓存
1. 编写FastCGI缓存配置指令并保存到单独文件(如 fastcgi_cache )。
2. 在NGINX配置文件中包含该缓存配置文件。
- 配置PHP与NGINX协同工作
1. 使用包管理器安装 php-fpm
2. 配置PHP的 php.ini 文件,设置 cgi.fix_pathinfo 为0。
3. 配置PHP-FPM的 php-fpm.conf 文件,设置用户、组、监听地址和端口等。
4. 启动或重启PHP-FPM。
5. 调整NGINX配置文件以连接PHP-FPM。
6. 重新加载NGINX。
7. 创建测试脚本验证PHP解析。
- 配置Python与NGINX协同工作
1. 使用包管理器安装Python和相关开发包。
2. 安装 pip
3. 使用 pip 安装Django。
4. 安装 flup 库。
5. 创建Django项目。
6. 启动FastCGI进程管理器。
7. 调整NGINX配置文件以连接Django。
- 配置NGINX作为反向代理
1. 理解反向代理机制,确定后端服务器。
2. 使用NGINX代理模块的指令配置后端服务器地址、缓存等选项。

2. mermaid格式流程图
graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px

    A([开始]):::startend --> B{选择配置类型}:::decision
    B -->|NGINX FastCGI缓存| C(编写缓存配置指令):::process
    C --> D(保存到单独文件):::process
    D --> E(在NGINX配置中包含文件):::process
    E --> F([结束]):::startend

    B -->|PHP与NGINX| G(安装php-fpm):::process
    G --> H(配置php.ini):::process
    H --> I(配置php-fpm.conf):::process
    I --> J(启动或重启php-fpm):::process
    J --> K(调整NGINX配置):::process
    K --> L(重新加载NGINX):::process
    L --> M(创建测试脚本):::process
    M --> F

    B -->|Python与NGINX| N(安装Python及开发包):::process
    N --> O(安装pip):::process
    O --> P(安装Django):::process
    P --> Q(安装flup库):::process
    Q --> R(创建Django项目):::process
    R --> S(启动FastCGI进程管理器):::process
    S --> T(调整NGINX配置):::process
    T --> F

    B -->|NGINX作为反向代理| U(理解反向代理机制):::process
    U --> V(配置代理模块指令):::process
    V --> F
六、常见问题及解决方法

在配置过程中,可能会遇到一些常见问题,下面为你提供相应的解决方法。

1. PHP配置问题
  • 403 Forbidden错误 :这通常是由于文件和目录访问权限配置不当导致的。解决方法是确保在 php-fpm.conf 文件中指定了正确的用户和组,并确保目录和文件对PHP可读。
  • cgi.fix_pathinfo 安全问题 :建议将 php.ini 文件中的 cgi.fix_pathinfo 设置为0,以避免安全漏洞。
2. Python配置问题
  • FastCGI进程管理器无法启动 :检查依赖项是否安装正确,如 flup 库。也可以尝试更改启动命令中的端口号。
  • Django项目运行异常 :确保Django版本与项目兼容,检查 manage.py 脚本的权限。
3. NGINX反向代理问题
  • 请求无法转发到后端服务器 :检查 proxy_pass 指令的配置是否正确,确保后端服务器地址和端口无误。
  • 响应头问题 :使用 proxy_hide_header proxy_pass_header 指令调整响应头的传递。
七、性能优化建议

为了进一步提升系统性能,可以考虑以下优化建议。

1. FastCGI缓存优化
  • 调整缓存时间 :根据实际情况调整 fastcgi_cache_valid 指令的时间,对于频繁更新的内容,减少缓存时间;对于静态内容,增加缓存时间。
  • 控制缓存大小 :使用 fastcgi_cache_path 指令的 max_size 参数控制缓存的最大大小,避免占用过多磁盘空间。
2. PHP-FPM优化
  • 调整进程数量 :根据服务器的硬件资源和负载情况,调整 php-fpm.conf 文件中的进程数量,避免资源浪费或不足。
  • 优化日志记录 :减少不必要的日志记录,提高性能。
3. Django优化
  • 使用缓存框架 :Django自带缓存框架,可以利用它来缓存页面或数据,减少数据库查询。
  • 优化数据库查询 :使用Django的查询优化技巧,如 select_related prefetch_related ,减少数据库查询次数。
4. NGINX反向代理优化
  • 启用缓存 :使用NGINX的代理缓存功能,减少对后端服务器的请求。
  • 负载均衡 :使用多个后端服务器进行负载均衡,提高系统的可用性和性能。

通过以上的配置步骤、问题解决方法和性能优化建议,你可以成功地将NGINX与PHP、Python协同工作,并将NGINX作为反向代理,打造一个高性能、安全稳定的Web应用环境。在实际应用中,还可以根据具体需求进行进一步的调整和优化。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值