nginx笔记

1. nginx 简介

nginx性能比apache强,体现 在io模型方面

76

Pv:

UV : 不同浏览器是不同的UV

GET 获取

POST 上传

HEAT 只看头

nginx笔记_第1张图片

访问网站的流程
1.dns解析

2.cdn

3.tcp

4.web服务器 处理

建立连接

接收请求

处理请求 GET POST等

获取资源

构建响应报文

发送响应报文

记录日志

5) 浏览器接收响应报文,进行页面渲染

http请求报文

http响应报文

nginx如何优化?

要优化 Nginx 的性能和效率,可以考虑以下几个方面的优化措施:

  1. 调整工作进程和连接数:

    • 调整 Nginx 的工作进程数,根据服务器的 CPU 核心数和负载情况进行合理的设置。
    • 调整 Nginx 的最大连接数限制,确保与实际需求相匹配。
  2. 合理配置缓存:

    • 针对静态资源(如图片、样式表、JavaScript 等),使用 Nginx 的内置缓存来加速访问。
    • 配置适当的缓存时间和缓存规则,以减少对后端服务器的请求。
  3. 优化 SSL/TLS:

    • 使用更高效的 SSL/TLS 版本,并配置适当的密码套件,以确保安全性和性能的折中。
    • 考虑使用缓存 SSL/TLS 会话以减少握手的开销。
  4. 开启 Gzip 压缩:

    • 配置 Nginx 开启 Gzip 压缩,减小传输的数据量,提高响应速度。
    • 可以根据不同的文件类型选择合适的压缩级别和压缩算法。
  5. 负载均衡和反向代理:

    • 使用 Nginx 的负载均衡功能,将请求分发到多个后端服务器,提高系统的吞吐量和可用性。
    • 使用 Nginx 的反向代理功能,将请求代理到不同的后端服务器,实现请求的路由和负载均衡。
  6. 配置文件优化:

    • 优化 Nginx 配置文件,确保配置项的正确性和一致性。
    • 避免不必要的模块加载,只加载需要的模块和功能。
    • 使用 include 文件来组织和管理配置项,提高可维护性。
  7. 监测和日志优化:

    • 启用 Nginx 的访问日志和错误日志,进行监测和故障排查。
    • 使用日志切割来管理日志文件的大小和数量,避免过大的日志文件影响性能。

需要注意的是,优化策略和步骤可能因环境和实际需求而有所不同。建议根据实际情况进行针对性的优化,并进行性能测试和监测,以评估优化效果和调整进一步优化的策略。

请求的流程

描述: 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 请求过程可以分为以下几个步骤:

  1. 用户在浏览器中输入 URL(统一资源定位符),并按下回车键。

  2. 浏览器解析 URL,提取出主机名(如:www.example.com)和资源路径(如:/index.html)。

  3. 浏览器首先会查询本地缓存,看是否有之前请求过的相同资源的副本。如果有且未过期,浏览器会直接从缓存中获取资源,跳过后续步骤。

  4. 如果缓存中没有相应的资源或资源已过期,浏览器会通过 DNS(域名系统)解析获取主机的 IP 地址。DNS 解析将域名转换为 IP 地址,以便浏览器能够与服务器建立连接。

  5. 浏览器使用获取到的 IP 地址与服务器建立 TCP(传输控制协议)连接。TCP 提供可靠的、面向连接的数据传输。

  6. 一旦建立 TCP 连接,浏览器会发送 HTTP(超文本传输协议)请求到服务器。请求中包含请求方法(如 GET、POST)、请求头(包含一些元数据)、请求路径等信息。

  7. 服务器接收到请求后,根据请求路径找到对应的资源,并进行处理。这可能涉及到业务逻辑的处理、数据库查询等。

  8. 服务器将处理完的资源以 HTTP 响应的形式返回给浏览器。响应中包含状态码(用于表示请求的成功或失败)、响应头(包含一些元数据)、响应体(包含实际的响应内容)等信息。

  9. 浏览器接收到响应后,会根据响应的内容类型进行相应的处理。比如,如果响应是 HTML 页面,浏览器会解析 HTML 并渲染页面;如果响应是图片,浏览器会显示该图片。

  10. 浏览器将解析完的资源进行展示,用户可以在浏览器中看到相应的内容。同时,浏览器还会将响应内容保存到缓存中,以便下次请求同样的资源时可以直接从缓存中获取,提高性能。

