Nginx 简介
Nginx (发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD协议下发行,可以在UNIX、GNU/Linux、BSD、MacOS X 、Solaris 以及Microsoft Windows 等操作系统中运行。
Nginx 由俄罗斯的程序设计师 lgor Sysoev 所开发,最初供俄罗斯大型的网站及搜索引擎Rambler使用。其特点是占用内存少,并发能力强(用于解决C10K问题),事实上Nginx 的并发能力确实在同类型的网页服务器中表现较好。
Nginx 作为一个强大的Web服务器软件,具有高性能、高并发性和低内存占用的特点。此外,其也能够提供强大的反向代理功能。俄罗斯大约有超过20%的虚拟主机采用Nginx作为反向代理服务器,在国内也有腾讯、新浪、阿里、网易等公司在使用Nginx作为反向代理服务器。根据Netcraft统计,世界上最繁忙的网站中有11.48%使用Nginx 作为其服务器或者代理服务器。
基于反向代理的功能,Nginx 作为负载均衡主要有以下几点理由:
- 高并发连接
- 内存消耗少
- 配置文件非常简单
- 成本低廉
- 支持Rewrite 重写规则
- 内置的健康检查功能
- 节省带宽
- 稳定性高
正向代理和反向代理
正向代理:类似一个跳板机,代理访问外部资源。
反向代理(Reverse Proxy):实际运行方式是指以代理服务器来接收Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet 上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
反向代理作用:
- 保证内网的安全,可以使用反向代理提供WAF功能,阻止Web攻击。大型网站通常将反向代理作为公网访问地址,Web服务器是内网。
- 负载均衡,通过反向代理服务器来优化网站的负载。
负载均衡原理
负载均衡,从字面上看就是N台服务器平均分担负载,不会出现某台服务器负载过高而宕机也不会出现某台服务器闲置的情况。负载均衡的前提就是要2台以上服务器才能实现。
Nginx 负载均衡配置方案
-
轮询
轮询即Round Robin,根据Nginx 配置文件中的顺序,依次把客户端的Web请求分发到不同的后端服务器上。 -
最少连接 least_conn
Web 请求会被转发到连接数最少的服务器上。 -
IP地址哈希 ip_hash
前述的两种负载均衡方案中,同一客户端连续的Web请求可能会被分发到不同的后端服务器进行处理。因此如果涉及到会话Session,那么会话会比较复杂。常见的是基于数据库的会话持久化。要解决上面的问题,可以使用基于IP地址哈希的负载均衡方案。这样同一客户端连续的Web请求都会被分发到同一后端服务器进行处理。 -
基于权重 weight
基于权重的负载均衡即Weight Load Balancing,这种方式下,我们可以配置Nginx 把请求更多地分发到高配置的后端服务器上,把相对较少的请求分发到低配服务器。
负载均衡配置
- Nginx 安装 (参考文章)
# 下载安装包
wget http://nginx.org/download/nginx-1.14.2.tar.gz
# 安装依赖项
yum -y install gcc zlib zlib-devel pcre pcre-devel openssl openssl-devel
# 解压
tar -zxvf nginx-1.14.2.tar.gz
# 编译
cd nginx-1.14.2
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install
# 启动
/usr/local/nginx/sbin/nginx
# 停止
# 下面命令相当于先查出nginx进程id再使用kill命令强制杀掉进程。
/usr/local/nginx/sbin/nginx -s stop
# 下面命令待nginx进程处理任务完毕进行停止
/usr/local/nginx/sbin/nginx -s quit
# 重启
/usr/local/nginx/sbin/nginx -s reload
推荐把/usr/local/nginx/sbin/加入到环境变量里面,这样使用nginx的时候就不用输入整个目录了。
- 负载均衡配置
为测试,在同一台机器上安装nginx 和 3个tomcat 服务,端口分别为8080、8081、8082。
user root;
worker_processes auto;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
use epoll;
worker_connections 65535;
}
http {
include 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 logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream app.com {
server 127.0.0.1:8081;
server 127.0.0.1:8080;
server 127.0.0.1:8082;
}
server {
listen 80;
server_name app.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://app.com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
- 配置基于Round Robin 轮询的负载均衡
upstream app.com {
server 127.0.0.1:8081;
server 127.0.0.1:8080;
server 127.0.0.1:8082;
}
缺省配置就是轮询策略;
nginx 负载均衡支持http和https协议,只需要修改proxy_pass 后的协议即可;
nginx 支持FastCGI、uwsgi、SCGI、memcached 的负载均衡,只需将proxy_pass 改为fastcgi_pass, uwsgi_pass 即可;
此策略适合服务器配置相当,无状态且短平快的服务使用。
- 配置基于ip_hash 的负载均衡
upstream app.com {
ip_hash;
server 127.0.0.1:8081;
server 127.0.0.1:8080;
server 127.0.0.1:8082;
}
ip哈希负载均衡使用ip_hash
指令定义;
nginx 使用请求客户端的ip地址进行哈希计算,确保使用同一个服务器响应请求;
此策略适合有状态的服务,比如session。
- 配置基于least_conn 的负载均衡
upstream app.com {
least_conn;
server 127.0.0.1:8081;
server 127.0.0.1:8080;
server 127.0.0.1:8082;
}
最少连接负载均衡通过least_conn
指令定义;
此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。
- 配置基于权重的负载均衡
upstream app.com {
server 127.0.0.1:8081 weight=3;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:8082 weight=1;
}
权重负载均衡需要使用weight
指令定义;
权重越高分配到需要处理的请求越多;
此策略可以与最少连接负载和IP哈希策略结合使用;
此策略比较适合服务器的硬件配置差别比较大的情况。
location匹配规则
user root;
worker_processes auto;
events {
use epoll;
worker_connections 65535;
}
http {
server {
listen 8080;
# 通用匹配,任何未匹配到其他location的请求都会匹配到,相当于switch中的default
location / {
default_type text/html;
return 200 "Hello, Nginx!\n";
}
# 完全匹配
location = /goodjob {
default_type text/html;
return 200 "= /goodjob";
}
# 匹配URI时大小写敏感
location ~ /Goodjob {
default_type text/html;
return 200 "~ /Goodjob";
}
# 匹配URI时忽略大小写
location ~* /goodjob {
default_type text/html;
return 200 "~* /goodjob";
}
# 匹配URI时只需要其前半部分匹配即可
location ^~ /goodjob {
default_type text/html;
return 200 "^~ /goodjob";
}
# 不带任何修饰符,也表示前缀匹配,在正则匹配之后
location /goodJob {
default_type text/html;
return 200 "/goodjob";
}
}
}
「更多精彩内容请关注公众号geekymv,喜欢请分享给更多的朋友哦」