2019-07-24 Nginx学习笔记

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中,要求使用轮询方式;


2019-07-24 Nginx学习笔记_第1张图片
image.png
修改配置文件
# 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来实现;


2019-07-24 Nginx学习笔记_第2张图片
image.png

实验未成功;下次再试


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

你可能感兴趣的:(2019-07-24 Nginx学习笔记)