1. 概念
Nginx (engine x) 是一个高性能的web服务器,同时也提供了IMAP/POP3/SMTP。Nginx是由伊戈尔·赛索耶夫为[俄罗斯]访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
目前nginx不仅作为一个轻量级的web服务器,备受业界好评.同时凭借强大的反向代理功能, 以及丰富的插件,得到了各大厂的广泛应用.根据nginx官网的描述, Nginx plus也已经发布,在开源版本的基础上,提供了更加丰富的功能;
2. 功能
作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.
作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。
Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器: Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在 不间断服务的情况下进行软件版本的升级。
3. 与同类产品的比较
LVS的优点:
1、抗负载能力强、工作在第4层仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的;无流量,同时保证了均衡器IO的性能不会受到大流量的影响;
2、工作稳定,自身有完整的双机热备方案,如LVS+Keepalived和LVS+Heartbeat;
3、应用范围比较广,可以对所有应用做负载均衡;
4、配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率;
LVS的缺点:
1、软件本身不支持正则处理,不能做动静分离,这就凸显了Nginx/HAProxy+Keepalived的优势。
2、如果网站应用比较庞大,LVS/DR+Keepalived就比较复杂了,特别是后面有Windows Server应用的机器,实施及配置还有维护过程就比较麻烦,相对而言,Nginx/HAProxy+Keepalived就简单多了。
Nginx的优点:
1、工作在OSI第7层,可以针对http应用做一些分流的策略。比如针对域名、目录结构。它的正则比HAProxy更为强大和灵活;
2、Nginx对网络的依赖非常小,理论上能ping通就就能进行负载功能,这个也是它的优势所在;
3、Nginx安装和配置比较简单,测试起来比较方便;
4、可以承担高的负载压力且稳定,一般能支撑超过几万次的并发量;
5、Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点;
6、Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器。LNMP现在也是非常流行的web环境,大有和LAMP环境分庭抗礼之势,Nginx在处理静态页面、特别是抗高并发方面相对apache有优势;
7、Nginx现在作为Web反向加速缓存越来越成熟了,速度比传统的Squid服务器更快,有需求的朋友可以考虑用其作为反向代理加速器;
Nginx的缺点:
1、Nginx不支持url来检测。
2、Nginx仅能支持http和Email,这个它的弱势。
3、Nginx的Session的保持,Cookie的引导能力相对欠缺。
HAProxy的优点:
1、HAProxy是支持虚拟主机的,可以工作在4、7层(支持多网段);
2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作;
3、支持url检测后端的服务器;
4、它跟LVS一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的;
5、HAProxy可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,不过在后端的MySQL slaves数量超过10台时性能不如LVS;
6、HAProxy的算法较多,达到8种;
LVS: 是基于四层的转发
HAproxy: 是基于四层和七层的转发,是专业的代理服务器
Nginx: 是WEB服务器,缓存服务器,又是反向代理服务器,可以做七层的转发
区别: LVS由于是基于四层的转发所以只能做端口的转发
而基于URL的、基于目录的这种转发LVS就做不了
工作选择:
HAproxy和Nginx由于可以做七层的转发,所以URL和目录的转发都可以做
在很大并发量的时候我们就要选择LVS,像中小型公司的话并发量没那么大
选择HAproxy或者Nginx足已,由于HAproxy由是专业的代理服务器
配置简单,所以中小型企业推荐使用HAproxy
4. 环境说明
服务器名称 | 角色 | ip地址 | 备注 |
---|---|---|---|
nginx前端服务器1 | 负载均衡 | 9.186.137.203 | 备注 |
nginx前端服务器2 | 负载均衡 | 9.186.137.204 | 备注 |
nginx后端 | web | 9.186.137.205 | 备注 |
nginx后端 | web | 9.186.137.206 | 备注 |
5. 测试目标
- 测试nginx的搭建
- 测试nginx通过反向代理进行负载均衡
- 测试nginx + keepalived 实现双活
- nginx的常用命令和配置文件
- 总结nginx一些问题点
6. 安装nginx
6.1 编译安装
查看 http://nginx.org/en/download.html, 找到最新主线版本
wget http://nginx.org/download/nginx-1.17.2.tar.gz
#参考如下网站
http://www.nginx.cn/install
6.2 yum安装
# 配置源
# 安装阿里云的源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 安装epel库
yum install epel-release
# 下载nginx的源配置文件
wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
# 安装nginx的源
rpm -ivh nginx-release-centos-7-0.el7.ngx.noarch.rpm
# 安装nginx
yum install nginx -y
# 安装好后我们可以检查一下nginx的配置
[root@k8s-master203 nginx]# systemctl start nginx
[root@k8s-master203 nginx]# systemctl status nginx
● nginx.service - nginx - high performance web server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2019-07-25 13:35:03 HKT; 8s ago
Docs: http://nginx.org/en/docs/
Process: 25034 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 25035 (nginx)
Tasks: 2
Memory: 1.5M
CGroup: /system.slice/nginx.service
├─25035 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
└─25036 nginx: worker process
Jul 25 13:35:03 k8s-master203 systemd[1]: Starting nginx - high performance web server...
Jul 25 13:35:03 k8s-master203 systemd[1]: Started nginx - high performance web server.
[root@k8s-master203 nginx]# netstat -an |grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
# 可以看到,端口已经打开了
# 此时使用浏览器就可以打开nginx了
6.3 keepalived的安装
yum install keepalived -y
# 需要如下的依赖包
Dependency Installed:
lm_sensors-libs.x86_64 0:3.4.0-6.20160601gitf9185e5.el7 net-snmp-agent-libs.x86_64 1:5.7.2-37.el7
net-snmp-libs.x86_64 1:5.7.2-37.el7
7. 配置nginx
# 目录结构
/etc/sysconfig/nginx # sysconfig的配置文件
/etc/nginx # 配置文件的目录
/var/log/nginx # 日志
/var/cache/yum/x86_64/7/nginx
/var/cache/nginx # cache 路径
/usr/sbin/nginx # 执行程序
/usr/share/nginx # 网页文件的位置
# nginx启动(systemctl)
systemctl start nginx
systemctl status nginx
systemctl stop nginx
# 配置目录结构
[root@k8s-master203 nginx]# tree .
.
├── conf.d
│ ├── default.conf # include 配置
│ └── default.conf.bk
├── fastcgi_params
├── koi-utf
├── koi-win
├── mime.types
├── modules -> ../../usr/lib64/nginx/modules
├── nginx.conf #主配置
├── scgi_params
├── uwsgi_params
└── win-utf
# nginx常用命令
nginx -s reload # 重新载入配置文件
nginx -s reopen # 重启 Nginx
nginx -s stop # 停止 Nginx
nginx -V # 查看配置
nginx -c filename # 指定一个配置文件执行
nginx -g dir # 指定global dir
kill -HUP `cat /run/nginx.pid`
kill -HUP `ps -ef |grep nginx|grep master|awk '{print $2}'`
# 检查配置文件
[root@k8s-master203 nginx]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# 查看详细配置
# nginx 查看日志
journalctl -x -u nginx
# 修改主页
[root@k8s-node205 yum.repos.d]# echo node205-80 > /usr/share/nginx/html/index.html
[root@k8s-node206 yum.repos.d]# echo node206-80 > /usr/share/nginx/html/index.html
[root@k8s-master203 nginx]# curl 9.186.137.205
node205-80
[root@k8s-master203 nginx]# curl 9.186.137.206
node206-80
# 205/205 来模拟我们的后端web服务器
8. 配置负载均衡
目标: 使用203的nginx配置一个负载均衡,将请求转发到205和206中,要求使用轮询方式;
修改配置文件
# cat /etc/nginx/conf.d/default.conf
# 使用upstream插件,进行负载均衡
upstream:是负载的配置模块,serverList是名称,随便起
server_name:是客户端请求的域名地址
proxy_pass:是指向负载的列表的模块,如serverList
upstream tomcatserver1 {
server 9.186.137.205:80 weight=2; #权重为2
server 9.186.137.206:80 weight=1;
#其他参数
#
}
server {
listen 80;
server_name aaa.bbb.com;
#charset koi8-r;
access_log /tmp/host.access.log main;
location / {
proxy_pass http://tomcatserver1;
index index.html index.htm;
}
}
可以看到,已经可以实现负载均衡了;而且是按照权重,访问2次205后,再访问1次206
[root@k8smaster ~]# for i in {1..10}; do curl aaa.bbb.com; done
node206-80
node205-80
node205-80
node206-80
node205-80
node205-80
node206-80
node205-80
node205-80
node206-80
upstream中的其他参数
- down: 表示单前的server暂时不参与负载
- Weight: 默认为1.weight越大,负载的权重就越大。
- max_fails: 允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
- fail_timeout: max_fails 次失败后,暂停的时间。
- Backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
7.2 负载均衡的方法
RR模式,也就是按照server list,将请求轮询发送到所有server上,可以通过weight调整权重;
upstream serverList {
server 9.186.137.205 weight=30;
server 9.186.137.206 weight=30;
}
ip_hash模式: 每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。
upstream serverList {
ip_hash
server 9.186.137.205;
server 9.186.137.206;
}
url_hash:按访问url的hash结果来分配请求,相同的url固定转发到同一个后端服务器处理。也可以定义其他内容作hash
upstream serverList {
hash $request_uri;
hash_method crc32;
server 9.186.137.205;
server 9.186.137.206;
}
fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream serverList {
fair;
server 9.186.137.205;
server 9.186.137.206;
}
8. 多地址配置
有的时候,对于业务来说,需要一个统一的接口服务器进行访问和授权,这种场景下也可以使用nginx来实现;
实验未成功;下次再试
9. 配置nginx 正向代理
10. 配置nginx + keepalive 双活
keepalived的配置文档
https://blog.csdn.net/WanJiaBaoBao/article/details/83587461
11. nginx常用命令
12. nginx调优
ulimit -n #单个进程能打开的最大文件数,一个连接会占用一个fd,因此需要调大
最大连接数 = worker_processes * worker_connections
worker_processes = core数或者core * 2
从下面可以看到,每个nginx只有一个master进程,但后面可以有多个worker线程;
[root@k8s-master203 nginx]# cat nginx.conf |grep worker
worker_processes 5;
worker_connections 1024;
[root@k8s-master203 nginx]# ps -ef|grep nginx|grep master
root 5883 1 0 17:40 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
[root@k8s-master203 nginx]# ps -ef|grep nginx|grep work
nginx 5884 5883 0 17:40 ? 00:00:00 nginx: worker process
nginx 5885 5883 0 17:40 ? 00:00:00 nginx: worker process
nginx 5886 5883 0 17:40 ? 00:00:00 nginx: worker process
nginx 5887 5883 0 17:40 ? 00:00:00 nginx: worker process
nginx 5888 5883 0 17:40 ? 00:00:00 nginx: worker process
13. link
https://www.w3cschool.cn/nginx/nginx-d1aw28wa.html
https://www.cnblogs.com/bluestorm/p/4574688.html
https://www.cnblogs.com/wcwnina/p/8728391.html
http://www.nginx.cn/nginxchswhyuseit
http://tengine.taobao.org/book/index.html