Nginx的配置和使用

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Donzch/article/details/78914173

Nginx的配置和使用

一、Nginx介绍:

    Nginx (“engine x”) 是一个高性能HTTP和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。Nginx是由IgorSysoev为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
    其特点是占有内存少,并发能力强,能够支持高达50000个并发连接响应。这归功于它选择了epoll and kqueue作为开发模型(socket数量不限制)(Apache采用的select开发模型)。它处理请求是异步非阻塞,在高并发下保持低资源低消耗高性能。非常稳定,bug极少。Apache使用处理每个连接都需要一个进程,其并发性能不是很好。而Nginx使用多路复用的技术,让一个进程处理多个连接,所以并发性能比较好。可以说构建大型网站无一例外都是使用nginx,如:新浪、网易、腾讯、京东、淘宝等。
 
 Nginx是一个高性能的HTTP和反向代理服务器
 采用C语言编写
 支持的操作系统众多,windows、linux、MacOS X
 安全性高,外界只能访问nginx所在服务器,nginx将请求转发内部服务器。调用后,返回调用的结果
 可实现负载均衡
 Rewrite功能强大
 
电商、互联网架构大部分都采用Nginx+Tomcat的架构。

官网地址:http://nginx.org/

Nginx和Apache、IIS等比较

数据统计地址:https://w3techs.com/technologies/overview/web_server/all

web服务器市场份额

    根据W3Techs公布的数据,Nginx目前已经在Web服务器领域有了一定的地位。
    在排名中,Nginx占据了将近三分之一的席位(36.4%),已经取代了IIS(仅为10.4%)第二名的位置。当然,Apache还是当之无愧的老大,占47.8%。这表明,大型网站更愿意使用开源的web服务器。Google服务器现在只有1.0%。
我觉得将来Nginx有望超过Apache

vs
    这得益于Nginx使用了最新的epoll(Linux 2.6内核)和kqueue(freebsd)网络I/O模型,而Apache则使用的是传统的select模型。目前Linux下能够承受高并发访问的Squid、Memcached都采用的是epoll网络I/O模型。
    处理大量的连接的读写,Apache所采用的select网络I/O模型非常低效。下面用一个比喻来解析Apache采用的select模型和Nginx采用的epoll模型进行之间的区别:假设你在大学读书,住的宿舍楼有很多间房间,你的朋友要来找你。select版宿管大妈就会带着你的朋友挨个房间去找,直到找到你为止。而epoll版宿管大妈会先记下每位同学的房间号,你的朋友来时,只需告诉你的朋友你住在哪个房间即可,不用亲自带着你的朋友满大楼找人。如果来了10000个人,都要找自己住这栋楼的同学时,select版和epoll版宿管大妈,谁的效率更高,不言自明。同理,在高并发服务器中,轮询I/O是最耗时间的操作之一,select和epoll的性能谁的性能更高,同样十分明了。

LAMP:Linux Apache Mysql Php,PHP经典架构
LNMP:Linux Nginx Mysql Php 新浪微博,支持亿级别

http 服务器,html,静态资源(js,css,图片)
IIS 微软,不开源,收费,性能差,早期小网站asp

Apache
Nginx

tomcat web服务器(JSP)
IIS(ASP)

nginx反向代理服务器,拦截用户的所有请求,进行转发,转发到指定的服务器上。
动静分离
静态资源:html/shtml/htm/js/css/image
动态资源:jsp/controller
Apache(静态资源)+Tomcat(动态资源)
Nginx(静态资源)+Tomcat(动态资源)
因为Nginx快 ,5w/s 转发, Apache 1000+/s 转发。F5硬件(类似路由器,贵!)

正向代理:

    和日常我们上网不同,在公司我们上网时,不是所有电脑直接访问外网,而是访问一个代理服务器,由代理服务器再访问我们要访问的网站,代理服务器获得访问网站的返回信息后,再返回给我们。这种代理我们的电脑的方式叫做正向代理。
正向代理图示

