nginx性能比apache强,体现 在io模型方面
76
Pv:
UV : 不同浏览器是不同的UV
GET 获取
POST 上传
HEAT 只看头
访问网站的流程
1.dns解析
2.cdn
3.tcp
4.web服务器 处理
建立连接
接收请求
处理请求 GET POST等
获取资源
构建响应报文
发送响应报文
记录日志
5) 浏览器接收响应报文,进行页面渲染
nginx如何优化?
要优化 Nginx 的性能和效率,可以考虑以下几个方面的优化措施:
调整工作进程和连接数:
合理配置缓存:
优化 SSL/TLS:
开启 Gzip 压缩:
负载均衡和反向代理:
配置文件优化:
监测和日志优化:
需要注意的是,优化策略和步骤可能因环境和实际需求而有所不同。建议根据实际情况进行针对性的优化,并进行性能测试和监测,以评估优化效果和调整进一步优化的策略。
请求的流程
描述: 1.客户发起情况到服务器网卡;
2.服务器网卡接受到请求后转交给内核处理;
3.内核根据请求对应的套接字,将请求交给工作在用户空间的Web服务器进程
4.Web服务器进程根据用户请求,向内核进行系统调用,申请获取相应资源(如index.html)
5.内核发现web服务器进程请求的是一个存放在硬盘上的资源,因此通过驱动程序连接磁盘
6.内核调度磁盘,获取需要的资源
7.内核将资源存放在自己的缓冲区中,并通知Web服务器进程
8.Web服务器进程通过系统调用取得资源,并将其复制到进程自己的缓冲区中
9.Web服务器进程形成响应,通过系统调用再次发给内核以响应用户请求
10.内核将响应发送至网卡
11.网卡发送响应给用户
这就是整个web请求的全过程。这个过程涉及到2个IO,一个就是客户端请求的网络I/O,另一个就是Web服务器请求资源的磁盘I/O
服务器发送请求>到达服务器网卡 缓冲区》
一个常见的 Web 请求过程可以分为以下几个步骤:
用户在浏览器中输入 URL(统一资源定位符),并按下回车键。
浏览器解析 URL,提取出主机名(如:www.example.com)和资源路径(如:/index.html)。
浏览器首先会查询本地缓存,看是否有之前请求过的相同资源的副本。如果有且未过期,浏览器会直接从缓存中获取资源,跳过后续步骤。
如果缓存中没有相应的资源或资源已过期,浏览器会通过 DNS(域名系统)解析获取主机的 IP 地址。DNS 解析将域名转换为 IP 地址,以便浏览器能够与服务器建立连接。
浏览器使用获取到的 IP 地址与服务器建立 TCP(传输控制协议)连接。TCP 提供可靠的、面向连接的数据传输。
一旦建立 TCP 连接,浏览器会发送 HTTP(超文本传输协议)请求到服务器。请求中包含请求方法(如 GET、POST)、请求头(包含一些元数据)、请求路径等信息。
服务器接收到请求后,根据请求路径找到对应的资源,并进行处理。这可能涉及到业务逻辑的处理、数据库查询等。
服务器将处理完的资源以 HTTP 响应的形式返回给浏览器。响应中包含状态码(用于表示请求的成功或失败)、响应头(包含一些元数据)、响应体(包含实际的响应内容)等信息。
浏览器接收到响应后,会根据响应的内容类型进行相应的处理。比如,如果响应是 HTML 页面,浏览器会解析 HTML 并渲染页面;如果响应是图片,浏览器会显示该图片。
浏览器将解析完的资源进行展示,用户可以在浏览器中看到相应的内容。同时,浏览器还会将响应内容保存到缓存中,以便下次请求同样的资源时可以直接从缓存中获取,提高性能。
以上是一个常规的 Web 请求过程,不同的应用场景和技术可能会有所不同,但基本的流程是相似的。
HTTP(超文本传输协议)中的首部字段是用于在请求和响应消息中传递元数据和其他相关信息的一种机制。以下是HTTP中常见的首部字段:
通用首部字段:
请求首部字段:
响应首部字段:
实体首部字段:
还有许多其他的首部字段,用于传递不同的信息。每个首部字段都有其特定的作用和语义,用于帮助客户端和服务器之间进行正确的通信和处理请求或响应。
curl -v www.baidu.com
< HTTP/1.1 302 Moved Temporarily #302 临时重定向
< Server: openresty
< Date: Fri, 08 Sep 2023 14:10:10 GMT #表示服务器生成响应的日期和时间,以协调世界时(UTC)表示。
< Content-Type: text/html #响应主体的媒体类型,这里的值是 “text/html”,表示返回的内容是 HTML 文档
< Content-Length: 142 #表示响应主体的长度,以字节为单位,这里的值是 142。
< Connection: keep-alive #指示服务器是否要求客户端保持持久连接,在此示例中,服务器要求客户端维持持久连接。
< Location: https://www.oppo.com/
< Request-Id: 64fb2b421cfe0cfcf891adbc83ce4faa #用于标识请求的唯一编号或标识符
< X-IP-Source: 4cb2b356b598ca96d5297afa558bd372 #指示客户端的 IP 地址或来源
< Access-Control-Allow-Origin: * #用于指示服务器所允许的跨域请求的来源。在这个示例中,服务器允许所有来源的跨域请求。
< strict-transport-security: max-age=31536000 #用于指示服务器所允许的跨域请求的来源。在这个示例中,服务器允许所有来源的跨域请求。
网络IO
同步:你去问
异步:主动通知你
阻塞:影响干别的事
异步: 不影响
I/O 多路复用
windows不支持epoll
nginx为什么性能好?
epoll模型,MMAP
支持0复制
Nginx之所以具有良好的性能,主要有以下几个原因:
异步非阻塞模型:Nginx采用了事件驱动的异步非阻塞架构,通过使用少量的线程即可处理大量并发连接。这种设计方式使得Nginx在高并发场景下能够高效地处理请求,提高了系统的吞吐量。
轻量级:Nginx是一个轻量级的服务器软件,具有很小的内存占用和CPU消耗。它的代码精简,功能模块化,只包含了核心的功能,减少了不必要的资源开销,提高了性能。
出色的内存管理:Nginx使用了高效的内存管理机制,能够快速分配和释放内存,有效地降低了内存碎片化的问题,并提高了内存的利用率。
高度可定制性:Nginx提供了丰富的配置选项,可以根据具体需求进行灵活的配置和定制。用户可以根据自己的需求选择合适的模块和功能,避免了不必要的开销,提高了性能。
综上所述,Nginx通过其异步非阻塞的架构、轻量级设计、高效的内存管理和可定制性等特点,使得其具有优秀的性能表现。
nginx缓存功能?
主进程指派工作
#yum -y install gcc pcre-devel openssl-devel zlib-devel make
wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar -xf nginx-1.24.0.tar.gz
cd nginx-1.24.0/
useradd -s /sbin/nologin nginx
cd /apps/nginx-1.24.0
./configure --help
./configure --prefix=/apps/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
make && make install
chown -R nginx.nginx /apps/nginx
nginx没有线程
模拟用户访问:
dd if=/dev/zero of=1.img bs=1M count=100
wget --limit-rate=100 http://192.168.1.150/1.img
nginx1.18 ->nginx 1.24
1.nginx -V 查看参数
root@ubuntu20:/apps/nginx-1.24.0# nginx -V
nginx version: nginx/1.18.0 (Ubuntu)
built with OpenSSL 1.1.1f 31 Mar 2020
TLS SNI support enabled
configure arguments: --with-cc-opt=‘-g -O2 -fdebug-prefix-map=/build/nginx-lUTckl/nginx-1.18.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2’ --with-ld-opt=‘-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC’ --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-compat --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module
2.下载包解压,
./configure 带上nginx -V 查询到的参数
uubuntu20.04./configure: error: the HTTP XSLT module requires the libxml2/libxslt libraries. You can either do not enable the module or install the libraries.
安装sudo apt update && sudo apt install libxml2-dev libxslt-dev
nginx ./configure: error: the HTTP image filter module requires the GD library. You can either do not enable the module or install the libraries.
安装 sudo apt update sudo apt install libgd-dev
3.编译:
make
生成的二进制文件在objs目录
root@ubuntu20:/apps/nginx-1.24.0/objs# ll nginx
-rwxr-xr-x 1 root root 8083408 Sep 9 12:33 nginx*
4.备份的二进制文件
root@ubuntu20:/apps/nginx-1.24.0/objs# which nginx
/usr/sbin/nginx
cp /usr/sbin/nginx{,.bak}
untu20:/usr/sbin# cd
root@ubuntu20:~# \cp /apps/nginx-1.24.0/objs/nginx /usr/sbin/nginx
cp: cannot create regular file ‘/usr/sbin/nginx’: Text file busy
强制替换root@ubuntu20:~# \cp -f /apps/nginx-1.24.0/objs/nginx /usr/sbin/nginx
5.测试升级的nginx是否兼容,出现ok才能升级,我这里是测试
root@ubuntu20:~# /usr/sbin/nginx -t
nginx: [emerg] module “/usr/share/nginx/modules/ngx_http_image_filter_module.so” version 1018000 instead of 1024000 in /etc/nginx/modules-enabled/50-mod-http-image-filter.conf:1
nginx: configuration file /etc/nginx/nginx.conf test failed
这个原因是因为以前nginx modules 和现在官方的modules 不匹配需要我们先将旧的modules 卸载安装新版官方的modules
安装官方源
sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
导入密钥
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
配置稳定版本的源
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
优先选择nginx官方的包。而不是系统源的包
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
| sudo tee /etc/apt/preferences.d/99nginx
更新
sudo apt update
查看源中所有nginx的模块,可用看到之前是libnginx-mod .1.24版本是nginx-mod
apt remove lib-nginx-mod* #卸载旧的nginx模块
apt install nginx-mod* #安装1.24版本的nginx模块
/usr/sbin/nginx -t 测试ok
root@ubuntu20:~# //usr/sbin/nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
升级后访问zabbix 网站 502 Bad Gateway
可能是nginx 版本和zabbix不匹配的原因
升级要经过充分的测试
nginx版本与业务是否匹配
编译:注意不要make install
备份nginx
拷贝新的nginx文件
cp -f /apps/nginx-1.25.2/objs/nginx /apps/nginx/sbin/
测试
[root@rocky8 logs]# /apps/nginx/sbin/nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
nginx -t 测试通过后,发送usr2信号
kill -USR2 cat /apps/nginx/logs/nginx.pid
#会生成新进程,旧版本主进程PID的文件重命名为nginx.pid.oldbin,并启动新的nginx
[root@rocky8 logs]# cat /apps/nginx/logs/nginx.pid.oldbin
25094
[root@rocky8 logs]# cat /apps/nginx/logs/nginx.pid
25329
向旧的进程发送which信号, 它会逐步关闭旗下的工作进程(主进程不退出),这时所有请求都会由新版Nginx处理
kill -WINCH cat /apps/nginx/logs/nginx.pid.oldbin
退出老的进程
kill -QUIT cat /apps/nginx/logs/nginx.pid.oldbin
项目标题: nginx平滑升级
1.项目背景(版本过旧,添加新模块)
2.项目目标
3.项目实现过程(原理、步骤)
4.项目结果
worker_processes auto; 自动匹配cpu核数
root@server01:/etc/nginx# ps axo pid,cmd,psr |grep nginx
worker_cpu_affinity 0001 0010; 绑定cpu #防止缓存失效#将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx进程独占以一核心CPU,但是可以保证此进程不会运行在其他核心上,这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。
nginx 的master 进程是root运行,work进程是普通用户运行, 因为nginx端口80是特权端口小于1023,只能用root运行
worker_connections 2048; #所有worker进程能打开的文件数量上限,包括:Nginx的所有连接(例
如与代理服务器的连接等),而不仅仅是与客户端的连接,另一个考虑因素是实际的并发连接数不能超过系统级
别的最大打开文件数的限制.最好与ulimit -n 或者limits.conf的值保持一致,
这是一些常见的 Nginx 配置指令,用于设置代理请求的头部信息。
proxy_set_header Host $http_host;
设置代理请求的 Host 头部为客户端的请求 Host 头部值。proxy_set_header X-Real-IP $remote_addr;
设置代理请求的 X-Real-IP 头部为客户端的真实 IP 地址。proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
设置代理请求的 X-Forwarded-For 头部,将客户端的 IP 地址追加到该头部中,以表明客户端的真实 IP 地址。proxy_set_header X-Forwarded-Proto $scheme;
设置代理请求的 X-Forwarded-Proto 头部为请求的协议(HTTP 或 HTTPS)。这些配置指令通常用于反向代理服务器的配置,用于将客户端请求转发给后端服务器,并在请求头部中传递一些关键的信息。
好奇,开心
sendfile on; 提示性能
#tcp_nopush on; #在开启了sendfile的情况下,合并请求后统一发送给客户端,必须开启sendfile,但会延迟
vi /conf/nginx.conf
include /apps/nginx/conf/conf.d/*; #添加
root@server01:/apps/nginx/conf/conf.d# cat www.luohw.org
server {
listen 8889;
server_name www.luohw.org;
root /apps/nginx/html/pc;
}
root@server01:/apps/nginx/conf/conf.d# cat m.luohw.org
server {
listen 8889;
server_name m.luohw.org;
root /apps/nginx/html/mobile;
}
配置文件在前的优先级高
alias和root的区别?
root是定义根的
location /about { #相当于访问/opt/pc/aaa/
alias /opt/pc/aaa/;
}
location /about { #/opt/pc/aaa/about/
root /opt/pc/aaa/;
}
server {
listen 8889;
server_name www.luohw.org;
location / {
root /apps/nginx/html/pc;
}
location /about {
root /opt/pc/aaa/;
}
curl www.luohw.org:8889/about222/ 访问 /opt/pc/aaa/about222/index.html
location /about/ {
root /opt/pc/aaa/;
}
curl www.luohw.org:8889/about222/ 访问/apps/nginx/html/pc/about222/index.html
location ^~ /about/ { 以什么开头
^~ 包含
^*
~* 包含,不区分大小写
#匹配优先级从高到低:
=, ^~, /*, 不带符号
htpasswd -cb /etc/nginx/conf.d/.nginx-user luo 123456
auth_basic "login password";
auth_basic_user_file /etc/nginx/conf.d/.nginx-user;
指定密码访问
curl -I -u luo:123456 zabbix.luo.com
自定义错误页面
#访问不存在会报404,就会访问 /data/html/40x.html
error_page 404 /40x.html;
location = /40x.html {
root /data/html/ ;
}
检测文件是否存在
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/index.html $uri/html /index.html; #访问url找不到就找$uri/index.html,最后找index.html
}
GET / HTTP/1.1
HOST: 192.168.1.150
下载文件配置
location /down {
autoindex on;#自动索引功能
alias /apps/nginx/html/mobile/luo;
# autoindex_exact_size off;#计算文件确切大小(单位bytes),此为默认值,off只显示大概大小(单位kb、mb、gb)
autoindex_localtime on;
#上传一个包到nginx,太大会报413
root@server01:/apps/nginx/conf/conf.d# curl -T /root/mysql-8.0.33-linux-glibc2.28-x86_64.tar.gz http://120.77.146.92:8889/down/
上传文件太大
修改参数
client_max_body_size 1m; #设置允许客户端上传单个文件的最大值,默认值为1m,上传文件超过此值会出413错误
高价值展示生活
安全感建立
具备信息交换
兴趣爱好,工作,职业
生活状态
T / HTTP/1.1
HOST: 192.168.1.150
location /down {
autoindex on;#自动索引功能
alias /apps/nginx/html/mobile/luo;
# autoindex_exact_size off;#计算文件确切大小(单位bytes),此为默认值,off只显示大概大小(单位kb、mb、gb)
autoindex_localtime on;
root@server01:/apps/nginx/conf/conf.d# curl -T /root/mysql-8.0.33-linux-glibc2.28-x86_64.tar.gz http://120.77.146.92:8889/down/
413 Request Entity Too Large上传文件太大
client_max_body_size 1m; #设置允许客户端上传单个文件的最大值,默认值为1m,上传文件超过此值会出413错误
高价值展示生活
安全感建立
具备信息交换
兴趣爱好,工作,职业
生活状态