目录
nginx是一个高性能的http服务器,反向代理服务器,负载均衡器和邮件代理服务器。
HTTP服务器
nginx可以独立提供http服务,常用于静态网页服务器。
nginx作为http服务器时,支持虚拟主机,可以实现在一台服务器部署多个网站。
在nginx中配置虚拟主机非常方便,添加多个server块即可。
有2种方式配置多个server块:
方法1:直接在http块下配置多个server块
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
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;
keepalive_timeout 65;
#gzip on;
# 配置虚拟主机1
server {
listen 80;
server_name localhost;
charset koi8-r;
access_log /var/log/nginx/host.access.log main;
location / {
# 网站1的根目录
root /usr/share/nginx/html/web1;
index index.html index.htm;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
# 配置虚拟主机2
server {
listen 81;
server_name localhost;
charset koi8-r;
access_log /var/log/nginx/host.access.log main;
location / {
# 网站2的根目录
root /usr/share/nginx/html/web2;
index index.html index.htm;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
如上所示,通过2个server块配置了2个虚拟主机(部署2个不同的网站),分别运行在2个不同的服务端口(80和81)。
方法2:将server块独立配置在不同的配置文件中,并通过include指令在http块中引用
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
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;
keepalive_timeout 65;
#gzip on;
# 通过include指令引用不同的server配置
include /etc/nginx/conf.d/*.conf;
}
如上所示,在nginx配置文件中通过include指令引用不同的server配置文件:将不同server块的配置分别放在不同的独立文件中。
例如,在“/etc/nginx/conf.d”下存在不同的server配置:web1.conf,web2.conf。
# web1.conf文件内容
server {
listen 80;
server_name localhost;
charset koi8-r;
access_log /var/log/nginx/host.access.log main;
location / {
# 网站1的根目录
root /usr/share/nginx/html/web1;
index index.html index.htm;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
# web2.conf文件内容
server {
listen 81;
server_name localhost;
charset koi8-r;
access_log /var/log/nginx/host.access.log main;
location / {
# 网站2的根目录
root /usr/share/nginx/html/web2;
index index.html index.htm;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
反向代理服务器
除了作为静态web服务器,作为后端应用的反向代理也是nginx最为常见的使用场景。
当nginx作为后端应用的反向代理时,充当的是后端应用的网关角色,即:所有到后端应用的请求都要经过nginx。
那么,为什么需要nginx作为后端应用的反向代理呢?大概有这些理由:
首先,nginx作为网关,可以对后端应用起到一定的保护作用,如:请求拦截可以直接在nginx这一层进行实现,避免非法请求进入到后端应用。
其次,如果后端应用支持水平伸缩,当进行集群化部署时,nginx作为统一访问入口,后端应用的变化无需客户端感知,起到解耦的作用。
再者,nginx本身的高性能,可以支撑相当量的并发。
配置nginx作为反向代理时,需要注意2个配置要点:
(1) 使用指令upstream
指定一个后端应用组
(2) 在location块上指定需要设置反向代理的后端应用组名(或者访问地址)
nginx作为反向代理的完整配置模板如下所示:
http {
# 使用upstream指令指定一个后端应用组
upstream tomcat1 {
server 192.168.56.103:8080;
}
server {
# 在location块上设置反向代理
localtion / {
proxy_pass http://tomcat1/;
}
}
}
特别注意:
在配置反向代理时,如果location的映射地址不是“/”而是“/xxx”时,proxy_pass指令之后的访问地址末尾带“/”和不带“/”的效果是完全不一样的,具体来讲:
(1) 当location的映射地址为“/”时,proxy_pass指令指定的访问地址末尾带“/”和不带“/”的效果是一样的;
(2) 当location的映射地址为“/xxx”时,如果proxy_pass指令指定的访问地址末尾带“/”,那么在访问“/xxx”时,实际访问的就是目标服务器的根路径,即:“/”;
(3) 当location的映射地址为“/xxx”时,如果proxy_pass指令指定的访问地址末尾不带“/”,那么在访问“/xxx”时,实际访问的是目标服务器的“/xxx/”路径;
如下图详细说明了上述三种情况的实际表现:
实际上,nginx作为反向代理时,同一个nginx实例既可以作为一个虚拟主机下多个应用的反向代理,也可以作为多个虚拟主机的反向代理。
作为一个虚拟主机下多个应用的反向代理
当nginx作为同一个虚拟主机下多个应用的反向代理时,是通过不同的uri路径来区分不同的应用的,即:需要在不同的location块上应用对应的反向代理配置。
http {
upstream app1 {
server 192.168.56.103:8080;
}
upstream app2 {
server 192.168.56.104:8080;
}
# 在同一个虚拟主机下为多个应用配置反向代理
server {
listen 80;
server_name localhost;
location /app1 {
proxy_pass http://app1/;
}
location /app2 {
proxy_pass http://app2/;
}
}
}
作为多个虚拟主机的反向代理
当nginx作为多个虚拟主机的方向代理时,首先需要配置多个虚拟主机,再在每个虚拟主机下配置反向代理。
http {
upstream app1 {
server 192.168.56.103:8080;
}
upstream app2 {
server 192.168.56.104:8080;
}
# 在虚拟主机1(监听80端口)下配置反向代理
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://app1/;
}
}
# 在虚拟主机2(监听81端口)下配置反向代理
server {
listen 81;
server_name localhost;
location / {
proxy_pass http://app2/;
}
}
}
负载均衡器
负载均衡并不是nginx的核心功能,只能算是一个副业,无法跟专业的负载均衡器相比(如:LVS,HAProxy)。
nginx只能支持特定几种协议的负载均衡,如:HTTP,HTTPS,FastCGI, uwsgi, SCGI, memcached和gRPC,同时也可以作为这几种协议的反向代理。
实际上,nginx作为负载均衡器的场景通常就是作为反向代理。
具体来讲,如果后端应用支持水平扩容,当进行集群部署时,使用nginx作为后端应用的反向代理,即:在upstream
指令配置的服务器组中部署的是同一个应用。
简单轮训策略
如下是nginx作为负载均衡器的默认配置,采用简单轮训策略进行数据转发。
upstream app {
server 192.168.56.103:8080;
server 192.168.56.104:8080;
}
nginx除了支持简单的寻轮策略转发之外,还支持如下三种转发策略:最小连接数策略,客户端IP哈希策略,指定权重策略。
最小连接数策略
最小连接数策略是指nginx会优先将请求转发给负载较小的服务器,这样可以确保请求能尽快地得到响应,同时也尽可能地避免后端应用因为负载过大被压垮。
如下是“最小连接数策略”的配置模板:
upstream app {
least_conn;
server 192.168.56.103:8080;
server 192.168.56.104:8080;
}
如上所示,通过指令“least_conn”配置最小连接数策略。
客户端IP哈希策略
客户端IP哈希是指将指定客户端的请求都转发到一个特定的服务器,这样可能会导致某些后端服务器的压力过大。
配置模板如下:
upstream app {
ip_hash;
server 192.168.56.103:8080;
server 192.168.56.104:8080;
}
如上所示,通过指令“ip_hash”配置最小连接数策略。
服务器权重策略
在服务器权重策略下,大多数请求都会被转发到权重较大的后端服务器。
实际上,简单轮训策略是服务器权重策略的一个特例,即:所有后端服务器的权重都是相同的,所以将请求轮训转发到各个后端服务器。
如下为“服务器权重策略”的配置模板:
upstream app {
server 192.168.56.103:8080 weight=3;
server 192.168.56.104:8080;
}
在上述配置下,由于“192.168.56.103”的权重比“192.168.56.104”的权重大,假设总共有3次请求,那么有2次将会被转发到“192.168.56.103”。
显然,在权重策略下,是人为控制后端应用的负载。
邮件代理服务器
nginx支持对IMAP,POP3和SMTP协议的代理,关于配置nginx作为邮件代理服务器的具体参数详见:https://docs.nginx.com/nginx/admin-guide/mail-proxy/mail-proxy/ 。
【参考】
https://nginx.org/en/docs/ nginx文档
https://nginx.org/en/docs/beginners_guide.html nginx新手入门
https://www.nginx.com/resources/admin-guide/ nginx管理手册
https://mp.weixin.qq.com/s/WWOlTIrYZZ5pvlALttFL8w Nginx 的反向代理及负载均衡
https://www.cnblogs.com/tugenhua0707/p/9880515.html nginx的反向代理proxy_pass指令
https://blog.51cto.com/wangwei007/1103734 Nginx配置proxy_pass转发的/路径问题