💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
- 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
- 导航
- 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
- 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
- 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
- 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
- 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
Nginx(发音为"engine x")是一款高性能、轻量级的开源 Web 服务器和反向代理服务器,它具有以下特点和功能:
Nginx 通常被用于构建高性能的 Web 服务器环境,特别适合处理大流量的网站和应用。它在互联网上广泛使用,并已成为许多大型网站和应用的关键组件之一。
以下是 Nginx 的一些主要功能:
Web 服务器: Nginx 可以作为一个快速、高性能的 Web 服务器,可以直接处理和提供静态和动态内容。
反向代理: Nginx 可以作为反向代理服务器,接收客户端请求并将其转发到后端服务器,用于负载均衡、缓存、SSL 终端等。
负载均衡: Nginx 可以将来自客户端的请求分发到多个后端服务器,实现负载均衡,提高应用的可扩展性和性能。
HTTP 缓存: Nginx 可以缓存静态和动态内容,减轻后端服务器的负载,提高响应速度。
SSL 终端: Nginx 可以处理 SSL/TLS 连接,用于终止和处理加密通信,减轻后端服务器的计算负担。
反向代理缓存: Nginx 可以作为反向代理缓存,将动态内容缓存到本地,减少对后端服务器的请求,提高响应速度。
动态内容处理: Nginx 可以处理 FastCGI、uWSGI、SCGI 等协议,用于处理动态内容如 PHP、Python、Ruby 等。
限流和速率控制: Nginx 可以实施请求速率控制和限流,以防止服务器过载。
安全性: Nginx 提供安全功能如防止恶意请求、DDoS 攻击防护等。
虚拟主机: Nginx 支持虚拟主机配置,可以在一个服务器上托管多个域名。
自定义模块: Nginx 支持自定义模块开发,可以根据需求添加自定义的功能和扩展。
事件驱动: Nginx 使用事件驱动的异步架构,可以处理大量并发连接,提供出色的性能。
日志记录: Nginx 可以记录详细的访问日志,方便监控和分析。
Nginx 是一个功能强大的服务器软件,适用于多种应用场景,如 Web 服务器、反向代理、负载均衡、缓存、安全保护等。它在大型互联网公司和企业中被广泛使用,提供了高性能和稳定性。
#查看nginx在哪 whereis nginx #yum 安装ningx #nginx添加yum repro库中 #下载nginx包 wget https://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm # 建立nginx的yum仓库 rpm -ivh nginx-release-centos-7-0.el7.ngx.noarch.rpm #查看nginx的信息 yum info nginx #查看yum源仓库中nginx版本 yum --showduplicates list nginx | expand #安装nginx,默认安装最新的稳定版本 及 nginx 1.20.2 yum install nginx #查看版本 nginx -V #查看日志 tail -f /var/log/nginx/error.log #配置文件地址 /etc/nginx/nginx.conf
#查看nginx位置 whereis nginx #nginx可用 systemctl enable nginx #启动nginx systemctl start nginx #查看进程号 netstat -nltp #查看状态 systemctl status nginx
#停止 nginx systemctl stop nginx
#重启 nginx systemctl restart nginx
#重新加载配置 systemctl reload nginx
#设置开机启动 systemctl enable nginx
#关闭开机启动设置 systemctl disable nginx
#检查配置是否正确(常用) nginx -t
./nginx -V
#进入nginx可执行目录sbin下,输入命令,不用重启 ./nginx -s reload
#启动nginx,并挂在配置文件目录到宿主机 docker run -d --name deepexi-belle-damo-nginx --privileged=true --dns 114.114.114.114 -p 80:80 \ -v /etc/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf \ --restart=always deploy.deepexi.com/datasense-test/deepexi-belle-damo-nginx:v1.0.0
Nginx 的主配置文件是 nginx.conf,这个配置文件一共由三部分组成,分别为全局块、events 块和 http 块。在 http 块中,又包含 http 全局块、多个 server 块。每个 server 块中,可以包含 server 全局块和多个 location 块。在同一配置块中嵌套的配置块,各个之间不存在次序关系。
#从 / 根目录下查找文件名为 nginx.conf 的文件 find / -name nginx.conf #从/etc 目录下查找文件名为 nginx.conf 的文件 find /etc -name nginx.conf #检查配置文件 nginx -t #目录 /etc/nginx
/usr/sbin/nginx
/usr/share/nginx/html
server { listen 80; server_name qinyingjie.top; root /usr/share/nginx/html; include /etc/nginx/default.d/*.conf; location / { root html; index index.html index.htm; proxy_pass http://localhost:8080/; } location ~ .*\.(gif|jpg|jpeg|png|jfif)$ { root /kwan/; autoindex on ; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
43.139.90.182 qinyingjie.top
启动时可以指定配置文件
首先,说明结论:同一目录下存在多个配置文件时,Nginx是按照文件的名称先后顺序依次读取的!
#验证配置文件 /usr/local/nginx/sbin/nginx -tc /usr/local/nginx/conf/nginx.conf /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf #指定配置文件启动 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf #指定配置文件重启 /usr/local/nginx/sbin/nginx -s reload -c /usr/local/nginx/conf/nginx.conf #说明:-c 参数指定运行nginx系统的自定义配置文件。 #若加:使用自定义配置文件。 #若不加:使用默认的nginx.conf(一般位于/usr/local/conf/nginx.conf,具体以实际情况为准) nginx -c /usr/local/nginx/conf/nginx.conf
要在 Nginx 中开通 WebSocket,需要在 Nginx 配置文件中添加相应的配置。
以下是一个简单的 Nginx 配置文件示例,其中开通了 WebSocket:
http { # ... map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 80; server_name example.com; location /ws/ { proxy_pass http://backend_server/ws/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } }
在这个配置文件中,map 指令用于将 HTTP 请求头中的 Upgrade 和 Connection 字段映射到 Nginx 的变量中,proxy_pass 指令用于将请求转发到后端服务器,proxy_http_version 指令用于指定使用 HTTP 1.1 协议进行转发,proxy_set_header 指令用于设置请求头字段。
具体来说,proxy_set_header Upgrade $http_upgrade; 指令用于将 HTTP 请求头中的 Upgrade 字段设置为 $http_upgrade 变量的值,proxy_set_header Connection $connection_upgrade; 指令用于将 HTTP 请求头中的 Connection 字段设置为 $connection_upgrade 变量的值。
这样,当客户端发送一个 WebSocket 请求时,Nginx 就会将其转发到后端服务器,并将请求头中的 Upgrade 和 Connection 字段设置为 WebSocket 需要的值,从而成功开通了 WebSocket。
upstream qinyingjie.top { server localhost:8080; } location / { proxy_pass https://www.qinyingjie.top; }
server_name qinyingjie.top;
location ~ .*\.(gif|jpg|jpeg|png|jfif)$ { proxy_pass https://www.qinyingjie.top; root /kwan/; autoindex on; }
1.轮训
upstream open-api-test-category{ server 10.250.16.111:8195; server 10.250.16.111:8196; } location / { proxy_pass http://open-api-test-category/; }
2.权重
upstream open-api-test-category{ server 10.250.16.111:8195 weight=1; server 10.250.16.111:8196 weight=3; } location / { proxy_pass http://open-api-test-category/; }
3.hash
upstream open-api-test-category{ server 10.250.16.111:8195; server 10.250.16.111:8196; ip_hash; } location / { proxy_pass http://open-api-test-category/; }
location ~ .*\.(gif|jpg|jpeg|png|jfif)$ { root /kwan/ ; autoindex on ; }
location / { root html; index index.html index.htm; proxy_pass http://localhost:8080/; }
最基本的区别:alias 指定的目录是准确的,root 是指定目录的上级目录,并且该上级目录要含有 location 指定名称的同名目录。另外,根据前文所述,使用 alias 标签的目录块中不能使用 rewrite 的 break。
alias 虚拟目录配置中,location 匹配的 path 目录如果后面不带"/“,那么访问的 url 地址中这个 path 目录后面加不加”/“不影响访问,访问时它会自动加上”/“;
但是如果 location 匹配的 path 目录后面加上”/“,那么访问的 url 地址中这个 path 目录必须要加上”/“,访问时它不会自动加上”/“。如果不加上”/“,访问就会失败!
root 目录配置中,location 匹配的 path 目录后面带不带”/",都不会影响访问。
在 nginx 配置中的良好习惯是:
#直观理解如下形式: location /dev/{ alias /web/dev/doc/; #这个查找文件的路径直接是/web/dev/doc/ } location /dev/{ root /web/dev/doc/; #这个查找文件的路径应该是/web/dev/doc/dev } # 这里使用root配置 如果访问 192.168.2.3/pak/a.html 则对应的路径为:/usr/local/pak/a.html # 通过root配置则location配置的/pak/一定是要在root对应的/usr/local/目录下要有的目录
结论:
1.proxy_pass 末尾有斜杠
location /api/ { proxy_pass http://127.0.0.1:8000/; }
请求地址:http://localhost/api/test
转发地址:http://127.0.0.1:8000/test
2.proxy_pass 末尾无斜杠
location /api/ { proxy_pass http://127.0.0.1:8000; }
请求地址:http://localhost/api/test
转发地址:http://127.0.0.1:8000/api/test
3.proxy_pass 包含路径,且末尾有斜杠
location /api/ { proxy_pass http://127.0.0.1:8000/user/; }
请求地址:http://localhost/api/test
转发地址:http://127.0.0.1:8000/user/test
4.proxy_pass 包含路径,末尾无斜杠
location /api/ { proxy_pass http://127.0.0.1:8000/user; }
请求地址:http://localhost/api/test
转发地址:http://127.0.0.1:8000/usertest
nginx 提供了两种限流方式,
限制请求速率:nginx 的 ngx_http_limit_req_module 模块提供限制请求处理速率的能力,使用了漏桶算法(leaky bucket algorithm)。我们可以想像有一只上面进水、下面匀速出水的桶,如果桶里面有水,那刚进去的水就要存在桶里等下面的水流完之后才会流出,如果进水的速度大于水流出的速度,桶里的水就会满,这时水就不会进到桶里,而是直接从桶的上面溢出。对应到处理网络请求,水代表从客户端来的请求,而桶代表一个队列,请求在该队列中依据先进先出(FIFO)算法等待被处理。漏的水代表请求离开缓冲区并被服务器处理,溢出代表了请求被丢弃并且永不被服务。
漏桶算法
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s; server { location ~* \.(html)$ { limit_req zone=mylimit; } }
limit_req_zone 用于设置限流和共享内存区域的参数,格式为:limit_req_zone key zone rate。
limit_req_zone 只是设置限流参数,如果要生效的话,必须和 limit_req 配合使用。limit_req 的格式为:limit_req zone=name [burst=number] [nodelay]。
上面的例子只简单指定了 zone=mylimit,表示使用 mylimit 这个区域的配置,在请求 html 文件时进行限流。我们可以理解为这个桶目前没有任何储存水滴的能力,到达的所有不能立即漏出的请求都会被拒绝。如果我 1 秒内发送了 10 次请求,其中前 500 毫秒 1 次,后 500 毫秒 9 次,那么只有前 500 毫秒的请求和后 500 毫秒的第一次请求会响应,其余请求都会被拒绝。
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s; server { location ~* \.(html)$ { limit_req zone=mylimit burst=5; } }
burst 表示在超过设定的访问速率后能额外处理的请求数。当 rate=2r/s 时,表示每 500ms 可以处理一个请求。burst=5 时,如果同时有 10 个请求到达,nginx 会处理第 1 个请求,剩余 9 个请求中,会有 5 个被放入队列,剩余的 4 个请求会直接被拒绝。然后每隔 500ms 从队列中获取一个请求进行处理,此时如果后面继续有请求进来,如果队列中的请求数目超过了 5,会被拒绝,不足 5 的时候会添加到队列中进行等待。我们可以理解为现在的桶可以存 5 滴水:
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s; server { location ~* \.(html)$ { limit_req zone=mylimit burst=5 nodelay; } }
nodelay 表示不延迟。设置 nodelay 后,第一个到达的请求和队列中的请求会立即进行处理,不会出现等待的请求。需要注意的是,虽然队列中的 5 个请求立即被处理了,但是队列中的位置依旧是按照 500ms 的速度依次被释放的。后面的 4 个请求依旧是被拒绝的,长期来看并不会提高吞吐量的上限,长期吞吐量的上限是由设置的 rate 决定的。
nginx 限流使用了令牌桶算法:
漏桶算法和令牌桶算法都是用于实现流量控制和限流的算法,但它们的原理和适用场景略有不同。
漏桶算法: 漏桶算法模拟了一个漏桶,请求被认为是水滴,以固定的速率流出(漏出)系统。如果流入的请求速率超过了漏桶的容量,多余的请求将会被丢弃或者等待下一个时间段。漏桶算法适用于平滑流量,防止系统被大量突发流量压垮。但是,对于短时间内的突发流量,漏桶算法并不是特别有效,因为它无法快速处理瞬时大量的请求,而只能以固定的速率处理。
令牌桶算法: 令牌桶算法也是一种流量控制算法,它基于一个令牌桶的概念。令牌以一定的速率被添加到桶中,每个请求在处理之前需要获取一个令牌,如果没有可用的令牌,则请求将被暂时阻塞或丢弃。令牌桶算法可以适应瞬时的突发流量,因为当桶中积累足够多的令牌时,可以快速处理突发请求,而不会受限于固定的速率。这使得令牌桶算法更适合处理突发流量的情况。
所以,总的来说,漏桶算法更适合平滑流量,而令牌桶算法更适合应对突发流量。在实际应用中,可以根据需求选择合适的算法来实现流量控制和限流。
#查找nginx docker search nginx #下载镜像 docker pull nginx:latest #查看本地镜像 docker images #运行容器 docker run --name nginx-test -p 8080:80 -d nginx 参数说明: --name nginx-test:容器名称。 -p 8080:80: 端口进行映射,将本地 8080 端口映射到容器内部的 80 端口。 -d nginx: 设置容器在在后台一直运行。 #访问是否成功 127.0.01:8080
#启动nginx,并挂在配置文件目录到宿主机 docker run -d --name deepexi-belle-damo-nginx \ --privileged=true \ --dns 114.114.114.114 \ -p 80:80 \ -v /etc/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf \ --restart=always deploy.deepexi.com/datasense-test/deepexi-belle-damo-nginx:v1.0.0
scp /Users/qinyingjie/Downloads/www.qinyingjie.top_nginx/www.qinyingjie.top_bundle.crt root@43.139.90.182:/etc/nginx scp /Users/qinyingjie/Downloads/www.qinyingjie.top_nginx/www.qinyingjie.top.key root@43.139.90.182:/etc/nginx
# For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/ user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; server { listen 80; server_name qinyingjie.top; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { root html; index index.html index.htm; proxy_pass http://127.0.0.1:8080/; } location ~ .*\.(gif|jpg|jpeg|png|jfif|webp)$ { root /kwan/; autoindex on ; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } # Settings for a TLS enabled server. # # server { # listen 443 ssl http2 default_server; # listen [::]:443 ssl http2 default_server; # server_name _; # root /usr/share/nginx/html; # # ssl_certificate "/etc/pki/nginx/server.crt"; # ssl_certificate_key "/etc/pki/nginx/private/server.key"; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 10m; # ssl_ciphers PROFILE=SYSTEM; # ssl_prefer_server_ciphers on; # # # Load configuration files for the default server block. # include /etc/nginx/default.d/*.conf; # # location / { # } # # error_page 404 /404.html; # location = /40x.html { # } # # error_page 500 502 503 504 /50x.html; # location = /50x.html { # } # } }
www.qinyingjie.top_bundle.crt www.qinyingjie.top.key
# For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/ user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; server { listen 80; #请填写绑定证书的域名 server_name www.qinyingjie.top; #把http的域名请求转成https return 301 https://$host$request_uri; } server { #SSL 默认访问端口号为 443 listen 443 ssl; #请填写绑定证书的域名 server_name www.qinyingjie.top; #请填写证书文件的相对路径或绝对路径 ssl_certificate www.qinyingjie.top_bundle.crt; #请填写私钥文件的相对路径或绝对路径 ssl_certificate_key www.qinyingjie.top.key; ssl_session_timeout 5m; #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #请按照以下协议配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; location / { #网站主页路径。此路径仅供参考,具体请您按照实际目录操作。 #例如,您的网站主页在 Nginx 服务器的 /etc/www 目录下,则请修改 root 后面的 html 为 /etc/www。 root html; index index.html index.htm; proxy_pass http://127.0.0.1:8080/; } location ~ .*\.(gif|jpg|jpeg|png|jfif|webp)$ { root /kwan/; autoindex on ; } } }
#检查配置是否正确(常用) nginx -t
nginx -s reload
#全局查看 cat /var/log/nginx/error.log #尾部查看 tail -f /var/log/nginx/error.log
觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