教你学习企业高性能web服务器-nginx
一、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
lsnginx-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
<?phpphpinfo();
?>
测试
十、安装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的用法基本一致,至此,以上就是所有内容了
相关文章:
教你学习企业高性能web服务器-nginx
一、web服务介绍 1、Apache的三种模型 (1)Apache prefork 预派生模式,有一个主控制进程,然后生成多个子进程,使用select模型,最大并发1024每个子进程有一个独立的线程响应用户请求相对比较占用内存&…...
封装通用第三方平台用户表(微信开放平台)
文章目录 一. 注册微信开放平台1.1 开发者资质认证1.2 应用申请1.3 配置应用 二.通用数据库表设计三.入库实体类四. 对接第三方平台4.1 微信开放平台VO对象4.2 通用方法 我们的系统可能要对接很多第三方系统,为了便利用户授权使用和对多平台账户的管理。有必要设计通…...
【C++】_string类字符串详细解析(1)
假如没有给你生命,你连失败的机会都没有。你已经得到了最珍贵的,还需要抱怨什么!💓💓💓 目录 ✨说在前面 🍋知识点一:什么是string? •🌰1.string类的概念 •…...
【Linux】——进程概念(万字解读)
一 冯诺依曼体系结构 在此之前,我们先要理解我们计算机的冯诺依曼体系结构,因为是进程的基础 我们所有的操作其实都是基于这样一个模型,比如你在qq上,和别人发送消息,这个消息肯定是先通过输入设备进行输入…...
03 serv00搭建WordPress
第一步 下载 serv00 官方教程 按官方教程下载 WordPress 压缩包,解压,将 WordPress 项目文件夹重命名为 public_html(先删除原来的 public_html) 第二步 安装 完成以上步骤后访问你的网站,开始安装 WordPress …...
伪共享问题如何解决?
伪共享问题是多核处理器环境下常见的性能瓶颈之一,特别是在多线程编程中。想要解决它,就必须先了解缓存行的概念。 缓存行 缓存行是指在 CPU 缓存中最小的数据单位,通常包含一定数量的字节(例如,常见的缓存行大小为 …...
基于web框架的协同过滤的美食推荐系统【数据爬虫、管理系统、数据可更新、样式可调整】
文章目录 有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主项目介绍研究背景研究的目的与意义协同过滤算法基于用户的协同过滤算法定义基于物品的协同过滤算法的定义 数据库设计db_food(美食信息表)db_collect(美食…...
Eureka中的多实例配置:如何处理微服务实例动态扩展与缩减
Eureka中的多实例配置:如何处理微服务实例动态扩展与缩减 1. 引言 在微服务架构中,服务的动态扩展与缩减是确保系统弹性和高可用性的关键因素。Eureka,作为一个服务注册和发现的组件,扮演着至关重要的角色。它由Netflix开源&…...
Ubuntu 22.04使用 IPTables 配置防火墙
网络安全管理是服务器安全的重要组成部分。在这将介绍在 Ubuntu 22.04 中使用名为 iptables 的软件包管理工具设置防火墙的过程。 IPTables简介 IPTables是一个功能强大的软件包管理工具,可用于大多数Linux发行版,包括Ubuntu 22.04。该工具允许管理员定…...
Java语言程序设计——篇十三(1)
🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳&…...
GB/T 5023.3-2008额定电压450/750V及以下聚氯乙烯绝缘电缆
聚氯乙烯绝缘电缆产品分为固定布线用无护套电缆、固定布线用护套电缆、轻型无护套软电缆、一般用途护套软电缆、安装用电线和屏蔽电线、特殊用途护套软电缆、聚氯乙烯绝缘阻燃/耐火电缆等产品。 GB/T 5023.3-2008额定电压450/750V及以下聚氯乙烯绝缘电缆 第3部分:固…...
深入单例模式
1. 饿汉模式 饿坏了,上来就先实例化一个对象,好处是代码简单,坏处是这个对象后面如果一直用不到,就是个浪费。 public class A{ private static A a new A(); private A(){} public static A getInstance(){ return a; } } 2. 懒…...
MongoDB 单机和集群环境部署教程
目录 一、MongoDB 单机环境部署1. 环境准备2. 安装 MongoDB2.1 在 Ubuntu 上安装 MongoDB2.2 在 CentOS 上安装 MongoDB2.3 启动 MongoDB 服务2.4 验证 MongoDB 安装2.5 MongoDB 基本安全设置 3. 单机部署注意事项 二、MongoDB 集群环境部署1. 环境准备2. MongoDB Replica Set …...
【学习笔记】Day 20
一、进度概述 1、机器学习常识12-18,以及相关代码复现 二、详情 12、SVM(support vector machines,支持向量机) 实际上,支持向量机是一种二分类模型,它将实例的特征向量映射为空间中的一些点,…...
StringBuffer与StringBuilder 2024-8-21 22-13
目录 一、StringBuffer二、StringBuilder三、总结 一、StringBuffer StringBuffer是一个可变的字符序列,它的存在是为了解决频繁操作字符串时产生大量临时对象的问题。 构造方法: StringBuffer():创建一个空的字符串缓冲区,初始容…...
会声会影剪辑视频收费吗,会声会影最新破解版
会声会影2024:引领视频创作新时代的创新之旅** 在数字时代的浪潮中,视频创作已成为连接世界、表达创意的重要方式。随着技术的不断进步,一款名为“会声会影2024”的视频编辑软件横空出世,它不仅继承了前代产品的优秀传统…...
在Windows11强制开启copilot
在 Windows 11 上启用自带的基于 GPT-4 的 Copilot 功能。以下是具体步骤: 更新系统: 确保你的 Windows 11 系统已经更新到最新版本(23H2 或更高版本)。你可以在“设置” > “Windows 更新”中检查并安装最新更新。 更改区域和…...
基于Java的开源CMS有哪些推荐,各自特点是什么
最强大、最易用的CMS,向大家做一个简要介绍。 01 Alfresco Alfresco是一个开源的企业网站内容管理系统,它提供了文档管理、多人协作、记录管理、知识管理网页内容和图像管理等功能。它使用Spring、 Hibernate、 Lucene 和JSF等最新java技术构建了模…...
IPC进程通信以及网络通信
一、IPC 进程间通信方式 共享内存 //最高效的进程间通信方式 不需要把用户的东西再复制到内核 他们与内核进行绑定 共享内存: 1、是一块,内核预留的空间 2、最高效的通信方式 //避免了用户空间到内核空间的数据拷贝 IPC通信方式 ---操作流程类似的…...
【脏数据 bug 解决】ValueError: mean must have 1 elements if it is an iterable, got 3
问题描述: 在训练模型的过程中,出现 clip_image_processor 无法处理数据的问题,说明数据集中很可能出现了脏数据。本文使用的数据为 LAION-Aesthetics-V2-6.5plus,从 https://dagshub.com/DagsHub-Datasets/LAION-Aesthetics-V2-…...
【Vue3】集成 Ant Design Vue
【Vue3】集成 Ant Design Vue 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗…...
如何处理前端项目中的SEO优化:从SPA到SSR与SSG
如何处理前端项目中的SEO优化:从SPA到SSR与SSG 在前端开发的日常工作中,你可能经常会遇到这样的情况:辛辛苦苦写了一个功能丰富、界面炫酷的单页应用(SPA),但上线后发现搜索引擎的表现却不尽如人意。页面内…...
【UE5】Groom毛发系统的基本使用——给小白人添加头发
目录 效果 步骤 一、准备 二、使用3DsMax制作毛发 三、在UE中给小白人安装毛发 四、修改毛发材质 效果 步骤 一、准备 1. 新建一个第三人称模板工程 2. 在项目设置中,勾选“支持计算蒙皮缓存” 3. 在插件面板中,启用“Groom”和“Alembic Gro…...
DataWorks函数
文章目录 0、MaxCompute预置的函数分类1、日期函数2、数学函数3、算术运算符4、窗口函数5、聚合函数6、字符串函数7、复杂类型函数8、加密函数9、其他函数 0、MaxCompute预置的函数分类 函数类型说明日期函数支持处理DATE、DATETIME、TIMESTAMP等日期类型数据,实现…...
设计模式学习优质网站分享:refactoring.guru
地址 英文版地址:https://refactoring.guru/design-patterns 中文版地址:https://refactoringguru.cn/design-patterns 介绍 这个网站是专门学习 设计模式 和 软件重构 的网站 整体来说并不花哨,但我觉得他最大的优点就是: 概…...
JVM-Java的四种引用
引用分析 无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象是否可达,判定对象是否可被回收都与引用有关,Java 提供了四种强度不同的引用类型 强引用: 被强引用关联的对象不会被回收,只有所…...
探索《黑神话:悟空》品质保障的背后:ISO体系认证
《黑神话:悟空》横空出世 8月20日上午10点,国产首款大型3A游戏《黑神话:悟空》正式上线。游戏一经上线便吸引了无数国内外用户的关注,不仅仅是因为其高超的游戏制作技术,极高的画面精度,精良的的视觉和战斗…...
ArcGIS Pro 实现人口分布栅格TIFF数据的网格提取与可视化
这里在分享一个人口1km精度栅格数据,LandScan是由美国能源部橡树岭国家实验室(ORNL)提供的全球人口分布数据集,具有最高分辨率的全球人口分布数据,是全球人口数据发布的社会标准,是全球最为准确、可靠&…...
select的缺点;poll ;poll的缺点;epoll
1.select的缺点: 1.select监听的文件描述符集合是一个数组,有上限(1024个) 2.select监听的文件描述符集合在应用层,内核层监听事件后需要传递给用户层带来资源开销 3.select需要用户手动查找产生事件的文件…...
keli5_报错 Cannot Load Device Description问题
1原因 之前创建的keli5的项目软件版本与当前的软件版本不同 使其算法要重新选择 2解决方法 2-1 点击图中的魔术棒 2-2 在这个界面中进入 Settings选项(ST-Link Debugger 旁边) 2-3 点击Flash Download 选项进入图中界面 在点击天加 2-4选择fla…...
辽阳做网站公司/淘宝指数查询
https://www.aswifter.com/2015/06/14/gitlab-with-docker/ (seperate redis, mysql, backup and restore) Docker 官方镜像列表 https://hub.docker.com/explore/部署 GitLab 获取 GitLab 镜像 docker pull gitlab/gitlab-ce:8.0.5-ce.0 查看本地镜像 # docker images REPOS…...
苏州建网站必去苏州聚尚网络/泉州网站建设优化
2019独角兽企业重金招聘Python工程师标准>>> myisam:如果对事务要求不高,同时是以查询和添加为主,可以考虑使用此种存储引擎。不如bbs中的发帖表,回复表等 批量插入速度高,支持全文索引,表锁 in…...
网站建设 济南/热搜榜上能否吃自热火锅
政府与管理 区块链技术在政府及管理领域有着广泛的应用前景,大致可以分为三类:1.国家、州、省、县、城市、自治区等现有辖区。2.国家与组织的虚拟化管理。3.公司的董事会管理。将区块链技术应用于服务,是对现有“砖块水泥”式实体政府推行的电…...
企业网站组网方案/成都网站seo
and then interview#$%^&* again转载于:https://www.cnblogs.com/rexhost/archive/2005/07/08/188977.html...
网站空间试用/网站建设哪家公司好
Oracle 提供了强大的审计功能,可以针对用户级,系统级范围,以及标准审计,细粒度审计等多种方式来审计各种数据库层面上的操作。然很多中小型数据库需要记录用户的登陆登出信息,而又不希望牺牲太多的性能。基于这种情形&…...
wordpress 带数据/今日国际新闻头条15条
PHP递归实现无限分类数组处理1,php递归算法实现无限分类递归算法对无限分类的数组进行处理,分两种情况,一种树状展示(数组包含子数组),一种非树状展示(子类按照顺序排在父类的下面,不出现数组包含)注意:在查询数据的时候,也可以把…...