nginx实战-PHP
课程目标
-
项目的开发流程
-
理解静态资源与动态资源
-
fastcgi与php-fpm模块
-
LNMP项目部署
-
CA与https
-
nginx平滑升级
课程实验
-
项目的开发流程概述
-
静态资源与动态资源实验
-
fastcgi与php-fpm模块实验
-
PHP项目的部署
-
私有证书与公有证书的制作
-
nginx平滑升级实验
课堂引入
- 一个完整的项目的生命周期是有很多个流程的,运维只是其中一个重要的流程
授课进程
一、项目开发流程
1、项目生命周期

需求收集
这是软件的起源,也是软件开发生命周期的重要一步。在这个阶段,开发团队与业务利益相关者密切合作,了解用户需求,定义项目的范围,并确定要解决的问题。需求收集阶段的目标是确保所有相关方对项目的期望和需求都得到理解和满足
设计
在设计阶段,开发团队将分析收集到的需求,并创建软件的设计方案。这个方案将包括软件的架构、接口设计、数据设计以及安全和性能考虑。设计阶段的输出是一个详细的设计文档,它为编码阶段提供了清晰的指南
编码
编码阶段是将设计转化为实际的代码。在这个阶段,开发团队负责根据设计文档编写代码,并确保代码的质量和可维护性。编码过程中需要遵循编码规范、最佳实践和团队约定的代码风格
测试
在测试阶段,团队将验证软件的各项功能是否按预期工作。测试类型可能包括单元测试、集成测试、系统测试以及验收测试。通过测试,团队可以发现并修复潜在的问题和错误,从而提高软件的质量和稳定性
部署运维
部署阶段是将软件发布到生产环境的过程。在此阶段,团队将确保软件在目标环境中正常运行,并解决任何可能出现的问题。部署完成后,团队将进行最终的验证和用户培训,以确保用户能够顺利地使用软件维护阶段是软件生命周期中最长的一个阶段。在这个阶段,团队将对已发布的软件进行维护,包括错误修复、功能增强以及定期的更新和升级。此外,团队还将持续监控软件的性能,以确保其持续可用和安全
二、资源
1、概述
一个应用程序要想在Internet上被外界访问,则需将其部署在Web服务器上
也就是说Web资源存放在Web服务器上。这也可以说明: web服务器有着充当web资源容器的功能。这也是为何能将web服务器称为web容器的原因。如Tomcat容器
总结:在web容器上的都可以称之为资源。
外界访问该应用程序的目的,就是要获取该应用中包含相应的web资源。这些web资源可以分为两类:静态web资源 和 动态web资源
2、静态与动态
静态web资源:
-
优 点:访问速度快
-
缺 点:交互性差,要想页面内容发生改变则必须手动修改页面文件,很不方便。
-
如:HTML、CSS、JavaScript、图片
动态web资源:
-
优 点:动态资源可以根据需求获取不同的内容;而页面内容数据的更新,却无需修改页面文件
-
缺 点:访问速度不及静态页面
-
如:JSP/Servlet....
3、常见的资源文件
| 资源文件 | 语言识别 | 框架识别 |
|---|---|---|
| index.php | PHP | Windows/Linux+nginx+php+mysql |
| index.py | python | Windows/Linux+apache+python+mysql |
| index.jsp | JAVA | windows/Linux+nginx+tomcat+mysql |
| index.asp | c# | Windows+iis+asp.net+sql-server/oracle/mogodb |
三、LNMP项目部署
1、Linux部署
#!/bin/bash
# 1. 设置主机名
hostnamectl set-hostname lnmp
# 2. 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
# 3. 配置yum源
cd /etc/yum.repos.d
mv CentOS-Base.repo CentOS-Base.repo.backup
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache
yum install epel-release -y
# 4. 重启
reboot
2、nginx部署
vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
yum install yum-utils -y
yum install nginx -y
systemctl enable nginx --now
3、PHP部署
yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm #安装php7的yum源,默认是5的版本
yum-config-manager --enable remi-php73 # 配置升级
yum install -y php php-mysqlnd gd php-gd
vim /usr/share/nginx/html/index.php
<?php
phpinfo();
?>
vim /etc/nginx/conf.d/default.conf
server {
location / {
...
index index.php index.html;
...
}
}
systemctl restart nginx
访问地址:http://IP
这种情况通常是因为nginx没有将PHP文件交给PHP解释器处理,而是直接返回了文件内容,导致浏览器将其当作下载文件。
安装并启用php-fpm
yum install php-fpm.x86_64 -y
systemctl enable php-fpm --now
修改nginx配置文件
vim /etc/nginx/conf.d/default.conf
location ~ \.php$ {
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
systemctl restart nginx

4、MySQL部署
yum -y install mariadb-server mariadb
systemctl enable mariadb --now
mysql -uroot -p
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456'); # 设置初始化密码
flush privileges; # 刷新权限
create database wordpress default charset utf8; # sql 创建数据库
exit; # 退出数据库
5、业务上线
1. 上传源码包
2. 解压缩源码并进入源码目录
3. 复制文件到nginx的页面目录

四、fastcgi与php-fpm模块
1、cgi概述
CGI : Common Gateway Interface,公共网关接口。在物理层面上是一段程序,运行在服务器上,提供同客户端HTML页面的接口
Nginx+CGI处理步骤
用户发送HTTP请求到Web服务器
Web服务器fork一个CGI子进程,将用户请求交给CGI程序
CGI程序把处理结果传送给Web服务器,CGI子进程被销毁
Web服务器把结果返回到用户

什么是fork?
fork()系统调用用于创建新进程,新创建的进程为子进程,调用fork()并创建新进程的进程是父进程。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,这俩个进程默认完成同样的功能,但如果初始参数和传入的变量不同,俩个进程也可以完成不同的功能
调用fork发生了什么?
子进程创建后,系统会给子进程分配资源,然后把原来的进程的所有值都复制到新的子进程中,只有少数值与原来的进程的值不同;其实就是父进程的一份副本。但是子进程和父进程驻留在不同的内存空间上。这些内存空间具有相同的内容,并且一个进程执行的任何操作都不会影响其他进程
CGI缺点
- CGI每处理一个请求,就要fork一个子进程,处理完请求,再销毁子进程。频繁的创建和销毁进程,就会大大降低Web服务器的效率
2、fastcgi
FastCGI是一个可伸缩的、高速的在HTTP服务器和动态脚本语言间通信的接口,主要优点是把动态语言和HTTP服务器分离开来
主要是将CGI进程保持在内存中进行管理调度,以获得较高的性能
fastCGI的工作原理
Web服务器启动时载入fastCGI进程管理器
fastCGI进程管理器自身初始化,启动多个CGI子进程并等待来自Web服务器的连接
当客户端请求到达Web服务器时,fastCGI进程管理器选择并连接到一个CGI进程来处理请求
fastCGI子进程完成处理后将结果返回给Web服务器
问题:Nginx下fastCGI与服务器是分离的,就是Nginx无法直接调用fastCGI,需要用spawn-fcgi来管理

3、php-fpm
FPM(FastCGI 进程管理器)是 PHP FastCGI 的主要实现,实现了许多对高负载网站有用的功能。FPM 管理多个 PHP 进程,并通过 FastCGI 协议与 Web 服务器通信,提供更好的性能和资源管理。一般 nginx 服务器使用FPM。
PHP-FPM使用了多进程模型来处理PHP请求。当Web服务器接收到一个PHP请求时,它将该请求转发给PHP-FPM进程管理器。PHP-FPM会根据配置文件中的参数来创建、管理和回收PHP解释器进程(也称为worker进程),并将请求分配给这些worker进程来处理。这种多进程模型使得PHP-FPM能够处理大量并发请求,并提高PHP应用程序的性能和稳定性
FPM的工作流程
1. Web服务器接收到一个包含PHP请求的HTTP请求。
2. Web服务器将该请求转发给PHP-FPM进程管理器。
3. PHP-FPM进程管理器接收到请求后,从空闲进程池中选择一个worker进程来处理该请求。如果没有空闲进程,则根据配置文件中的参数决定是否要创建新的worker进程。
4. 选定的worker进程接收到请求后,会解析PHP代码并执行相应的操作。它可以连接数据库、进行文件读写、生成HTML等。
5. worker进程将处理结果返回给PHP-FPM进程管理器。
6. PHP-FPM进程管理器将处理结果返回给Web服务器。
7. Web服务器将最终结果返回给客户端。
五、CA与https
1、概述
CA:即Certificate Authority,证书颁发机构的简称。
CA认证:是一种数字证书,由权威的第三方机构颁发,用于证明网站或组织的身份和合法性。它可以帮助用户确认所访问的网站是否真实可信,防止用户遭受假冒网站的欺诈

https:HTTPS(Hypertext Transfer Protocol Secure)是HTTP(Hypertext Transfer Protocol)的扩展版。它利用SSL(Secure Sockets Layer)或TLS(Transport Layer Security)协议对数据进行加密,确保数据在客户端和服务器之间传输的过程中不被窃取或篡改。 HTTPS的主要目的是确保数据在客户端(如浏览器)和服务器之间传输时的机密性、完整性和真实性。这种保护机制极大地提高了数据传输的安全性,防止了信息被窃取和篡改。HTTPS常用于需要保护敏感信息的场景,如网上银行、电子商务网站、电子邮件服务和社交媒体平台等。
2、私有证书
基于https的协议工作的一中虚拟主机,要构建这样的网站需要mod_ssl模块的支持。且需要提供两个文件:证书文件和私钥文件,证书文件是标识这个网站服务器身份的,私钥文件主要用来实现在服务器端对数据进行加密,然后在网站中传输的。
1. 准备存放证书和秘钥的目录
2. 生成私钥
3. 使用秘钥文件生成证书申请书
4. 同意申请,生成证书
5. 编辑nginx配置文件,设置https访问
6. 访问验证
# 准备存放证书和秘钥的目录
mkdir /etc/nginx/ssl
# 生成私钥(使用openssl生成基于rsa数学算法长度为2048bit的秘钥,文件必须以key为结尾)
openssl genrsa 2048 > /etc/nginx/ssl/server.key
# 使用秘钥文件生成证书申请书
openssl req -new -key /etc/nginx/ssl/server.key > /etc/nginx/ssl/server.csr
# 同意申请,生成证书
openssl req -x509 -days 365 -key /etc/nginx/ssl/server.key -in /etc/nginx/ssl/server.csr > /etc/nginx/ssl/server.crt
# 编辑nginx配置文件,设置https访问
vim /etc/nginx/conf.d/default.conf
server {
listen 443 ssl;
server_name www.haha.com;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
}
systemctl restart nginx
# 访问验证
https://www.haha.com/


3、公有证书
前提:公有证书需要有公网的服务器,公网的IP,域名,机构签发的证书,才能够演示
1. 购买阿里云主机
2. 安装nginx
3. 查看防火墙是否开放相应的端口
4. 购买域名
5. 域名解析
6. 申请CA证书
7. 上传证书
8. 修改nginx配置,添加证书
9. 测试访问
六、nginx平滑升级
1、概述
随着 Nginx 越来越流行,并且 Nginx 的优势也越来越明显,Nginx 的版本迭代也开起了加速模式。新版本也带来了新的功能,例如 stream 四层代理功能等,伴随着 Nginx 的广泛应用,版本升级必然越来越快。一般有两种情况下需要升级 Nginx:一种是确实要升级 Nginx 的版本,另一种是要为 Nginx 添加新的模块
2、原理
-
在不停掉老进程的情况下,启动新进程
-
老进程负责处理仍然没有处理完的请求,但不再接受处理请求
-
新进程接受新请求
-
老进程处理完所有请求,关闭所有连接后,停止
3、实战
此处就不行平滑升级的演示了,平滑升级需要使用源码的方式进行安装(晚上的作业)
课堂小结
-
项目的开发流程概述
-
静态资源与动态资源实验
-
fastcgi与php-fpm模块实验
-
PHP项目的部署
-
私有证书与公有证书的制作
-
nginx平滑升级实验
课后作业
-
完成课堂的案例及练习
-
将今天的内容整理为思维导图的形式
-
完成以下需求
实现nginx的平滑升级
扩展内容
面试题
1、 fastcgi和cgi的区别
2、nginx的平滑升级是如何实现的?