工具指南 - nginx
一、常用配置
1.1 配置web
nginx
可以作为web
服务器,用于提供静态文件和动态页面的访问服务。由于nginx
具有高并发和高吞吐量的特点,所以在高访问量的web
应用中表现出色。
nginx
可以作为反向代理服务器,将请求转发给后端服务器,实现负载均衡、高可用、安全等功能。反向代理服务器可以解决访问压力大、单点故障等问题,保证系统的稳定性和可靠性。
比如我们这里有一个前后端分离的博客管理项目,这里我们将静态资源放到nginx
上,由nginx
管理,动态请求转发给后端。
server {
listen 3001;
client_max_body_size 5m;
server_name localhost;
error_page 404 /index.html;
location / {
root /opt/blog/webapp; # 静态资源,前端项目目录
index index.html;
}
location /blog-api {
proxy_pass http://127.0.0.1:30999/; # 动态请求,设置后端代理服务器的地址(反向代理)
}
}
其中:
-
/opt/blog/webapp
:为前端项目存放路径; -
http://127.0.0.1:30999/
:为后端服务地址,所有http://ip/blog-api/xxx
的请求都会转发到http://127.0.0.1:30999/xxx
。
如果服务开启了双向认证:
server {
listen 3001 ssl;
client_max_body_size 5m;
server_name localhost;
ssl_certificate /opt/nginx_ssl/server.crt; #server公钥证书
ssl_certificate_key /opt/nginx_ssl/server.key; #server私钥
ssl_client_certificate /opt/nginx_ssl/client.crt;
ssl_verify_client on;
error_page 404 /index.html;
location / {
root /opt/blog/webapp; # 前端项目地址
index index.html;
}
location /blog-api {
proxy_pass https://127.0.0.1:30999/; # 设置后端代理服务器的地址(反向代理)
proxy_ssl_certificate /opt/nginx_ssl/client.crt; # client公钥证书
proxy_ssl_certificate_key /opt/nginx_ssl/client.key; # client私钥证书
}
}
1.2 获取客户端IP
在nginx
配置文件中,我们可以通过$remote_addr
变量来获取客户端IP
地址。这个变量不是nginx
私有的变量,通常我们使用它来记录客户端IP
地址。
server {
listen 3001 ;
client_max_body_size 5m;
server_name localhost;
error_page 404 /index.html;
location / {
root /opt/blog/webapp; # 前端项目地址
index index.html;
}
location /blog-api {
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://127.0.0.1:30999/; # 设置后端代理服务器的地址(反向代理)
}
}
1.3 通过代理服务器获取客户端IP
在某些情况下,我们的nginx
前面可能会有一个或多个代理服务器,而客户端的真实IP地址可能会被代理服务器隐藏掉,这时我们就需要通过代理服务器来获取客户端真实IP地址。
在代理服务器中,我们需要通过add_header
指令来设置X-Real-IP
头部信息。然后在nginx
中,我们需要使用$proxy_add_x_forwarded_for
变量来获取客户端IP
地址。这个变量的值包括代理服务器的IP
地址和客户端的IP
地址。
代理服务器配置:
location / {
proxy_pass http://backend;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
nginx
服务器配置:
location / {
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;
#获取客户端IP地址,使用$proxy_add_x_forwarded_for变量
add_header X-Real-IP $proxy_add_x_forwarded_for;
}
1.4 负载均衡
如果后端采用集群部署方式,nginx
可以作为负载均衡服务器,将服务请求转发到不同的后端服务器上;
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream web { # 名为web的反向代理群组
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}
server {
listen 3001;
client_max_body_size 5m;
server_name localhost;
error_page 404 /index.html;
location / {
root /opt/blog/webapp; # 前端项目地址
index index.html;
}
location /blog-api {
proxy_pass http://web/; # 设置后端代理服务器的地址(反向代理)
}
}
}
通过upstream
定义一组web
,并指定负载策略(ip_hash
、加权论调、最少连接等),健康检查策略(nginx
可以监控这一组web
的状态)等。
二、 nginx
高可用
nginx
既然作为入口网关,很重要,如果出现单点问题,显然是不可接受的。
因此可以通过keepalived
实现nginx
的高可用。keepalived
是一个高可用解决方案,主要是用来防止服务器单点发生故障,可以通过和nginx
配合来实现web
服务的高可用。(其实,keepalived
不仅仅可以和nginx
配合,还可以和很多其他服务配合)。
keepalived+nginx
实现高可用的思路:
-
第一:请求不要直接打到
nginx
上,应该先通过keepalived
(这就是所谓虚拟IP
,VIP
); -
第二:
keepalived
应该能监控nginx
的生命状态(提供一个用户自定义的脚本,定期检查Nginx进程状态,进行权重变化,,从而实现nginx
故障切换);
参考文章
[1] 部署nginx web
集群