反向代理:

    nginx实现也是代理,但是代理的后台服务器,我们访问nginx,而nginx代理后面的服务器,由它去决定具体访问哪台服务器。这种方式和正向代理刚好反过来,所以把这种方式称作反向代理。
    反向代理的好处,它屏蔽了后台具体的服务器,我们访问者根本不知道访问的哪台服务器,这样使访问更加安全。

这里写图片描述
    通过前置机(也叫踏板机)将内网和外网隔离,用户只能访问前置机,其他的机器是无法直接访问内网中其他服务器资源,必须通过前置机中转,请求重定向才可以。这样保证了网络的安全。

正向代理和反向代理区别:

再引用一篇博文详细说明:
https://www.cnblogs.com/Anker/p/6056540.html

二.Nginx目录结构如下:

这里写图片描述

Nginx配置文件

conf/nginx.conf
系统配置:server,可以配置多个server
转发规则:location路径、root目录、index欢迎页面
反向代理规则:location拦截路径、proxy_pass转向地址、index

Nginx优化

 user root; #对应系统哪个用户,最好专为nginx创建用户和组,并单独设置权限,这样安全。如:user nginx nginx。
 events I/O模型,Linux推荐使用epoll模型。
 worker_processes 1; #习惯配置和当前服务器的core数相同,或者2倍
 worker_connections 1024; #开启数为实际数量的1/4,浏览器访问时会自动发起2个;反向代理tomcat又是两个。这个数值和操作系统能打开的文件数。理论上并发数=worker_processes * worker_connections。跟物理内存大小也有关系,因为系统打开的文件数和系统的内存成正比。一般1GB内存可也打开大约10W左右。
 worker_rlimit_nofile #一个nginx进程打开最多的文件数目,配置和Linux下文件打开个数一致。ulimit –n来查看。最大设置为65535
 keepalive_timeout 设置65左右
 尽量打开Gzip压缩,gzip_comp_level通常设置为3-5,太高会占用CPU
 Error日志优化,运行期间设置crit,可以减少I/O。

三.启动Nginx:

注意:尽量别直接双击nginx.exe启动Nginx
原因:Windows下有时停止无效,造成开启太多,手工结束进程。

其他方法启动、停止和重启:
在这个目录下先新建3个txt文件
分别保存如下内容,并将后缀.txt改为.bat(文件名称自己命名)
保存内容:start nginx        (示例文件名:nginx_start.bat)
保存内容:nginx -s stop    (示例文件名:nginx_stop.bat)
保存内容:nginx -s reload (示例文件名:nginx_reload.bat)

这三个文件作用分别是:
启动
停止
重启

新建文件后目录如下:
Nginx目录结构

上面三个文件实际上是在命令行执行这些代码,和上面的方式一样(上面只是不用手动输入而已,看个人习惯,你也可以不创建上面三个文件,但要用命令行找到nginx根目录来操作)
如下图:
命令行
启动: start nginx.exe
停止: nginx.exe –s stop
重新加载: nginx.exe –s reload
验证安装是否成功: nginx.exe –t

启动Ngnix后,任务管理器出现如下进程:

任务管理器中的ngnix进程

四、Linux下部署Nginx

https://www.linuxidc.com/Linux/2016-08/134110.htm
可以用这个网址的教程,下面12345可以忽略

1.yum安装

yum install nginx #yum安装nginx,方便它的依赖包自动安装
whereis nginx #查看安装后的各目录

2.启动停止重启

nginx #直接执行,配置文件 /etc/nginx/nginx.conf
nginx -s stop #停止
nginx -s reload #更新

3.测试

nginx –t #测试nginx是否正常
执行结果:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

4.查看进程

[root@10-19-46-61 nginx]# ps -ef |grep nginx
执行结果:
root 28764 1 0 Mar14 ? 00:00:00 nginx: master process ./nginx
nginx 2071 28764 0 08:44 ? 00:00:00 nginx: worker process
nginx 2072 28764 0 08:44 ? 00:00:00 nginx: worker process
root 2399 2114 0 11:22 pts/0 00:00:00 grep nginx