以上是一个常规的 Web 请求过程,不同的应用场景和技术可能会有所不同,但基本的流程是相似的。

HTTP(超文本传输协议)中的首部字段是用于在请求和响应消息中传递元数据和其他相关信息的一种机制。以下是HTTP中常见的首部字段:

  1. 通用首部字段:

    • Cache-Control:控制缓存行为。
    • Connection:控制连接的行为。
    • Date:日期和时间。
    • Upgrade:要求服务器升级到不同的协议。
    • Via:中间代理服务器的信息。
  2. 请求首部字段:

    • Accept:指定客户端可以接受的内容类型。
    • Accept-Encoding:指定客户端可以接受的内容编码方式。
    • Content-Type:请求中发送的实体的媒体类型。
    • User-Agent:客户端的用户代理标识。
  3. 响应首部字段:

    • Content-Length:返回的实体主体的长度(以字节为单位)。
    • Content-Encoding:指定响应实体使用的编码方式。
    • Content-Type:响应实体的媒体类型。
    • Server:服务器的软件名称和版本号。
    • Set-Cookie:设置一个或多个Cookie。
  4. 实体首部字段:

    • Content-Length:实体主体的长度(以字节为单位)。
    • Content-Encoding:实体主体的编码方式。
    • Content-Type:实体主体的媒体类型。

还有许多其他的首部字段,用于传递不同的信息。每个首部字段都有其特定的作用和语义,用于帮助客户端和服务器之间进行正确的通信和处理请求或响应。

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之所以具有良好的性能,主要有以下几个原因:

  1. 异步非阻塞模型:Nginx采用了事件驱动的异步非阻塞架构,通过使用少量的线程即可处理大量并发连接。这种设计方式使得Nginx在高并发场景下能够高效地处理请求,提高了系统的吞吐量。

  2. 轻量级:Nginx是一个轻量级的服务器软件,具有很小的内存占用和CPU消耗。它的代码精简,功能模块化,只包含了核心的功能,减少了不必要的资源开销,提高了性能。

  3. 出色的内存管理:Nginx使用了高效的内存管理机制,能够快速分配和释放内存,有效地降低了内存碎片化的问题,并提高了内存的利用率。

  4. 高度可定制性:Nginx提供了丰富的配置选项,可以根据具体需求进行灵活的配置和定制。用户可以根据自己的需求选择合适的模块和功能,避免了不必要的开销,提高了性能。

综上所述,Nginx通过其异步非阻塞的架构、轻量级设计、高效的内存管理和可定制性等特点,使得其具有优秀的性能表现。

nginx缓存功能?

主进程指派工作

2. 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没有线程

nginx 平滑升级

yum安装升级

模拟用户访问:

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
nginx笔记_第2张图片

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.项目结果

nginx配置文件

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,但会延迟

server_tokens off; 不显示版本
包含

nginx虚拟主机

vi /conf/nginx.conf

include /apps/nginx/conf/conf.d/*; #添加

nginx笔记_第3张图片

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;

}

配置文件在前的优先级高

server 块

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/

413 Request Entity Too Large

413 Request Entity Too Large


nginx/1.24.0

上传文件太大

修改参数
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

413 Request Entity Too Large


nginx/1.24.0

上传文件太大

client_max_body_size 1m; #设置允许客户端上传单个文件的最大值,默认值为1m,上传文件超过此值会出413错误

nginx高级配置

高价值展示生活

安全感建立

具备信息交换

兴趣爱好,工作,职业

生活状态

你可能感兴趣的:(nginx,笔记,运维)