一、web服务介绍
1、Apache的三种模型
(1)Apache prefork
- 预派生模式,有一个主控制进程,然后生成多个子进程,使用select模型,最大并发1024
- 每个子进程有一个独立的线程响应用户请求
- 相对比较占用内存,但是比较稳定,可以设置最大和最小进程数
- 是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景
- 优点:稳定
- 缺点:每个用户请求需要对应开启一个进程 , 占用资源较多,并发性差 , 不适用于高并发场景
(2)Apache worker
- 一种多进程和多线程混合的模型
- 有一个控制进程,启动多个子进程
- 每个子进程里面包含固定的线程
- 使用线程程来处理请求
- 当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,
- 由于其使用了线程处理请求,因此可以承受更高的并发
- 优点:相比 prefork 占用的内存较少,可以同时处理更多的请求
- 缺点:使用 keepalive 的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等,等到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用
(3)Apache event
Apache 中最新的模式, 2012 年发布的 apache 2.4.X 系列正式支持 event 模型 , 属于事件驱动模型 (epoll) 每个进程响应多个请求,在现在版本里的已经是稳定可用的模式
它和 worker 模式很像,最大的区别在于,它解决了 keepalive 场景下长期被占用的线程的资源浪费问题(某些线程因为被keepalive ,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)
event MPM 中,会有一个专门的线程来管理这些 keepalive 类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力
- 优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keepalive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放
- 缺点:没有线程安全控制
2、nginx工作场景
3、影响用户体验因素
客户端
- 客户端硬件配置
- 客户端网络速率
- 客户端与服务端距离
服务器
- 服务端网络速率
- 服务端硬件配置
- 服务端架构设计
- 服务端应用程序工作模式
- 服务端并发数量服务端响应文件大小及数量 buffer cache
- 服务端I/O压力1.2.4 服务端 I/O 流程
二、服务器端I/O流程
- 磁盘I/O
- 网络I/O : 一切皆文件,本质为对socket文件的读写
1、磁盘I/O
磁盘 I/O 是进程向内核发起系统调用,请求磁盘上的某个资源比如是 html 文件或者图片,然后
内核通过相应的驱动程序将目标文件加载到内核的内存空间,加载完成之后把数据从内核内存再复
制给进程内存,如果是比较大的数据也需要等待时间
(1)机械磁盘的寻道时间、旋转延迟和数据传输时间:
寻道时间:是指磁头移动到正确的磁道上所花费的时间,寻道时间越短则I/O处理就越快,目前磁盘的寻道时间一般在3-15毫秒左右。
常见的机械磁盘平均寻道时间值:
- 7200转/分的磁盘平均物理寻道时间:9毫秒
- 10000转/分的磁盘平均物理寻道时间:6毫秒
- 15000转/分的磁盘平均物理寻道时间:4毫秒
旋转延迟:是指将磁盘片旋转到数据所在的扇区到磁头下面所花费的时间,旋转延迟取决于磁盘的转速,通常使用磁盘旋转一周所需要时间的1/2之一表示,比如7200转的磁盘平均训传延迟大约为 60*1000/7200/2=4.17毫秒,公式的意思为 (每分钟60秒*1000毫秒每秒/7200转每分/2),如果是 15000转的则为60*1000/15000/2=2毫秒
常见磁盘的平均延迟时间:
- 7200转的机械盘平均延迟:60*1000/7200/2 = 4.17ms
- 10000转的机械盘平均延迟:60*1000/10000/2 = 3ms
- 15000转的机械盘平均延迟:60*1000/15000/2 = 2ms
数据传输时间:指的是读取到数据后传输数据的时间,主要取决于传输速率,这个值等于数据大小除以传输速率,目前的磁盘接口每秒的传输速度可以达到600MB,因此可以忽略不计。
每秒最大IOPS的计算方法:
- 7200转的磁盘IOPS计算方式:1000毫秒/(9毫秒的寻道时间+4.17毫秒的平均旋转延迟时 间)=1000/13.13=75.9 IOPS
- 10000转的磁盘的IOPS计算方式:1000毫秒/(6毫秒的寻道时间+3毫秒的平均旋转延迟时 间)=1000/9=111IOPS
- 15000转的磁盘的IOPS计算方式:15000毫秒/(4毫秒的寻道时间+2毫秒的平均旋转延迟时 间)=1000/6=166.6 IOPS
2、网络I/O
就是网络通信也就是网络协议栈到用户空间进程的 I/O
网络 I/O 处理过程
- 获取请求数据,客户端与服务器建立连接发出请求,服务器接受请求(1-3)
- 构建响应,当服务器接收完请求,并在用户空间处理客户端的请求,直到构建响应完成(4)
- 返回数据,服务器将已构建好的响应再通过内核空间的网络 I/O 发还给客户端(5-7)
不论磁盘和网络 I/O
每次I/O ,都要经由两个阶段:
- 将数据从文件先加载至内核内存空间(缓冲区),等待数据准备完成,时间较长
- 将数据从内核缓冲区复制到用户空间的进程的内存中,时间较短
三、nginx
1、功能
- 静态的web资源服务器html,图片,js,css,txt等静态资源
- http/https协议的反向代理
- 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
- tcp/udp协议的请求转发(反向代理)
- imap4/pop3协议的反向代理
2、基础属性
- 模块化设计,较好的扩展性
- 高可靠性
- 支持热部署:不停机更新配置文件,升级版本,更换日志文件
- 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
- event-driven,aio,mmap,sendfile
3、web服务相关的功能
- 虚拟主机(server)
- 支持 keep-alive 和管道连接(利用一个连接做多次请求)
- 访问日志(支持基于日志缓冲提高其性能)
- url rewirte
- 路径别名
- 基于IP及用户的访问控制
- 支持速率限制及并发数限制
- 重新配置和在线升级而无须中断客户的工作进程
4、进程结构
(1)web请求处理机制
- 多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务器资源耗尽而无法提供请求
- 多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程和此客户端进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。
Nginx 是多进程组织模型,而且是一个由 Master 主进程和 Worker 工作进程组成。
(2)主进程的功能 (master process) :
- 对外接口:接收外部的操作(信号)
- 对内转发:根据外部的操作的不同,通过信号管理 Worker
- 监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
- 读取Nginx 配置文件并验证其有效性和正确性
- 建立、绑定和关闭socket连接
- 按照配置生成、管理和结束工作进程
- 接受外界指令,比如重启、升级及退出服务器等指令
- 不中断服务,实现平滑升级,重启服务并应用新的配置
- 开启日志文件,获取文件描述符
- 不中断服务,实现平滑升级,升级失败进行回滚处理
- 编译和处理perl脚本
(3)工作进程( worker process )的功能:
- 所有 Worker 进程都是平等的
- 实际处理:网络请求,由 Worker 进程处理
- Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争CPU资源,
- 增加上下文切换的损耗
- 接受处理客户的请求
- 将请求依次送入各个功能模块进行处理
- I/O调用,获取响应数据
- 与后端服务器通信,接收后端服务器的处理结果
- 缓存数据,访问缓存索引,查询和调用缓存数据
- 发送请求结果,响应客户的请求
- 接收主程序指令,比如重启、升级和退出等
5、进程间通信
在 Nginx 服务器启动时,主进程根据配置文件决定工作进程数量,使用 fork()函数生成工作进程后将其加入全局工作表。主进程与工作进程通过单向管道通信,主进程接收外界信号后通过管道向工作进程发送指令等信息,工作进程捕获管道可读事件并解析指令执行动作。worker 进程之间通信原理类似,但由于相互隔离,需通过主进程实现。主进程在生成工作进程后遍历进程表,将新进程信息传递给其他进程以准备通信。worker 进程间通信时,一方通过主进程提供的对方进程 PID 找到对应管道写入指令,另一方捕获事件解析执行。此外,worker 进程还可通过共享内存通信,如 upstream 中的 zone 及 limit_req、limit_conn 中的 zone 等,利用操作系统的共享内存机制实现。
6、启动及HTTP连接建立
- Nginx 启动时,Master 进程,加载配置文件
- Master 进程,初始化监听的 socket
- Master 进程,fork 出多个 Worker 进程
- Worker 进程,竞争新的连接,获胜方通过三次握手,建立 Socket 连接,并处理请求7
7、模块介绍
- 核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能
- 标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等
- 可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如: Flash
- 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
- 邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持
- Stream服务模块: 实现反向代理功能,包括TCP协议代理
- 第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等
分类
四、编译及安装
关闭selinux和防火墙
在纯净的实验环境下,下载源码包
wgte http://nginx.org/download/nginx-1.24.0.tar.gz
下载依赖包
dnf install gcc pcre-devel zlib-devel openssl-devel -y
创建用户(条件:不可以远程登录且没有家目录)
useradd -s /sbin/nologin -M nginx
解压安装包
tar zxf nginx-1.24.0.tar.gz
关闭debug
cd nginx-1.24.0/
[root@nginx nginx-1.24.0/]# vim auto/cc/gcc
编译安装的程序
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
说明:
--user=nginx | 指定nginx运行用户 |
--group=nginx | 指定nginx运行组 |
--with-http_ssl_module | 支持https:// |
--with-http_v2_module | 支持http版本2 |
--with-http_realip_module | 支持ip透传 |
--with-http_stub_status_module | 支持状态页面 |
--with-http_gzip_static_module | 支持压缩 |
--with-pcre | 支持正则 |
--with-stream | 支持tcp反向代理 |
--with-stream_ssl_module | 支持tcp的ssl加密 |
--with-stream_realip_module | 支持tcp的透传ip |
安装nginx
make install
查看一下,有四个主要的目录
ls /usr/local/nginx/
conf html logs sbin
说明:
- conf:保存nginx所有的配置文件,其中nginx.conf是nginx服务器的最核心最主要的配置文件,其他 的.conf则是用来配置nginx相关的功能的,例如fastcgi功能使用的是fastcgi.conf和fastcgi_params 两个文件,配置文件一般都有一个样板配置文件,是以.default为后缀,使用时可将其复制并将default后缀 去掉即可。
- html:目录中保存了nginx服务器的web文件,但是可以更改为其他目录保存web文件,另外还有一个50x的web 文件是默认的错误页面提示页面。
- logs:用来保存nginx服务器的访问日志错误日志等日志,logs目录可以放在其他路径,比 如/var/logs/nginx里面。
- sbin:保存nginx二进制启动脚本,可以接受不同的参数以实现不同的功能。
验证版本及编译参数
vim ~/.bash_profile
export PATH=$PATH:/usr/local/nginx/sbin
source ~/.bash_profile
[root@nginx ~]# nginx -V
nginx version: nginx/1.24.0
built by gcc 11.4.1 20231218 (Red Hat 11.4.1-3) (GCC)
built with OpenSSL 3.0.7 1 Nov 2022
TLS SNI support enabled
configure arguments: --group=nginx --with-http_ssl_module --with-http_v2_module -
-with-http_realip_module --with-http_stub_status_module --withhttp_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --
with-stream_realip_module
查看当前进程
ps aux | grep nginx
五、平滑升级回滚
为什么要平滑升级?
比如我们需要对Nginx版本进行升级以满足对其功能的需求,例如添加新模块,需要新功能,而此时Nginx又在跑着业务无法停掉,这时我们就可能选择平滑升级
- 将旧Nginx二进制文件换成新Nginx程序文件(注意先备份)
- 向master进程发送USR2信号
- master进程修改pid文件名加上后缀.oldbin,成为nginx.pid.oldbin
- master进程用新Nginx文件启动新master进程成为旧master的子进程,系统中将有新旧两个Nginx主进程共同提供Web服务,当前新的请求仍然由旧Nginx的worker进程进行处理,将新生成的master进程的PID存放至新生成的pid文件nginx.pid
- 向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止
- 向旧master进程发送QUIT信号,关闭老master,并删除Nginx.pid.oldbin文件
- 如果发现升级有问题,可以回滚∶向老master发送HUP,向新master发送QUIT
1、升级
下载高版本的nginx并解压
wget http://nginx.org/download/nginx-1.26.2.tar.gz
tar zxf nginx-1.26.2.tar.gz
关闭debug
cd nginx-1.24.0/
[root@nginx nginx-1.24.0/]# vim auto/cc/gcc
使用ls命令,将echo-nginx-module-0.63.tar.gz文件拖入虚拟机并解压
编译安装的程序
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --add-module=/root/echo-nginx-module-0.63 --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
安装程序
make
将之前的旧版本nginx命令进行备份
cd /usr/local/nginx/sbin/
cp nginx nginx.24
将新版本的nginx命令复制到旧版本中
\cp -f /root/nginx/nginx-1.26.1/objs/nginx /usr/local/nginx/sbin
检测一下
nginx -t
回收旧版本
kill -WINCH 1567
查看
2、回滚
mv nginx nginx.26
mv nginx.24 nginx
回收新版本
kill -WINCH 1575
六、启动文件编写
关闭nginx服务
nginx -s stop
编写启动文件
保存退出后,就完成了
七、全局配置
Main 全局配置段常见的配置指令分类
- 正常运行必备的配置
- 优化性能相关的配置
- 用于调试及定位问题相关的配置
- 事件驱动相关的配置
vim /usr/local/nginx/conf/nginx.conf
编辑子配置文件
vim /usr/local/nginx/conf.d/vhost.conf
测试
八、反向代理( reverse proxy)
指代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式,这是用的比较多的一种方式。
Nginx 除了可以在企业提供高性能的 web 服务之外,另外还可以将 nginx 本身不具备的请求通过某种预定义的协议转发至其它服务器处理,不同的协议就是Nginx 服务器与其他服务器进行通信的一种规范,主要在不同的场景使用以下模块实现不同的功能
ngx_http_proxy_module: 将客户端的请求以 http 协议转发至指定服务器进行处理
ngx_http_upstream_module 用于定义为 proxy_pass,fastcgi_pass,uwsgi_pass
# 等指令引用的后端服务器分组
ngx_stream_proxy_module: 将客户端的请求以 tcp 协议转发至指定服务器处理
ngx_http_fastcgi_module: 将客户端对 php 的请求以 fastcgi 协议转发至指定服务器助理
ngx_http_uwsgi_module: 将客户端对 Python 的请求以 uwsgi 协议转发至指定服务器处理
- 同构代理:用户不需要其他程序的参与,直接通过 http 协议或者 tcp 协议访问后端服务器
- 异构代理:用户访问的资源时需要经过处理后才能返回的,比如php , python ,等等,这种访问资源需要经过处理才能被访问
1、HTTP协议反向代理
官方文档: https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass
配置参数
proxy_pass;
用来设置将客户端请求转发给的后端服务器的主机
可以是主机名 ( 将转发至后端服务做为主机头首部 ) 、 IP 地址:端口的方式
也可以代理到预先设置的主机群组,需要模块 ngx_http_upstream_module 支持
proxy_pass http://172.25.254.30:8080;
8080 后面无 uri, 即无 / 符号 ,
需要将 location 后面 url 附加到 proxy_pass 指定的url后面
此行为类似于 root
proxy_pass 指定的 uri 不带斜线将访问的 /web
等于访问后端服务器
proxy_pass http://172.25.254.40:8080/;
8080 后面有 uri, 即有 / 符号
相当于置换 , 即访问 /web 时实际返回 proxy_pass 后面uri内容
此行为类似于 alias
proxy_pass 指定的 uri 带斜线
等于访问后端服务器的
http://172.25.254.40:8080/index.html
内容返回给客户端
} # http://nginx/web/index.html ==>
http://1:8080
重启 Nginx 测试访问效果:
curl -L http://www.timinglee.org/web
如果 location 定义其 uri 时使用了正则表达式模式 ( 包括 ~,~*, 但不包括 ^~) ,则 proxy_pass 之后必须不能使用uri
即不能有 / , 用户请求时传递的 uri 将直接附加至后端服务器之后
server {
...
server_name HOSTNAME;
location ~|~* /uri/ {
proxy_pass http://host:port; #proxy_pass 后面的 url 不能加 /
}
...
}
http://HOSTNAME/uri/ --> http://host/uri/
proxy_hide_header field; # 用于 nginx 作为反向代理的时候
在返回给客户端 http 响应时
隐藏后端服务器相应头部的信息
可以设置在 http,server 或 location 块
示例 : 隐藏后端服务器 ETag 首部字段
location /web {
index index.html;
proxy_pass http://10.0.0.18:8080/;
proxy_hide_header ETag;
}
proxy_pass_header field; # 透传
默认 nginx 在响应报文中不传递后端服务器的首部字段 Date, Server, X-Pad, X-Accel 等参数
如果要传递的话则要使用 proxy_pass_header field 声明将后端服务器返回的值传递给客户端
#field 首部字段大小不敏感
示例 : 透传后端服务器的 Server 和 Date 首部给客户端 , 同时不再响应报中显示前端服务器的
Server 字段
proxy_pass_header Server;
proxy_pass_header Date;
proxy_pass_request_body on | off;
是否向后端服务器发送 HTTP 实体部分 , 可以设置在 http,server 或 location 块,默认即为开启
proxy_pass_request_headers on | off;
是否将客户端的请求头部转发给后端服务器,可以设置在 http,server 或 location 块,默认即为开启
proxy_set_header;
可更改或添加客户端的请求头部信息内容并转发至后端服务器,比如在后端服务器想要获取客户端的真实 IP 的时候,就要更改每一个报文的头部
示例 :
location ~ /web {
proxy_pass http://172.25.254.20:80;
proxy_hide_header ETag;
proxy_pass_header Server;
proxy_pass_request_body on;
proxy_pass_request_headers on;
proxy_set_header X-Forwarded-For $remote_addr;
}
vim /etc/httpd/conf/httpd.conf
LogFormat "\"%{X-Forwarded-For}i\" %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%
{User-Agent}i\"" combined
访问后看后端服务器日志
proxy_connect_timeout time;
配置 nginx 服务器与后端服务器尝试建立连接的超时时间,默认为 60 秒
用法如下: proxy_connect_timeout 6s;
60s 为自定义 nginx 与后端服务器建立连接的超时时间 , 超时会返回客户端 504 响应码
proxy_read_timeout time;
配置 nginx 服务器向后端服务器或服务器组发起 read 请求后,等待的超时时间,默认 60s
proxy_send_timeout time;
配置 nginx 项后端服务器或服务器组发起 write 请求后,等待的超时 时间,默认 60s
proxy_http_version 1.0;
用于设置 nginx 提供代理服务的 HTTP 协议的版本,默认 http 1.0
proxy_ignore_client_abort off;
当客户端网络中断请求时, nginx 服务器中断其对后端服务器的请求。即如果此项设置为 on 开启,则服务器会忽略客户端中断并一直等着代理服务执行返回,如果设置为 off ,则客户端中断后 Nginx 也会中断客户端请求并立即记录 499 日志,默认为 off 。
2、针对特定的资源实现代理
动静分离之后的服务器请求状态:
vim /apps/nginx/conf.d/vhost.conf
server {
listen 80;
server_name www.timinglee.org;
location / {
proxy_pass http://172.25.254.30;
}
location ~ \.(png|jpg|gif) {
proxy_pass http://172.25.254.20:8080;
}
}
九、实现FastCGI
什么是PHP-FPM?
- PHP-FPM(FastCGI Process Manager:
- FastCGI进程管理器)是一个实现了Fastcgi的程序,并且提供进程管理的功能。
- 进程包括master进程和worker进程。master进程只有一个,负责监听端口,接受来自web server 的请求
- worker进程一般会有多个,每个进程中会嵌入一个PHP解析器,进行PHP代码的处理
1、配置命令
Nginx 基于模块 ngx_http_fastcgi_module 实现通过 fastcgi 协议将指定的客户端请求转发至 php-fpm 处理,其配置指令如下:
fastcgi_pass address:port;
转发请求到后端服务器, address 为后端的 fastcgi server 的地址,可用位置: location, if in
location
fastcgi_index name;
fastcgi 默认的主页资源,示例: fastcgi_index index.php;
fastcgi_param parameter value [if_not_empty];
设置传递给 FastCGI 服务器的参数值,可以是文本,变量或组合,可用于将 Nginx 的内置变量赋值给自定义
key
fastcgi_param REMOTE_ADDR $remote_addr; # 客户端源 IP
fastcgi_param REMOTE_PORT $remote_port; # 客户端源端口
fastcgi_param SERVER_ADDR $server_addr; # 请求的服务器 IP 地址
fastcgi_param SERVER_PORT $server_port; # 请求的服务器端口
fastcgi_param SERVER_NAME $server_name; # 请求的 server name
Nginx 默认配置示例:
location ~ \.php$ {
root /scripts;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # 默认脚本路径
#fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params; # 此文件默认系统已提供 , 存放的相对路径为
prefix/conf
}
2、源码编译
使用yum解决php依赖
yum install -y bzip2 systemd-devel libxml2-devel sqlite-devel
libpng-devel libcurl-devel oniguruma-devel // 解压源码并安装
./configure \
--prefix=/usr/local/php \ // 安装路径
--with-config-file-path=/usr/local/php/etc \ // 指定配置路径
--enable-fpm \ // 用 cgi 方式启动程序
--with-fpm-user=nginx \ // 指定运行用户身份
--with-fpm-group=nginx \
--with-curl \ // 打开 curl 浏览器支持
--with-iconv \ // 启用 iconv 函数,转换字符编码
--with-mhash \ // mhash 加密方式扩展库
--with-zlib \ // 支持 zlib 库,用于压缩 http 压缩传输
--with-openssl \ // 支持 ssl 加密
--enable-mysqlnd \ //mysql 数据库
--with-mysqli \
--with-pdo-mysql \
--disable-debug \ // 关闭 debug 功能
--enable-sockets \ // 支持套接字访问
--enable-soap \ // 支持 soap 扩展协议
--enable-xml \ // 支持 xml
--enable-ftp \ //支持 ftp
--enable-gd \ // 支持 gd 库
--enable-exif \ // 支持图片元数据
--enable-mbstring \ // 支持多字节字符串
--enable-bcmath \ // 打开图片大小调整 , 用到 zabbix 监控的时候用到了这个模块
--with-fpm-systemd //支持 systemctl 管理 cgi
3、nginx源码编译
ls
tar zxf nginx-1.24.0.tar.gz
ls
nginx-1.24.0 nginx-1.24.0.tar.gz
cd nginx-1.24.0/
ls
auto CHANGES.ru configure html man src
CHANGES conf contrib LICENSE README
增加模块:
./configure --prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \ --with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
checking for OS
Linux 5.14.0-427.13.1.el9_4.x86_64 x86_64
checking for C compiler ... not found
./configure: error: C compiler cc is not found
dnf install gcc -y
dnf install pcre-devel -y
dnf install zlib-devel -y
dnf install openssl-devel -y
ls
auto CHANGES.ru configure html Makefile objs src CHANGES
conf contrib LICENSE man README
make && make install
cd /usr/local/nginx/
ls
conf html logs sbin
cd sbin/
ls nginx
./nginx
启动nginx
ps aux | grep nginx
4、PHP相关配置优化
cd /usr/local/php/etc/
ls
php-fpm.conf.default php-fpm.d
cp -p php-fpm.conf.default php-fpm.conf
vim php-fpm.conf
指定pid文件存放位置
[root@nginx etc]# cd php-fpm.d/
[root@nginx php-fpm.d]# cp www.conf.default www.conf -p
生成主配置文件
注:如果编译的时候没有加参数--with-config-file-path=/usr/local/php/etc 配置文件就在/usr/local/php/lib/ 如果加了就在/usr/local/php/etc
cp php.ini-production /usr/local/php/lib/php.ini
修改时区
vim /usr/local/php/lib/php.ini
生成启动文件
cp sapi/fpm/php-fpm.service /lib/systemd/system/
vim /lib/systemd/system/php-fpm.service
配置环境变量
[root@nginx php-8.3.9]# cd /usr/local/php/bin/
[root@nginx bin]# vim ~/.bash_profile
[root@nginx bin]# source ~/.bash_profile
定义子配置文件
vim /usr/local/nginx/conf/nginx.conf
[root@nginx bin]# mkdir /usr/local/nginx/conf.d/
[root@nginx bin]# vim /usr/local/nginx/conf.d/vhosts.conf
准备php测试页面
cat /data/php/index.php
<?php
phpinfo();
?>
测试
十、安装memcache模块
解压安装包
tar zxf memcache-8.2.tgz
下载autoconf
cd memcache-8.2/
yum install autoconf
phpize
./configure && make && make install
复制测试文件到nginx发布目录中
cp example.php memcache.php /data/php/
vim /data/php/memcache.php
配置php加载mamcache模块
vim /usr/local/php/lib/php.ini
systemctl reload php-fpm
部署memached
yum install memcached -y
systemctl enable --now memcached.service
cat /etc/sysconfig/memcached
十一、PHP高速缓存
在我们安装的nginx中默认不支持memc和srcache功能,需要借助第三方模块来让nginx支持此功能,所以nginx需要重新编译 ,这就是为什么我们之前要重新编码nginx
编辑所需软件包
srcache-nginx-module-0.33.tar.gz
memc-nginx-module-0.20.tar.gz
内容:
./configure --prefix=/apps/nginx --user=nginx -- group=nginx --with-http_ssl_module --with-http_v2_module --withhttp_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module -- add-module=/root/memc-nginx-module-0.20 --add-module=/root/srcache-nginx-module0.33
安装
make && make install
编辑子配置文件
vim /usr/local/nginx/conf.d/vhosts.conf
systemctl start nginx.service
ab -n500 -c10 http://www.li.org/index.php
十二、nginx二次开发版本
openresty
openresty与nginx二者只能运行一个,需要先把nginx关闭
systemctl stop nginx
dnf -yq install gcc pcre-devel openssl-devel perl
创建一个没有家目录不能远程登录的用户,如果有就不用创建
useradd -r -s /sbin/nologin nginx
cd /usr/local/src
wget https://openresty.org/download/openresty-1.17.8.2.tar.gz
tar -zxf openresty-1.17.8.2.tar.gz
cd openresty-1.17.8.2
编码
./configure --prefix=/usr/local/openresty --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
安装
make && make install
环境变量
vim ~/.bash_profile
source ~/.bash_profile
开启
openresty
netstat -antlulpe |grep 80
事实上,openresty与nginx的用法基本一致,至此,以上就是所有内容了