5.常见问题

图片上传保存到服务器,图片的回显,需要把nginx和tomcat和图片服务器执行http://image.demo.com指向同一台服务器。

五、流行的Nginx部署

nginx部署
    先通过一个nginx进行转发到2个nginx上,然后再通过nginx进行负载到多个tomcat集群上。这样的结构优点是,防止单个节点压力过重。也可以实现keepalive和HAProxy+nginx集群,实现nginx高可用。

六、conf下nginx.conf的部分配置

1.请求转发

    当用户访问http://localhost:80,nginx将这个请求什么也不做,只负责转发到tomcat的访问地址http://localhost:8080

server {
        listen       80;
        server_name  localhost;

        location / {                                #拦截所有的资源
            proxy_pass   http://127.0.0.1:8080;     #转向tomcat的地址
        }

}

2.动静分离(指向一个目录)

静态资源:图片、css、js、html(静态资源处理时并发非常高)
动态资源:asp/aspx、php、jsp

nginx默认配置

location / {
root   html;  #相对路径,配置了一个html目录,我们可以将网站所用到的所有的静态资源从war中移除,放到这个目录下。
index  index.html index.htm;        #配置的欢迎页面
}

    传统将项目是把资源一起放到war中,而动静分离是把静态资源从war中剥离出来,单独放在一个目录中。这样当访问静态资源时,就由nginx直接重定向文件资源。当访问动态资源就由tomcat解析。nginx解析静态比tomcat快很多。

例:配置图片服务器

在http{}中配置

    #例子:图片服务器,监听浏览器上的输入
    #如果是http://image.demo.com,请求开头
    #如果是这个开头,开头替换成c:/demo-upload
    #如下:
    #http://image.demo.com/images/2017/12/27/1497255677935623.jpg
    #c:/demo-upload/images/2017/12/27/1497255677935623.jpg
    #动静分离

    server {
        listen       80;#监听、侦听80端口
        server_name  image.demo.com;#监听这个域名,浏览器,在tomcat之前拦截
        location / {#所有请求
               root c:\\demo-upload;#静态相对路径
        }
    }

root:转静态目录的关键字

模拟域名访问

找到如下目录下的hosts,添加(域名自己定义):
127.0.0.1 image.demo.com
127.0.0.1 manage.demo.com
……
可以添加多个
(ps:中间有个空格)
系统hosts:测试环境

七、Nginx+Tomcat集群

一个tomcat承受并发数固定,实际中一个tomcat的并发数是150个。
为了解决tomcat资源耗尽,开启多个tomcat,也就是tomcat集群,可以提高负载能力,150*tomcat个数=?

Nginx配置负载均衡算法

(1)轮询robin算法(服务器配置相同较为合适)

循环往下,到结尾再从第一个开始

配置轮询时加一个
upstream关键字

配置一个upstream,声明一个名称demo-tomcats,配置多个ip地址转向,默认就是轮询

    #配置负载均衡算法,轮询
    upstream demo-tomcats{     #demo-tomcats是自定义的名称
        server 127.0.0.1:8080;
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
    }

    #后台服务器
    server {
        listen       80;
        server_name  manage.demo.com;
        location / {
               #proxy_pass http://127.0.0.1:8081;
               proxy_pass http://demo-tomcats;   #引用上面定义upstream
        }
    }

conf配置

轮询:配置完后,直接访问manage.demo.com
nginx循环转发到一个tomcat服务器

(2)权重weight算法(服务器配置各不相同时较为合适)

