Nginx 反向代理 负载均衡
一、Nginx介绍
Nginx (“engine x”) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。
二、 Nginx的应用场景
- http服务器,可以做静态网页的http服务器。
- 配置虚拟机。一个域名可以被多个ip绑定。可以根据域名的不同请求转发给运行在不同端口的服务器。
- 反向代理,负载均衡。把请求转发给不同的服务器。
扩展:正向代理与反向代理
- 正向代理
- 正向代理需要主动设置代理服务器ip或者域名进行访问,由设置的服务器ip或者域名去访问内容并返回。
- 正向代理是代理客户端,为客户端收发请求,使真实客户端对服务器不可见。
- 反向代理
- 反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。
- 对于客户端来说,反向代理就相当于目标服务器,只需要将反向代理当作目标服务器一样发送请求就可以了,并且客户端不需要进行任何设置;反向代理是代理服务器,为服务器收发请求,使真实服务器对客户端不可见。
扩展:负载均衡
负载均衡就是一个web服务器解决不了的问题可以通过多个web服务器来平均分担压力来解决,并发过来的请求被平均分配到多个后台web服务器来处理,这样服务器压力就被多台服务器分担。
负载均衡服务器分为两种:
- 通过硬件实现的负载均衡服务器,简称硬负载例如:f5。
- 通过软件来实现的负载均衡,简称软负载:例如apache和nginx。
硬负载和软负载相比前者作用的网络层次比较多可以作用到socket接口的数据链路层对发出的请求进行分组转发但是价格成本比较贵,而软负载作用的层次在http协议层之上可以对http请求进行分组转发并且因为是开源的所以几乎是0成本。
三、Nginx的下载与安装
1. Nginx下载
本文使用的是阿里的Tengine;Tengine是由淘宝网发起的Web服务器项目,它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。
官网下载地址:http://tengine.taobao.org/download_cn.html
2. Nginx安装
- 将下载的Tengine压缩包传到服务器(我使用的3.0.0版本)
- 依赖安装:
# 安装依赖
yum install -y gcc gcc-c++ autoconf pcre pcre-devel zlib-devel openssl-devel mod_ssl openssl
- 解压Tengine
# 解压Tengine
tar -zxvf tengine-3.0.0.tar.gz
- 编译
# 进入目录
cd tengine-3.0.0/
# 修改配置(包含https,我这个是部署到/usr/local/nginx目录下,具体按情况进行配置,请确保当前用户对安装目录有读写权限)
sudo chmod u+rwx /usr/local/
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
依赖检查没有问题就如下图所示,如缺少依赖,请对应安装。
# 编译并安装
make && make install
编译完成:
- 查看nginx版本
/usr/local/nginx/sbin/nginx -V
四、Nginx配置
- 修改nginx配置
# 修改Nginx配置
vim /usr/local/nginx/conf/nginx.conf
我这里提供一个简单的示例:
# 工作进程数;根据服务器性能自行配置
worker_processes 1;
events {
# 每个工作进程的最大连接数
worker_connections 1024;
}
http {
# Load Balance
upstream proxyServer {
# ip_hash会话粘连;具体作用后文中会讲到
#ip_hash;
# weight表示权重,权重越大,被负载到的概率越大
server 192.168.25.1:8080 weight=1;
server 192.168.25.2:8080 weight=1;
}
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# HTTP server
server {
# http请求监听端口,默认80(不用输入端口号默认请求的端口)
listen 80;
server_name localhost;
location /demo{
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
proxy_pass http://proxyServer/test;
}
}
# HTTPS server
server {
# https请求监听端口,默认443(不用输入端口号默认请求的端口)
listen 443 ssl;
server_name localhost;
# 单次请求最大文件大小
client_max_body_size 10m;
# ssl配置,注意修改证书路径(SSL证书配置在下文中有讲解)
ssl_certificate /usr/local/nginx/ssl/server.crt;
ssl_certificate_key /usr/local/nginx/ssl/server.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location /demo{
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
proxy_pass http://proxyServer/test;
}
}
}
以上配置,用白话来讲:比如说我Nginx这台服务器的地址是:192.168.25.3
- 那么当我请求:http://192.168.25.3/demo时,会将请求负载到:
http://192.168.25.1:8080/test
http://192.168.25.2:8080/test
这两个url,并将响应返回给客户端。 - 那么当我请求:https://192.168.25.3/demo时,也会将请求负载到:
http://192.168.25.1:8080/test
http://192.168.25.2:8080/test
这两个url,并将响应返回给客户端。
五、Nginx SSL证书配置
证书可以到阿里云、腾讯云去申请,本文就以OpenSSL自签证书为例进行讲解。
# 创建ssl目录,用于存放证书
mkdir /usr/local/nginx/ssl
# 进入ssl目录
cd /usr/local/nginx/ssl/
# 查看OpenSSL版本,如果没有安装,请自行安装
openssl version
# 生成证书秘钥
openssl genrsa -out server.key 2048
# 生成证书csr(参数按需填写)
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Guangdong/L=Shenzhen/CN=haoren.com"
# 生成类型为X509的自签名证书。有效期设置为10年
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
扩展:
CSR: CSR是Certificate Signing Request的英文缩写,即证书签名请求文件,是证书申请者在申请数字证书时由CSP(加密服务提供者)在生成私钥的同时也生成证书请求文件,证书申请者只要把CSR文件提交给证书颁发机构后,证书颁发机构使用其根证书私钥签名就生成了证书公钥文件,也就是颁发给用户的证书。
生成CSR时各参数的含义:
C-国家(Country Name)
ST-省份(State or Province Name)
L-城市(Locality Name)
O-公司(Organization Name)
OU-部门(Organizational Unit Name)
CN-产品名(Common Name)服务器主机名,若填写不正确,浏览器会报告证书无效
六、Nginx的启动、停止、重载配置
# 启动nginx
cd /usr/local/nginx/sbin/
./nginx
# 停止nginx
./nginx -s stop
# 重载配置(当配置修改时,无需停止nginx,只需执行重载命令就可以)
./nginx -s reload
七、会话粘连使用场景
当后端服务器server1、server2启用了session来本地化保存用户的一些数据后,下次用户的请求如果转发给了其他后端服务器,将导致之前的Session数据无法访问。
当然可以采用redis来存储cookie,初次之外,在没有redis的情况,可以在nginx.conf配置中加上 ip_hash来开启会话粘连,让用户在一次会话周期内的所有请求始终转发到一台特定的后端服务器上。