安装配置nginx
1 | sudo apt update |
编辑nginx配置
首先删除/etc/nginx/sites-enabled中的默认配置文件default
新建test.conf文件,内容如下
1 | 定义 HTTP 服务器块 |
启动并设置开机自启
1 | sudo systemctl restart nginx |
CGI与Fast CGI
CGI (Common Gateway Interface) 是一种在Web 服务器和外部程序之间传递数据的标准协议,它允许服务器与外部程序进行交互,从而生成动态网页内容。简单来说,CGI 就像一个中间人,负责将用户在网页上提交的数据传递给服务器端的程序,然后将程序处理后的结果返回给用户。
FastCGI 是一种让交互程序(如网站应用程序) 与Web 服务器通信的协议,它是 CGI 的一个改进版本。FastCGI 通过减少每次请求都需要重新启动程序的开销,从而显著提高性能和可扩展性。简单来说,FastCGI 允许Web 服务器与动态脚本语言(如PHP) 之间更高效地通信,从而可以同时处理更多的Web 请求。
两者对比
传统 CGI 的问题
- 每次请求都启动新进程:用户每次访问动态页面Web 服务器会启动一个新的 PHP 解释器进程来处理请求,处理完立即关闭。
- 高开销:频繁的进程创建和销毁会消耗大量 CPU 和内存,导致 并发能力差。
- 依赖本地进程:CGI 通常通过 本地 Shell 或管道(pipe) 与 Web 服务器通信,无法跨机器部署。
- 性能瓶颈:如果 PHP 脚本较复杂,Web 服务器会被阻塞,影响整体性能。
- 环境变量传递:CGI 依赖 环境变量(如
QUERY_STRING
) 传递请求参数,数据量有限,且解析复杂。 - 无状态:每次请求都是独立的,无法共享上下文(如数据库连接池)。
- 与 Web 服务器同权限:CGI 进程通常以 Web 服务器(如
www-data
)身份运行,存在安全风险(如 PHP 漏洞影响整个服务器)。
FastCGI 的改进
- 进程池:FastCGI 预先启动一组 长期运行 的 Worker 进程(如 PHP-FPM),处理完请求后 不退出,而是等待下一个请求。
- 复用进程:多个 HTTP 请求可以 复用同一个 FastCGI 进程,避免了反复创建和销毁进程的开销。
- 基于 TCP/IP 或 Unix Socket:FastCGI 进程可以运行在 独立服务器 上,通过 网络协议 与 Web 服务器通信(如 Nginx → PHP-FPM)。
- 非阻塞通信:Web 服务器可以异步发送请求,不阻塞自身运行。
- 二进制协议:FastCGI 使用 结构化二进制数据 传输请求(比文本解析更快)。
- 持久化上下文:FastCGI 进程可以 保持状态(如数据库连接复用)。
- 独立进程:FastCGI 进程(如 PHP-FPM)可以以 低权限用户 运行,减少攻击面。
- 资源隔离:Web 服务器和 FastCGI 进程可以部署在不同的沙盒或容器中。
安装数据库管理系统
安装mariadb数据库(mysql的社区版本)
1 | sudo apt install mariadb-server mariadb-client #安装 |
安装PHP
1 | sudo apt install php7.3 php7.3-bcmath php7.3-cli php7.3-common php7.3-curl php7.3-fpm php7.3-gd php7.3-gmp php-imagick php7.3-intl php7.3-json php7.3-mbstring php7.3-mysql php-pear php7.3-xml php7.3-xmlrpc php7.3-zip php7.3-imap -y |
修改nginx配置以支持php
修改fastcgi_pass内容为:
1 | fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; #将 PHP 请求转发到 PHP-FPM 的 Unix Socket 文件(通常由 PHP-FPM 生成),实现高效本地进程间通信(IPC)。 |
fastcgi_pass
是 Nginx 中用于 将 PHP/Python 等动态请求转发给 FastCGI 服务器(如 PHP-FPM) 的核心指令,决定了动态内容如何被处理。
重启nginx服务
1 | sudo systemctl restart nginx |
访问服务器IP地址,成功响应