实际部署时,往往服务器分批次采购,性能不一样。如果按照轮询方式,资源没有得到充分利用,有的服务器非常繁忙,有的服务器很闲。
根据配置权重,来分配命中次数。
所有节点的weight加起来,然后按对应次数去命中,nginx智能,它会打乱顺序。

    #负载均衡算法,权重
    upstream demo-tomcats{
        server 127.0.0.1:8080 weight=2;#访问请求分成4份,这个tomcat负责2份的链接
        server 127.0.0.1:8081 weight=1;#访问请求分成4份,这个tomcat负责1份的链接
        server 127.0.0.1:8082 weight=1;#访问请求分成4份,这个tomcat负责1份的链接
    }

    #后台服务器
    server {
        listen       80;
        server_name  manage.demo.com;
        location / {
               #proxy_pass http://127.0.0.1:8081;
               proxy_pass http://demo-tomcats;
        }
    }

这里写图片描述

down

如果服务器检修或者换零件,将配置按如下第三个改为down

upstream dmeo-tomcats {
        server 127.0.0.1:8080 weight=2;     #访问请求分成3份,这个tomcat负责2份的链接
        server 127.0.0.1:8081 weight=1;     #访问请求分成3份,这个tomcat负责1份的链接
        server 127.0.0.1:8082 down;     #这个tomcat暂时不参加负载
    }

backup

注:backup不支持ip_hash
当用户请求时,其他服务器很忙,这时就会访问backup这台服务器。

只要在希望成为后备的服务器ip后面多添加一个backup参数,这台服务器就会成为备份服务器。
在平时不使用,nginx不会给它转发任何请求。只有当其他节点全部无法连接的时候,nginx才会启用这个节点。
一旦有可用的节点恢复服务,该节点则不再使用,又进入后备状态。

可以两台机子互为热备,平时各自负责各自的服务。在做上线更新的时候,关闭一台服务器的tomcat后,nginx自动把流量切换到另外一台服务的后备机子上,从而实现无痛更新,保持服务的持续性,提高服务的可靠性。

upstream dmeo-tomcats {
        server 127.0.0.1:8080 weight=2;
        server 127.0.0.1:8081 weight=1;
        server 127.0.0.1:8082 backup;   #当用户请求时,其他服务器很忙,这时就会访问backup这台服务器
    }

(3)另外3种算法

ip_hash
url_hash
fair

首先要了解

请求分两类:有状态(权限userId)和无状态(商品的详情)
如果请求是无状态的,tomcat集群中任何一个tomcat都可以响应,无状态集群就可以动态增和减
如果请求是有状态的,在服务器端要记录用户特征(例:UserId),下一次还必须转向这个服务器才能继续服务,否则还要重新登录

tomcat策略

a.session复制:
如果有一台服务器session有变化,tomcat会把这台服务器内容复制到其他的所有的tomcat各个节点上。(废除,如果集群数量增加性能降低,而且session大小不能控制)

b.session黏着:
当服务器数量固定时,第一次访问,分配的tomcat1,永远就都访问tomcat1。

ip_hash

注:backup不支持ip_hash,
backup和ip_hash不能共存

    #负载均衡算法
    upstream demo-tomcats{
        ip_hash;
        server 127.0.0.1:8080 weight=2;
        server 127.0.0.1:8081 weight=1;
        server 127.0.0.1:8082 weight=1;
    }

    #后台服务器
    server {
        listen       80;
        server_name  manage.demo.com;
        location / {
               #proxy_pass http://127.0.0.1:8081;
               proxy_pass http://demo-tomcats;
        }
    }

ip_hash
ip_hash算法:是session黏着的一种方式,hash(key)%n,key是ip地址,n是机器数量
hash的数据倾斜问题!hash本质是散列,不是完全的平均,它是尽量的平均。
hash数据倾斜的原因是key的变化太少

url_hash

url_hash算法(需要第三方插件):也是session黏着的一种方式hash(url)%n,由于key变化量增加,分配相对ip_hash平均性更好一些

fair

fair算法(需要第三方插件):根据服务器繁忙程度来决定,不忙的服务器接收请求。
有监控有判断,性能低。

这3种算法都是为了解决:解决session共享问题

session共享问题解决绝招:sso单点登录,解决分布式环境下权限处理。
SSO单点登陆技术,后续再发博文总结。

展开阅读全文

没有更多推荐了,返回首页