前言
目前正在出一个Nginx
系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~
作为服务端开发,Nginx
一定都不陌生,在web
开发中扮演重要的角色,它能作为反向代理服务器,负载均衡服务器,静态文件服务器等等。
在本系列中将带大家系统性的学习下Nginx
,好了, 废话不多说直接开整吧~
显示指定监听的地址和端口
Nginx
的 listen
指令用于监听指定的 IP
地址和端口号,若 IP
地址或端口
缺失,Nginx
会以默认值来替换。
而且,仅当需要区分与 listen
指令中的同一级别匹配的服务器块时,才会评估 server_name
指令。
示例:
server { listen 192.168.0.1; # 192.168.0.1:80 ... } server { listen 80; # *:80 --> 0.0.0.0:80 server_name x.x.com; ... }
使用 return 指令进行 URL 重定向(301、302)
示例
server { server_name www.example.com; return 301 https://$host$request_uri; }
使用自定义日志格式
可以在 Nginx
配置中作为变量访问的任何内容都可以记录,包括非标准的 HTTP 标头等。因此,这是一种针对特定情况创建自己的日志格式的简单方法。
示例:
## Default main log format from the Nginx repository: log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; ## Extended main log format: log_format main-0 '$remote_addr - $remote_user [$time_local] ' '"$request_method $scheme://$host$request_uri ' '$server_protocol" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" ' '$request_time'; ## Debug log formats: log_format debug-0 '$remote_addr - $remote_user [$time_local] ' '"$request_method $scheme://$host$request_uri ' '$server_protocol" $status $body_bytes_sent ' '$request_id $pid $msec $request_time ' '$upstream_connect_time $upstream_header_time ' '$upstream_response_time "$request_filename" ' '$request_completion';
使用 try_files 指令确认文件是否存在
... root /var/www/example.com; location /images { try_files $uri =404; ... }
使用 limit_conn 改善对下载速度的限制
Nginx
提供了两个指令来限制下载速度:
limit_rate_after
- 设置 limit_rate
指令生效之前传输的数据量limit_rate
- 允许您限制单个客户端连接的传输速率
- 限制传输速度为
10k
location / { limit_rate 10k; root html; }
- 限制50m后限制速度
location / { limit_rate_after 50m; limit_rate 10k; root html; }
使用 HTTP/2
HTTP / 2
将使我们的应用程序更快,更简单且更可靠。 HTTP / 2
的主要目标是通过启用完整的请求和响应多路复用来减少延迟,通过有效压缩 HTTP 标头字段来最小化协议开销,并增加对请求优先级和服务器推送的支持。
示例:
server { listen 443 ssl http2; ... }
负载均衡
但是,网站在实际运营过程中,大部分都是以集群的方式运行,这时需要使用负载均衡来分流。
假设这样一个应用场景:将应用部署在 192.168.1.11:80、192.168.1.12:80、192.168.1.13:80 三台服务器上。网站域名叫 www.xx.com,公网 IP 为 192.168.1.11。
加权轮询策略 配置如下:
http { #设定mime类型,类型由mime.type文件定义 include /etc/nginx/mime.types; default_type application/octet-stream; #设定日志格式 access_log /var/log/nginx/access.log; #设定负载均衡的服务器列表 upstream load_balance_server { #weigth参数表示权值,权值越高被分配到的几率越大 server 192.168.1.11:80 weight=5; server 192.168.1.12:80 weight=1; server 192.168.1.13:80 weight=6; } #HTTP服务器 server { #侦听80端口 listen 80; #定义使用www.xx.com访问 server_name www.xx.com; #对所有请求进行负载均衡请求 location / { root /root; #定义服务器的默认网站根目录位置 index index.html index.htm; #定义首页索引文件的名称 proxy_pass http://load_balance_server ;#请求转向load_balance_server 定义的服务器列表 #以下是一些反向代理的配置(可选择性配置) #proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header X-Forwarded-For $remote_addr; proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时) proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时) proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时) proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置 proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 client_max_body_size 10m; #允许客户端请求的最大单文件字节数 client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数 } } }
负载均衡策略
Nginx 提供了多种负载均衡策略
轮询
upstream bck_testing_01 { # 默认所有服务器权重为 1 server 192.168.250.220:8080 server 192.168.250.221:8080 server 192.168.250.222:8080 }
加权轮询
upstream bck_testing_01 { server 192.168.250.220:8080 weight=3 server 192.168.250.221:8080 # default weight=1 server 192.168.250.222:8080 # default weight=1 }
最少连接
upstream bck_testing_01 { least_conn; # with default weight for all (weight=1) server 192.168.250.220:8080 server 192.168.250.221:8080 server 192.168.250.222:8080 }
加权最少连接
upstream bck_testing_01 { least_conn; server 192.168.250.220:8080 weight=3 server 192.168.250.221:8080 # default weight=1 server 192.168.250.222:8080 # default weight=1 }
IP Hash
upstream bck_testing_01 { ip_hash; # with default weight for all (weight=1) server 192.168.250.220:8080 server 192.168.250.221:8080 server 192.168.250.222:8080 }
普通 Hash
upstream bck_testing_01 { hash $request_uri; # with default weight for all (weight=1) server 192.168.250.220:8080 server 192.168.250.221:8080 server 192.168.250.222:8080 }
维护多个站点服务
当一个网站功能越来越丰富时,往往需要将一些功能相对独立的模块剥离出来,独立维护。这样的话,通常,会有多个 webapp。
举个例子:假如 www.xx.com 站点有好几个 webapp,A、B、C。访问这些应用的方式通过上下文(context)来进行区分:
www.xx.com/A/ www.xx.com/B/ www.xx.com/C/
我们知道,http
的默认端口号是 80,如果在一台服务器上同时启动这 3 个 webapp
应用,都用 80
端口,肯定是不成的。所以,这三个应用需要分别绑定不同的端口号。
那么,问题来了,用户在实际访问 www.xx.com 站点时,访问不同 webapp,总不会还带着对应的端口号去访问吧。所以,你再次需要用到反向代理来做处理。
配置也不难,来看看怎么做吧:
http { ... upstream A{ server www.xx.com:8081; } upstream B{ server www.xx.com:8082; } upstream C{ server www.xx.com:8083; } server { ... #默认指向A的server location / { proxy_pass http:/A; } location /a/{ proxy_pass http://A; } location /b/ { proxy_pass http://B; } location /c/ { proxy_pass http://C; } } }
配置websocket
location /ws/ { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; #下面两个必须设置,请求头设置为ws请求方式 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; }
结束语
Nginx
的常用配置就介绍到这里了,它还有一些比较高级的模块,功能也比较强大,感兴趣的小伙伴可以继续研究一下
本着把自己知道的都告诉大家,如果本文对有所帮助,点赞+关注
鼓励一下呗~