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

news2024/11/28 6:51:32

一、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的用法基本一致,至此,以上就是所有内容了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2060383.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

笔记(day24)正则表达式

一、正则表达式 1.1 概述 正则表达式定义了字符串的匹配模式,可以用来进行搜索,编辑,或处理文本 并不仅限于某一种语言,但是在每种语言中有细微的差别 1 数据校验、格式校验 2 数据提取 1.2 语法 元字符描述\将下一个字符标记符、或一个向后引用、或一个八进制转义符。例如&a…

专题---自底向上的计算机网络(数据链路层)

目录 计算机网络概述 物理层 数据链路层 网络层 传输层 应用层 网络安全

pinctl 和 gpio子系统驱动

一.设备树中添加pinctl节点模板 1.创建对应的节点 同一个外设的 PIN 都放到一个节点里面&#xff0c;打开 imx6ull-14x14-evk.dts&#xff0c;在 iomuxc 节点 中的“imx6ul-evk”子节点下添加 “pinctrl_test” 节点。添加完成以后如下所示&#xff1a; pinctrl_test:test_g…

8.21Qt作业

运用网络通信&#xff0c;实现简单聊天室 客户端主要代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), socket(new QTcpSocket(this)) {ui->setupUi(this);//初始化界面ui-&g…

Postman之Newman命令以及常用参数

Newman介绍 Postman是专为接口测试而生&#xff0c;而Newman是专为Postman而生。因为服务器一般都是Linux系统&#xff0c;而前文提到的操作都离不开Postman的客户端&#xff0c;为解决这个问题&#xff0c;谷歌公司引入了 Newman工具。Newman是Postman的命令行&#xff0c;是…

STM32——I2C通信外设

软件只需要CR控制寄存器&#xff0c;DR数据寄存器&#xff0c;为实时监控状态&#xff0c;软件需要读取SR状态寄存器&#xff0c;好比&#xff1a;开车时CR是控制汽车方向&#xff0c;踩油门等&#xff0c;SR是仪表盘。 由于I2C是半双工&#xff0c;因此发送和接收数据都是在移…

又一家光伏企业终止,行业产能过剩竞争激烈,毛利率极低

一道新能终止原因如下&#xff1a;首先&#xff0c;一道新能从事光伏单晶电池和单晶组件业务&#xff0c;该行业竞争激烈&#xff0c;目前已经出现了产能过剩&#xff0c;甚至负毛利率的情况&#xff1b;其次&#xff0c;报告期内&#xff0c;一道新能营收高达227亿&#xff0c…

DC-DC 转换器中的压电谐振器:当前状态和限制

在小体积和高频下提高功率密度并减小电感器和变压器的尺寸是DC-DC转换器设计中的一大挑战。为了克服这些困难&#xff0c;压电谐振器&#xff08;PR&#xff09;通过利用潜在的压电效应&#xff0c;以振动模式而不是电模式存储能量。 即使 PR 的使用在效率和功率密度方面改进了…

关于开源许可协议

开源许可协议 引用开源代码之后是否可以保留知识产权&#xff0c;针对不同的开源协议要进行开源扫描。基于BSD、MIT和Apache三种是可以闭源。但是基于GPL、LGPL和Mozilla的开源方案必须同步开源。

2024年接口测试高频面试题及答案

1. 什么是接口测试&#xff1f; •接口测试就是通过测试不同情况下的入参与之相应的出参信息来判断接口是否符合或满足相应的功能性、安全性要求 •测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系 2. 为什么要做接口…

【大模型从入门到精通32】开源库框架LangChain RAG 系统中的问答技术2

这里写目录标题 探索高级问答链类型MapReduce 和 Refine 技术 实用建议和最佳实践解决 RetrievalQA 限制结论进一步阅读和探索理论问题实践问题 探索高级问答链类型 MapReduce 和 Refine 技术 MapReduce 和 Refine 是设计用来规避由语言模型 (LM) 上下文窗口大小所导致的限制…

Pulsar官方文档学习笔记——消息机制

pulsar 基于3.x最新官方文档学习记录 概念与架构 典型的推送订阅模式。生产者发送消息&#xff0c;消费者订阅topic消费信息并回应ACK。订阅创建后&#xff0c;Pulsar会保留所有消息。仅消息被所有订阅 成功消费了才会丢弃&#xff08;可以配置消息保留机制保留一定量&#…

裸金属服务器和裸金属云服务器:区别、优势与选择

首先&#xff0c;必须肯定的是&#xff1a;裸金属服务器和裸金属云服务器是有区别的。 ‌ 二者的概述 裸金属服务器&#xff08;‌Bare Metal Server&#xff09;‌是一种物理服务器&#xff0c;‌它直接在硬件上运行&#xff0c;‌没有额外的虚拟化层。‌这意味着每个应用程…

封装通用第三方平台用户表(微信开放平台)

文章目录 一. 注册微信开放平台1.1 开发者资质认证1.2 应用申请1.3 配置应用 二.通用数据库表设计三.入库实体类四. 对接第三方平台4.1 微信开放平台VO对象4.2 通用方法 我们的系统可能要对接很多第三方系统&#xff0c;为了便利用户授权使用和对多平台账户的管理。有必要设计通…

2024 江苏省第二届数据安全技术应用职业技能竞赛 初赛 部分wp

文章目录 一、前言二、参考文章三、题目&#xff08;解析&#xff09;数据安全解题赛1、ds_0602&#xff08;30分&#xff09;2、333.file&#xff08;45分&#xff09;3、pf文件分析&#xff08;35分&#xff09;4、丢失的资料&#xff08;45分&#xff09;5、greatphp&#x…

基于SpringBoot的来访管理系统的设计与实现-

TOC springboot600基于SpringBoot的来访管理系统的设计与实现---论文 绪 论 1.1项目研究的背景 随着科学技术发展&#xff0c;计算机已成为人们生活中必不可少的生活办公工具&#xff0c;在这样的背景下&#xff0c;网络技术被应用到各个方面&#xff0c;为了提高办公生活效…

Android类加载机制简介

一、前言 随着 Android 技术的不断发展&#xff0c;对其内部机制的探索也日益深入。类加载机制作为 Android 运行时环境的核心组成部分之一&#xff0c;影响着应用的性能、安全性以及可扩展性。通过对 Android 类加载机制的研究&#xff0c;开发者可以更好地优化代码结构、提高…

requests请求库入门使用

requests 库是一个功能强大且易于使用的 HTTP 请求库&#xff0c;适用于各种网络请求任务。它简化了 HTTP 请求的发送过程&#xff0c;并提供了丰富的功能来处理各种网络请求和响应。 1.安装 首先&#xff0c;你需要安装 requests 库。如果你还没有安装&#xff0c;可以使用 …

网优学习干货:2.6G仿真操作(1)

2.6G工程建立——整体仿真过程 针对覆盖仿真、速率仿真及蒙特卡洛仿真的说明 覆盖仿真&#xff1a;覆盖仿真主要用于评估网络覆盖性能。基于MassiveMIMO天线、射线传模或经验传模进行覆盖预测&#xff0c;计算链路损耗后&#xff0c;基于栅格分析估算小区覆盖预测的各项指标&am…

前端不同项目使用不同的node版本(Volta管理切换)

前端不同项目使用不同的node版本(Volta管理切换) 使用volta自动切换前端项目的node版本&#xff0c; 每个不同的前端项目&#xff0c;可以使用不同的node版本。Volta这个工具&#xff0c;它允许用户方便地安装、切换和管理不同版本的Node.js&#xff0c;避免了为每个项目手动配…