LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

Nginx 反向代理(四):实现 FastCGI 代理

admin
2025年6月29日 18:36 本文热度 29

4 Nginx 反向代理

4.7 实现 FastCGI 代理

4.7.1 相关指令和参数

关于 PHP 和 FastCGI 的内容请回顾 Apache 章节内容,此章节重点讲解 Nginx 将前端请求通过 FastCGI 协议反向代理到后端的 PHP-FPM,将请求交由 PHP 程序处理

http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html
fastcgi_index name; # 后端 FastCGI 服务器默认资源,默认值为空,作用域 http, server, locationfastcgi_pass address; # 指定后端 FastCGI 服务器地址,可以写 IP:port,也可以指定 socket 文件                    # 作用域 location, if in locationfastcgi_param parameter value [if_not_empty];                    # 设置传递给FastCGI服务器的参数值,可以是文本,变量或组合,可用于将Nginx的内置变量赋值给自定义key                    # 作用域 http, server, location
4.7.2 PHP 环境准备
#安装php-fpm[root@ubuntu ~]# apt install php8.1-fpm
#查看版本[root@ubuntu ~]# php -vPHP 8.1.2-1ubuntu2.14 (cli) (built: Aug 18 2023 11:41:11) (NTS)Copyright (c) The PHP GroupZend Engine v4.1.2, Copyright (c) Zend Technologieswith Zend OPcache v8.1.2-1ubuntu2.14, Copyright (c), by Zend Technologies
#查看服务状态[root@ubuntu ~]# systemctl status php8.1-fpm.service
#查看所有文件[root@ubuntu ~]# dpkg -L php8.1-fpm
#查看配置文件[root@ubuntu ~]# ls -lh /etc/php/8.1/total 12Kdrwxr-xr-x 3 root root 4.0K Feb 18 16:05 cli # cli 模式配置drwxr-xr-x 4 root root 4.0K Feb 18 16:05 fpm # fpm 模式配置drwxr-xr-x 2 root root 4.0K Feb 18 16:05 mods-available # cli 和 fpm 中引用的具体内容
[root@ubuntu ~]# ls /etc/php/8.1/fpm/conf.d php-fpm.conf php.ini pool.d
#PHP-FPM 主要配置项[root@ubuntu ~]# cat /etc/php/8.1/fpm/php-fpm.conf | grep -E " ="pid = /run/php/php8.1-fpm.pid # 主进程文件error_log = /var/log/php8.1-fpm.log # 错误日志;syslog.facility = daemon # 日志分类;syslog.ident = php-fpm;log_level = notice # 日志级别;log_limit = 4096;log_buffering = no;emergency_restart_threshold = 0;emergency_restart_interval = 0;process_control_timeout = 0; process.max = 128; process.priority = -19;daemonize = yes # 后台守护进程运行;rlimit_files = 1024;rlimit_core = 0;events.mechanism = epoll;systemd_interval = 10
[root@ubuntu ~]# cat /etc/php/8.1/fpm/pool.d/www.conf | grep -E " =";prefix = /path/to/pools/$pooluser = www-data # php-fpm worker 进程属主group = www-data # php-fpm worker 进程属组listen = /run/php/php8.1-fpm.sock # 与 PHP-FPM 的通信方式,可以写成 IP:port;listen.backlog = 511listen.owner = www-datalisten.group = www-data;listen.mode = 0660;listen.acl_users =;listen.acl_groups =;listen.allowed_clients = 127.0.0.1; process.priority = -19; process.dumpable = yespm = dynamic # 动态生成工作进程pm.max_children = 5 # 最多5个工作进程pm.start_servers = 2 # 启动时生成 2 个工作进程pm.min_spare_servers = 1 # 最少1个空闲工作进程pm.max_spare_servers = 3 # 最多3个空闲工作进程;pm.max_spawn_rate = 32;pm.process_idle_timeout = 10s;;pm.max_requests = 500;pm.status_path = /status # 状态页地址,注意路径不要和 nginx 状态页冲突;pm.status_listen = 127.0.0.1:9001 # 访问状态页的IP和端口;ping.path = /ping # php-fpm 心跳检测请求路径;ping.response = pong # 心跳检测返回内容;access.log = log/$pool.access.log # 访问日志路径;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{milli}d %{kilo}M %C%%" # 访问日志格式;slowlog = log/$pool.log.slow # 慢日志路径;request_slowlog_timeout = 0;request_slowlog_trace_depth = 20;request_terminate_timeout = 0;request_terminate_timeout_track_finished = no;rlimit_files = 1024;rlimit_core = 0;chroot =;chdir = /var/www;catch_workers_output = yes;decorate_workers_output = no;clear_env = no;security.limit_extensions = .php .php3 .php4 .php5 .php7;env[HOSTNAME] = $HOSTNAME;env[PATH] = /usr/local/bin:/usr/bin:/bin;env[TMP] = /tmp;env[TMPDIR] = /tmp;env[TEMP] = /tmp;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com;php_flag[display_errors] = off;php_admin_value[error_log] = /var/log/fpm-php.www.log;php_admin_flag[log_errors] = on;php_admin_value[memory_limit] = 32M
#当前是使用 socket 进行数据交换,socket 必须是一个本地文件#所以使用socket 进行通信,要保证 nginx 和 php-fpm 运行在同一台服务器上[root@ubuntu ~]# cat /etc/php/8.1/fpm/pool.d/www.conf | grep -E "^listen ="listen = /run/php/php8.1-fpm.sock
[root@ubuntu ~]# ls -lh /run/php/total 4.0K-rw-r--r-- 1 root root 3 Feb 18 22:44 php8.1-fpm.pidsrw-rw---- 1 www-data www-data 0 Feb 18 22:44 php8.1-fpm.socklrwxrwxrwx 1 root root 30 Feb 18 22:44 php-fpm.sock -> /etc/alternatives/php-fpm.sock
#使用 IP:port 监听,Nginx 和 php-fpm 通信走网络 FastCGI 接口[root@ubuntu ~]# cat /etc/php/8.1/fpm/pool.d/www.conf | grep -E "^;?listen =";listen = /run/php/php8.1-fpm.socklisten = 127.0.0.1:9000
#取消下面几行注释[root@ubuntu ~]# vim /etc/php/8.1/fpm/pool.d/www.conf;pm.status_path = /statuspm.status_path = /php-statuspm.status_listen = 127.0.0.1:9001ping.path = /pingping.response = pong
[root@ubuntu ~]# systemctl reload php8.1-fpm.service[root@ubuntu ~]# ss -tnlp | grep 9000
4.7.3 配置 Nginx 转发到 FastCGI
[root@ubuntu ~]# ll /etc/nginx/fastcgi*-rw-r--r-- 1 root root 1125 May 20 2025 /etc/nginx/fastcgi.conf-rw-r--r-- 1 root root 1055 May 20 2025 /etc/nginx/fastcgi_params
[root@ubuntu ~]# wc -/etc/nginx/fastcgi*  27 /etc/nginx/fastcgi.conf  26 /etc/nginx/fastcgi_params
[root@ubuntu ~]# diff /etc/nginx/fastcgi.conf /etc/nginx/fastcgi_params2d1< fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
/etc/nginx/fastcgi.conf 和 /etc/nginx/fastcgi_params 都是用于配置 FastCGI 的默认参数的文件# 这两个文件中都用 fastcgi_param 指令定义了很多要传给后端 FastCGI 接口的参数# fastcgi.conf 比 fastcgi_params 中多出一行配置,至于为什么要用两个文件,属于历史遗留问题# 在设置 FastCGI 反向代理时可以引用这两个文件中的任意一个,但引用 fastcgi_params 时,要额外加一行# fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
server {  listen 80;  server_name www.m99-josedu.com;  root /var/www/html/www.m99-josedu.com;
  #反向代理 php  location ~ \.php$ {    fastcgi_pass 127.0.0.1:9000;    fastcgi_index index.php;    include fastcgi.conf;  }
  # php-fpm status,路径要与 /etc/php/8.1/fpm/pool.d/www.conf 中的 pm.status_path = /php-status 一致  location /php-status {    fastcgi_pass 127.0.0.1:9001;    include fastcgi.conf;  }
  # php-fpm 心跳检测  location = /ping {    fastcgi_pass 127.0.0.1:9000;    include fastcgi.conf;  }
  #nginx status  location /status {    stub_status;  }}
[root@ubuntu ~]# ls -lh /var/www/html/www.m99-josedu.com/total 12K-rw-r--r-- 1 root root 11 Feb 20 14:08 index.html-rw-r--r-- 1 root root 17 Feb 20 14:09 index.php-rw-r--r-- 1 root root 23 Feb 20 14:09 test.php
[root@ubuntu ~]# cat /var/www/html/www.m99-josedu.com/index.php<?phpphpinfo();
[root@ubuntu ~]# cat /var/www/html/www.m99-josedu.com/test.php<?phpecho "test.php";
#在浏览器中测试http://www.m99-josedu.comhttp://www.m99-josedu.com/index.phphttp://www.m99-josedu.com/test.phphttp://www.m99-josedu.com/pinghttp://www.m99-josedu.com/statushttp://www.m99-josedu.com/status?jsonhttp://www.m99-josedu.com/status?full
4.7.4 综合案例

IP 
角色 
服务
10.0.0.206 
Proxy Server 
Nginx
10.0.0.210 
Web Server 
Nginxphp-fpmdiscuz
10.0.0.159 
Web Server 
Nginxphp-fpmdiscuz
10.0.0.208 
DB 
mysql


#Proxy Server 配置
[root@ubuntu ~]# cat /etc/nginx/sites-enabled/bbs.m99-josedu.comupstream group1 {  server 10.0.0.210;  server 10.0.0.159 down;}
server {  listen 80;  server_name bbs.m99-josedu.com;  location / {    proxy_pass http://group1;    proxy_set_header host $http_host;  }}
#web Server 配置[root@ubuntu ~]# apt update;apt install nginx php8.1-fpm php8.1-mysql php8.1-zip php8.1-xml
[root@ubuntu ~]# cat /etc/nginx/sites-enabled/bbs.m99-josedu.com.confserver {  listen 80;  server_name bbs.m99-josedu.com;  root /var/www/html/bbs.m99-josedu.com;  index index.html index.php;  location ~ \.php$ {    fastcgi_pass 127.0.0.1:9000;    fastcgi_index index.php;    include fastcgi.conf;  }}
[root@ubuntu ~]# cat /etc/php/8.1/fpm/pool.d/www.conf;listen = /run/php/php8.1-fpm.socklisten = 127.0.0.1:9000
#重启服务[root@ubuntu ~]# systemctl restart nginx.service[root@ubuntu ~]# systemctl restart php8.1-fpm.service
#下载源码并部署# https://www.discuz.vip/download.html[root@ubuntu ~]# unzip Discuz_X3.5_SC_UTF8_20231221.zip -d discuz[root@ubuntu ~]# mv discuz/upload/ /var/www/html/bbs.m99-josedu.com[root@ubuntu ~]# chown -R www-data.www-data /var/www/html/bbs.m99-josedu.com
#DB 配置[root@ubuntu ~]# apt update;apt install mysql-server-8.0 redis-server
#修改 mysql 配置[root@ubuntu ~]# cat /etc/mysql/mysql.conf.d/mysqld.cnf#注释两行#bind-address = 127.0.0.1#mysqlx-bind-address = 127.0.0.1#添加两行skip-name-resolvedefault_authentication_plugin=mysql_native_password
[root@ubuntu ~]# systemctl restart mysql.service
#创建数据库,创建账号并授权mysql> create database discuz;mysql> create user 'discuzer'@'10.0.0.%' identified by '123456';mysql> grant all on discuz.* to 'discuzer'@'10.0.0.%';mysql> flush privileges;
# 通过浏览器完成安装,在浏览器中打开 http://bbs.m99-josedu.com# 然后修改 Proxy Server 配置,再完成另外一台安装,都完成安装后再次修改配置,让两台 Web Server 都上线# 测试OK,但如果上传附件,图片,会发现有时候会加载不出来,因为文件只上传到了其中一台 Web Server 上

— END —


阅读原文:原文链接


该文章在 2025/7/1 23:15:32 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved