2022Nginx 实战教程,由浅入深
1、简单小栗子
我们先实现一个小目标,完成一个最简单的反向代理。
打开 nginx.conf 文件,添加 upstream,以及在 location 中添加 proxy_pass
upstream 主要是配置均衡池和调度方法 proxy_pass 主要是配置代理服务器 ip 或服务器组的名字
修改配置后需要重启 nginx,如此当我们请求 http://localhost:80/hellonginx/时会得到 test 接口的返回值
test 接口是从 nacos 动态配置获取用户名的值
2、负载均衡详解
先说下 upstream 这个配置的,这个配置是写一组被代理的服务器地址,然后配置负载均衡的算法
2.1 热备
比如我们把应用部署在两个服务器上,平时只使用 A,当 A 挂了才启用 B
#设定实际的服务器列表
upstream myServe {
server 192.168.24.11:8082;
server 192.168.24.12:8082 backup; #热备
}
2.2 普通轮询
#设定实际的服务器列表
upstream myServe {
server 192.168.24.11:8082;
server 192.168.24.12:8082;
}
server {
listen 80;
server_name localhost;
#反向代理的路径(和 upstream 绑定),location 后面设置映射的路径
location /hellonginx/ {
root html;
index index.html index.htm;
proxy_pass http://myServe/test;
}
服务器列表配置 A、B 俩台服务器,此时会进行简单的轮询,也就是服务器处理请求的顺序为:ABAB......
2.3 加权轮询
跟据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为 1。
upstream myServe {
server 192.168.24.11:8082 weight=2;
server 192.168.24.12:8082 weight=1;
}
此时服务器请求顺序为:AABAAB......
2.4 ip_hash
nginx 的 ip_hash 算法是取 ip 地址的前三段数字进行 hash 映射,这样做是为了让来自同一个地区的请求落在一个后台服务上。
upstream myServe {
server 192.168.24.11:8082;
server 192.168.25.12:8082;
ip_hash;
}
2.5 状态参数
down,表示当前的 server 暂时不参与负载均衡。
backup,热备。当其他所有的非 backup 服务挂了,才会请求 backup 机器。
max_fails,允许请求失败的次数,默认为 1。当超过最大次数时,返回 proxy_next_upstream 模块定义的错误。
fail_timeout,在经历了 max_fails 次失败后,暂停服务的时间。max_fails 可以和 fail_timeout 一起使用。
默认:fail_timeout 为 10s,max_fails 为 1 次。
upstream myServe {
server 192.168.24.11:8082 weight=2 max_fails=2 fail_timeout=2;
server 192.168.24.12:8082 weight=1 max_fails=2 fail_timeout=1;
}
如果此时有一台服务器挂了,那么 nginx 服务器分发请求还是会给不能访问的 web 服务器,如果这里的响应连接时间过长,就会导致客户端的页面一直在等待响应,直到我们的响应时间超时,才会把请求重新分发给其他服务器,这里的响应时间如果过长,用户等待的时间就会越长。所以这里会有一些很重要的配置:
proxy_connect_timeout 1; #nginx 服务器与被代理的服务器建立连接的超时时间,默认 60 秒 proxy_read_timeout 1; #nginx 服务器想被代理服务器组发出 read 请求后,等待响应的超时间,默认为 60 秒。proxy_send_timeout 1; #nginx 服务器想被代理服务器组发出 write 请求后,等待响应的超时间,默认为 60 秒。
proxy_ignore_client_abort on; #客户端断网时,nginx 服务器是否终端对被代理服务器的请求。默认为 off。
3、多个 webapp 配置
比如 www.hellonginx.com 站点有好几个 webapp,quote(报价)、contract(合同)、budget(预算)。访问这些应用的方式通过上下文(context)来进行区分:
www.hellonginx.com/quote/
www.hellonginx.com/contract/
www.hellonginx.com/budget/
这三个应用需要分别绑定不同的端口号。而用户在实际访问 www.hellonginx.com 站点时,访问不同 webapp 不会带着不同的端口号,配置也不难,来看看怎么做吧:
http {
# 此处省略一些基本配置
upstream quote_server {
server www.hellonginx.com:8081;
}
upstream contract_server {
server www.hellonginx.com:8082;
}
upstream budget_server {
server www.hellonginx.com:8083;
}
server {
# 此处省略一些基本配置
# 默认指向 quote 的 server
location / {
proxy_pass http://quote_server;
}
location /quote/ {
proxy_pass http://quote_server;
}
location /contract/ {
proxy_pass http://contract_server;
}
location /budget/ {
proxy_pass http://budget_server;
}
}
}
4、https 配置
https 是在 HTTP 的基础上通过传输加密和身份认证保证了传输过程的安全性。https 的安全基础是 ssl,因此加密的详细内容就需要 ssl,所以在 nginx.conf 中你需要指定证书和它对应的 key 其他和 http 反向代理基本一样,只是在 Server 部分配置有些不同。
# HTTPS server
server {
# 监听 443 端口。443 为知名端口号,主要用于 HTTPS 协议
listen 443 ssl;
# 定义使用 www.xx.com 访问
server_name www.hellonginx.com;
# ssl 证书文件位置(常见证书文件格式为:crt/pem)
ssl_certificate cert.pem;
# ssl 证书 key 位置
ssl_certificate_key cert.key;
# ssl 配置参数(选择性配置)
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
# 数字签名,此处使用 MD5
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root /root;
index index.html index.htm;
}
}
5、静态站点配置
我这里用的 windows,反正道理都是一样的
在 static 文件夹下新建了 index.html 和 images 文件夹,然后随便放张图片进去。
server {
listen 80;
server_name localhost;
location / {
root D:/static/;
index index.html index.htm; #设置默认首页
}
}
这样当我们请求时,会显示默认首页,等同于 D:/static/index.html
location /images/ {
alias D:/static/images/;
#autoindex on;
}
看到图片就可以了。
我们看见上面配置中注释了 autoindex on,来看一下有啥效果,当我们请求不具体到某张图片时
Nginx 默认是不允许列出整个目录的,打开后的效果
6、搭建文件服务器
有时候,团队需要归档一些数据或资料,那么文件服务器必不可少。使用 Nginx 可以非常快速便捷的搭建一个简易的文件服务。
Nginx 中的配置要点:
将 autoindex 开启可以显示目录,默认不开启。
将 autoindex_exact_size 开启可以显示文件的大小。默认为 on,显示出文件的确切大小,单位是 bytes。改为 off 后,显示出文件的大概大小,单位是 kB 或者 MB 或者 GB
将 autoindex_localtime 开启可以显示文件的修改时间。默认为 off,显示的文件时间为 GMT 时间。改为 on 后,显示的文件时间为文件的服务器时间。
root 用来设置开放为文件服务的根路径。
charset 设置为 charset utf-8,gbk;,可以避免中文乱码问题(windows 服务器下设置后,依然乱码,本人暂时没有找到解决方法)。
一个最简化的配置如下:
# 显示目录
autoindex on;
# 显示文件大小
autoindex_exact_size on;
# 显示文件时间
autoindex_localtime on;
server {
# windows 服务器下设置后,依然乱码,暂时无解
charset utf-8,gbk;
listen 9050 default_server;
listen [::]:9050 default_server;
server_name _;
root /share/fs;
}
版权声明: 本文为 InfoQ 作者【LoneWalker、】的原创文章。
原文链接:【http://xie.infoq.cn/article/f54b214dbae2d7884c2db01b2】。文章转载请联系作者。
评论