教你学习企业高性能web服务器-nginx

一、web服务介绍

1、Apache的三种模型

(1)Apache prefork

  1. 预派生模式,有一个主控制进程,然后生成多个子进程,使用select模型,最大并发1024
  2. 每个子进程有一个独立的线程响应用户请求
  3. 相对比较占用内存,但是比较稳定,可以设置最大和最小进程数
  4. 是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景
  • 优点:稳定
  • 缺点:每个用户请求需要对应开启一个进程 , 占用资源较多,并发性差 , 不适用于高并发场景

(2)Apache worker

  1. 一种多进程和多线程混合的模型
  2. 有一个控制进程,启动多个子进程
  3. 每个子进程里面包含固定的线程
  4. 使用线程程来处理请求
  5. 当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,
  6. 由于其使用了线程处理请求,因此可以承受更高的并发
  • 优点:相比 prefork 占用的内存较少,可以同时处理更多的请求
  • 缺点:使用 keepalive 的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等,等到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用

(3)Apache event

Apache 中最新的模式, 2012 年发布的 apache 2.4.X 系列正式支持 event 模型 , 属于事件驱动模型 (epoll) 每个进程响应多个请求,在现在版本里的已经是稳定可用的模式
它和 worker 模式很像,最大的区别在于,它解决了 keepalive 场景下长期被占用的线程的资源浪费问题(某些线程因为被keepalive ,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)
event MPM 中,会有一个专门的线程来管理这些 keepalive 类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力

  • 优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keepalive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放
  • 缺点:没有线程安全控制

2、nginx工作场景

3、影响用户体验因素

客户端

  1. 客户端硬件配置
  2. 客户端网络速率
  3. 客户端与服务端距离

服务器

  1. 服务端网络速率
  2. 服务端硬件配置
  3. 服务端架构设计
  4. 服务端应用程序工作模式
  5. 服务端并发数量服务端响应文件大小及数量 buffer cache
  6. 服务端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. 获取请求数据,客户端与服务器建立连接发出请求,服务器接受请求(1-3)
  2. 构建响应,当服务器接收完请求,并在用户空间处理客户端的请求,直到构建响应完成(4)
  3. 返回数据,服务器将已构建好的响应再通过内核空间的网络 I/O 发还给客户端(5-7)

不论磁盘和网络 I/O
每次I/O ,都要经由两个阶段:

  1. 将数据从文件先加载至内核内存空间(缓冲区),等待数据准备完成,时间较长
  2. 将数据从内核缓冲区复制到用户空间的进程的内存中,时间较短

三、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) :

  1. 对外接口:接收外部的操作(信号)
  2. 对内转发:根据外部的操作的不同,通过信号管理 Worker
  3. 监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
  4. 读取Nginx 配置文件并验证其有效性和正确性
  5. 建立、绑定和关闭socket连接
  6. 按照配置生成、管理和结束工作进程
  7. 接受外界指令,比如重启、升级及退出服务器等指令
  8. 不中断服务,实现平滑升级,重启服务并应用新的配置
  9. 开启日志文件,获取文件描述符
  10. 不中断服务,实现平滑升级,升级失败进行回滚处理
  11. 编译和处理perl脚本

(3)工作进程( worker process )的功能:

  1. 所有 Worker 进程都是平等的
  2. 实际处理:网络请求,由 Worker 进程处理
  3. Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争CPU资源,
  4. 增加上下文切换的损耗
  5. 接受处理客户的请求
  6. 将请求依次送入各个功能模块进行处理
  7. I/O调用,获取响应数据
  8. 与后端服务器通信,接收后端服务器的处理结果
  9. 缓存数据,访问缓存索引,查询和调用缓存数据
  10. 发送请求结果,响应客户的请求
  11. 接收主程序指令,比如重启、升级和退出等

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?

  1. PHP-FPM(FastCGI Process Manager:
  2. FastCGI进程管理器)是一个实现了Fastcgi的程序,并且提供进程管理的功能。
  3. 进程包括master进程和worker进程。master进程只有一个,负责监听端口,接受来自web server 的请求
  4. 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的用法基本一致,至此,以上就是所有内容了

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值