Nginx入门到放弃
load balance 负载均衡
high availability 高可用
1、nginx简介
俄罗斯一位程序员开发
2、使用场景
web服务器
高并发场景
正向代理
反向代理
3、源码安装ngxin
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 解压:tar -zxf nginx- 1.8 . 1 .tar.gz 安装依赖:yum install gcc pcre-devel zlib-devel openssl-devel -y 配置安装路径:./configure --prefix = /opt/nginx 开始编译安装:make && make install 启动:cd /opt/nginx/sbin ./nginx ngixn加入到path中,即放到环境变量中。 常用命令: nginx -s reload | quit 安装目录: conf #配置文件 html #静态文件 sbin #可执行文件 logs #日志文件 |
4、负载均衡搭建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | user nobody worker_processes 1 ; http{ upstream balance { server 127.0 . 0.1 : 7877 ; server 127.0 . 0.1 : 7878 ; server 127.0 . 0.1 : 7879 ; } server { listen 80 ; #监听端口 server_name 127.0 . 0.1 ; #监听地址 location / { proxy_pass http: //balance; } } } |
5、负载均衡策略
(1)轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响;
(2)Weight增加权重
指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下;
upstream balance { server 127.0.0.1:7877 weight=3; server 127.0.0.1:7878 weight=2; server 127.0.0.1:7879 weight=1; }
(3)least_conn最少连接数
在连接负载最少的情况下,nginx会尽量避免将过多的请求分发给繁忙的服务器,而是将新的请求分发给不太繁忙的服务器,避免服务器过载。
upstream balance { least_conn; server 127.0.0.1:7877; server 127.0.0.1:7878; server 127.0.0.1:7879; }
(4)ip_hash
确保来自同一客户端的请求始终定向给同一台服务器,除非此服务器不可用。
每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题;
upstream balance { ip_hash; server 127.0.0.1:7877; server 127.0.0.1:7878; server 127.0.0.1:7879; }
(5)fair响应时间方式,第三方插件
比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块;
(6)url_hash依据url分配方式,第三方插件
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。
在HTTP Upstream模块中,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:
- down:表示当前的server暂时不参与负载均衡;
- backup:预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻;
- max_fails:允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误;
- fail_timeout:在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
http协议长连接,复用连接。
6、资源静态化
配置静态资源路径
location ^~/static/ { root html }
图床,由单个服务器统一处理图片。
7、虚拟主机
虚拟主机时指在网络服务器上分出一定的磁盘空间,用户可以租用此部分空间,以供用户放置站点及应用组件,提供必要的数据存放和传输功能。
分类:
(1)基于域名的虚拟主机,通过域名来区分虚拟主机。(域名不一样,端口一样)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | http{ upstream aaa { server 192.168 . 0.1 : 8080 ; server 192.168 . 0.2 : 8080 ; server 192.168 . 0.3 : 8080 ; } upstream bbb { server 192.168 . 0.1 : 18080 ; server 192.168 . 0.2 : 18080 ; server 192.168 . 0.3 : 18080 ; } server { listen 80 ; #监听端口 server_name www.aaa.com; #监听地址 location / { proxy_pass http: //aaa; } } server { listen 80 ; #监听端口 server_name www.bbb.com; #监听地址 location / { proxy_pass http: //bbb; } } } |

(2)基于端口的虚拟主机,通过端口来区分虚拟主机。(域名一样,端口不一样)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | http{ upstream aaa { server 192.168 . 0.1 : 8080 ; server 192.168 . 0.2 : 8080 ; server 192.168 . 0.3 : 8080 ; } server { listen 8080 ; #监听端口 server_name www.aaa.com; #监听地址 location / { proxy_pass http: //aaa; } } server { listen 8081 ; #监听端口 server_name www.aaa.com; #监听地址 location / { proxy_pass http: //192.168.0.4:8080; } } } |

hosts文件:c:\Windows\System32\drivers\etc\hosts 192.168.0.1 www.aaa.com 192.168.0.1 www.bbb.com 192.168.0.1 www.ccc.com
一台Linux启动多台tomcat
多个项目可以部署在同一个tomcat中,缺点是更新其中一个,需要停止所有服务。建议每个应用部署一个tomcat,方便更新。
8、Session一致性
9、配置文件详解
配置文件结构:
main(全局设置)块设置的指令将影响其它所有设置。server继承main,location继承server,upstream既不会继承其它设置,也不会被继承。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | ... #全局块 events { #events块 ... } http #http块 { ... #http全局块 upstream #负载均衡服务器设置 server #server块,主机设置,指定主机和端口 { ... #server全局块 location [PATTERN] #location块 URL匹配特定位置的设置 { ... } location [PATTERN] { ... } } server { ... } ... #http全局块 } |
配置文件详解:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | #user 指定运行nginx的用户和组(第一个参数为用户,第二个为组,这里只有用户) #user nobody #指定工作进程数(一般设置为CPU的核数) worker_processes 1 ; #指定错误日志为logs/ 目录下的error.log文件 #error_log logs/error.log; #指定错误日志,并指定写入格式为notice #error_log logs/error.log notice; #指定错误日志,并指定写入格式为info #error_log logs/error.log info; #指定pid文件(存放主进程pid号) #pid logs/nginx.pid; #nginx 连接配置模块 events{ accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off #use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport worker_connections 1024 ; #指定每个工作进程最大连接数为 1024 ,默认为 512 } #http配置模块 http{ #文件扩展名与文件类型映射表。通过include家在mime.type文件,里面的types{}模块将文件扩展名映射到响应为MIME类型 include mime.types; default_type application/octet-stream; #定义响应的默认MIME类型,默认为text/plain #access_log off; #取消服务日志 #自定义存入日志的格式 log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for' ; #自定义格式 access_log log/access.log myFormat; #combined为日志格式的默认值 sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。 sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为 0 ,即不设上限。 #tcp_nopush on;#启用或者禁用使用套接字选项(仅在sendfile使用时使用) keepalive_timeout 65 ; #连接超时时间,默认为75s,可以在http,server,location块。http协议 1.1 之后支持长链接。 #gzip on;#启用或者禁用gzip upstream mysvr { ip_hash;#负载均衡调度算法 server 127.0 . 0.1 : 7878 ; server 192.168 . 10.121 : 3333 backup; #热备 } upstream ADMIN-SERVER { server nyshop: 7878 ; } error_page 404 https: //www.baidu.com; #错误页 server { keepalive_requests 120 ; #单连接请求上限次数。 listen 4545 ; #监听端口 server_name 127.0 . 0.1 ; #监听地址 location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。 #root path; #根目录 #index vv.txt; #设置默认页 proxy_pass http: //mysvr; #请求转向mysvr 定义的服务器列表 deny 127.0 . 0.1 ; #拒绝的ip allow 172.18 . 5.54 ; #允许的ip } location / { root /app/admin-web/; index index.html index.htm; try_file $url $url/ /index.html; } location ~/ static / { root /app/admin-web/; index index.html index.htm; try_file $url $url/ /index.html; } #定位前端页面 location /merchant-web/ { alias /app/merchant-web/; index index.html index.htm; try_file $url $url/ /merchant-web/index.html; } #转发后端接口 location ~/admin-server/ { proxy_pass http: //ADMIN-SERVER; proxy_set_header Referer $http_referer proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location ~/business-server/ { proxy_pass http: //BUSINESS-SERVER; proxy_set_header Referer $http_referer proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } } |
补充扩展:
MIME 类型,多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
1 2 3 4 5 6 7 8 9 10 | MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。 MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。 官方的 MIME 信息是由 Internet Engineering Task Force (IETF) 在下面的文档中提供的: RFC- 822 Standard for ARPA Internet text messages RFC- 2045 MIME Part 1 : Format of Internet Message Bodies RFC- 2046 MIME Part 2 : Media Types RFC- 2047 MIME Part 3 : Header Extensions for Non-ASCII Text RFC- 2048 MIME Part 4 : Registration Procedures RFC- 2049 MIME Part 5 : Conformance Criteria and Examples 不同的应用程序支持不同的 MIME 类型。 |
10、路径路由规则

root 匹配域名后面的所有
alias 匹配最后
root的处理结果是:root路径+location路径
alias的处理结果是:使用alias路径替换location路径
使用root,实际的路径就是:root值 + location值。 使用alias,实际的路径就是:alias值。 例如, 有一张图片,URL是:www.awaimai.com/static/a.jpg 它在服务器的路径是:/var/www/app/static/a.jpg 那么用root的配置是: location /static/ { root /var/www/app/; } 用alias的配置就是: location /static/ { alias /var/www/app/static/; } 对于alias,location值可以随便取,例如: location /hello/ { alias /var/www/app/static/; } 这样,我们访问图片的地址就是:www.awaimai.com/hello/a.jpg 注意: 很多文章说:alias 后面必须要用 “/” 结束,是错误的,亲测加不加/效果是一样的。 alias在使用正则匹配时,必须捕捉要匹配的内容,并在指定的内容处使用。 alias只能位于location块中,root可以不放在location中。
感谢阅读到现在,请在留言区提出宝贵的意见!
更多精彩内容,关注微信公众号:技术严选
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!