文章目录

  • 一、前言
  • 二、Nginx三大功能——HTTP服务器
  • 三、Nginx三大功能——虚拟主机
    • 3.1 虚拟主机
    • 3.2 Nginx配置文件的结构
    • 3.3 Nginx三种虚拟主机方式——基于ip的虚拟主机配置
    • 3.4 Nginx三种虚拟主机方式——基于端口的虚拟主机配置
    • 3.5 Nginx三种虚拟主机方式——基于域名的虚拟主机配置
  • 四、Nginx三大功能——负载均衡(反向代理+weight权重)
    • 4.1 正向代理与反向代理
    • 4.2 Nginx实现反向代理
      • 4.2.1 proxy_pass参数,请求转发
      • 4.2.2 proxy_method 参数,定义nginx的发出请求的请求方式
      • 4.2.3 proxy_set_header参数,取到客户端的网络信息
      • 4.2.4 location参数,不同匹配规则和优先级
    • 4.3 Nignx实现负载均衡,upstream参数
    • 4.4 Nginx三大功能一起小结
  • 五、实践——Nginx安装使用(以centos7.0为例)
    • 5.1 安装好Nginx
    • 5.2 相关附加操作
  • 六、尾声

一、前言

Nginx是什么?

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

​Nginx作为一个高性能的HTTP和反向代理web服务器,包括三个主要功能:静态服务器(作为Web服务器)、虚拟主机(作为邮件代理服务器)、反向代理(作为服务端的代理,作为负载均衡服务器)。本文以Nginx服务器的三个功能为主线,分为四个部分,分别是:全文第二部分介绍“Nginx三大功能——HTTP服务器”、全文第三部分介绍“Nginx三大功能——虚拟主机”、全文第四部分介绍“Nginx三大功能——负载均衡(反向代理+weight权重)”、全文第五部分介绍“实践——Nginx安装使用”。

Nginx三个功能的区别

(1)HTTP服务器(静态资源服务器/图片服务器)

Nginx作为HTTP服务器:是指在web项目开发时,总是将项目部署在tomcat jetty等应用服务器上,而服务端所需要的资源,文本数据和静态资源路径自然存放在数据库中,而静态资源实体(如图片、音视频等)既不能放在数据库中,又不能放在应用服务器的相关目录下,这个时候我们需要一种用来存放项目所需静态资源的服务器(只要在数据库的字段中存储好静态资源的路径即可),这就是http服务器——Nginx。

为什么称为图片服务器,因为是最常用的静态资源服务器就是图片(虽然Nginx上存放的不一定是图片),以前没有Nginx服务器的时候,使用Apache+Tomcat作为组合,前者存放静态资源,后者存放应用程序,现在变成了 Nginx + Tomcat,Nginx相对于Apache,不仅可以做静态资源存储,还可以使用一个Nginx服务器虚拟出多个服务器(ip port 域名,使一个ip对应多个域名),还可以在服务端作为代理,做负载均衡服务器,将请求转发给tomcat。

对于一个页面,很多请求都是静态资源请求,只有少量是动态请求,这时候如果都去请求tomcat,影响性能,所以用nginx存放静态资源。


nginx在代理层,tomcat在业务层,静态资源和图片直接通过nginx去磁盘上拿文件,不经过tomcat查到数据库图片地址,tomcat只处理动态请求。

现在项目开发中,不单独使用nginx,使用集成了nginx的openresty使用静态页面,更好。

(2)反向代理/负载均衡

Nginx反向代理:Nginx作为服务端代理,代表实际应用服务器与客户端交流,将网络请求分发给后台实际服务器。

Nginx负载均衡:Nginx作为服务端代理,根据weight权重将网络请求分发给后台实际服务器。

负载均衡和反向代理的关系:负载均衡是通过反向代理来实现的,负载均衡=反向代理+weight权重

(3)虚拟主机

Nginx虚拟主机:Nginx部署在一个物理服务器上,却通过ip、端口、域名对外实现多个访问入口,让客户端以为是多个服务器,这就是虚拟主机(具体是如何实现虚拟的,下文提供解释)。

虚拟主机技术,使一个ip,通过port可以对应多个域名。

虚拟主机和负载均衡的区别又是什么?

Nginx做虚拟主机,将一个服务器当做多个服务器用,通过文件目录来虚拟服务器(主机),虚拟主机指的是Nginx自己作为服务器存储文件;

Nginx做负载均衡,Nginx作为服务端代理服务器,将网络请求分发到具体的应用服务器(tomcat或jetty),根据不同的应用服务器(tomcat jetty)的性能,设置weight权重,Nginx本身不作为服务器存储文件。

小结:http服务器是指nginx自己存储图片等静态文件,虚拟主机是nginx提供多个入口来存储图片等静态文件,负载均衡是指nginx根据权重weight将网络请求分发给具体的应用服务器,实际项目中三个都会用到。

二、Nginx三大功能——HTTP服务器

Nginx是一款优秀的静态服务器,在做Javaweb开发时,经常将它用来存放静态资源,一般是图片资源,所以又将Nginx称为图片服务器,然后将图片地址存入关系型数据库(一般为Mysql)中。关于Nginx作为静态服务器的配置,且看下面。

配置Nginx——修改nginx安装目录/conf/nginx.conf(这里是/usr/local/nginx/conf/nginx.conf文件),如下:

​​server {listen       81; # 监听的端口server_name  localhost; # 域名或iplocation / {     root   /usr/local/nginx/index;# 根目录index  index.html index.htm; # 默认首页}error_page   500 502 503 504  /50x.html;      # 错误页面location = /50x.html {root   /usr/local/nginx/html;}}

解释:location / 表示只要用户请求了 localhost:81 网站下的任何路径,直接定位到root指定的目录/usr/local/nginx/index

现在我们来对这段代码解释,实际上,对于Nginx做服务器,和其他服务器一样,只要搞清“ ip:port 页面 后台目录 ”三个东西就好了:

指定ip:port是 localhost:81,我们直接在linux计算机的浏览器上输入localhost:81,显示的是index.html/index.htm界面,对应后台目录是nginx安装目录/index目录(如usr/local/nginx/index);

我们直接在linux计算机的浏览器上输入localhost:81/50x.html,对应后台目录是nginx安装目录/html目录(如usr/local/nginx/html)。

关于匹配关系,上面的配置中 / 表示可以匹配所有,/50x.html 表示可以匹配50x.html,优先级关系是优先匹配长的,

如localhost:81/50x.html 同时满足 / 和 /50x.html,由于优先匹配长的,所以要导向到 html 目录。

如localhost:81/xxx.html 仅满足于 / ,所以导向到index目录。

关于页面优先关系, index index.html index.htm;优先关系是从左到右,有index.html就显示index.html,没有就显示index.htm。

如图:

附加:关于应用服务器和静态服务器的相关知识:我说软件服务器——软件服务器的前世今生(web服务器+应用服务器)

三、Nginx三大功能——虚拟主机

3.1 虚拟主机

什么是虚拟主机?

虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供www服务,这样就可以实现一台主机对外提供多个web服务,每个虚拟主机之间是独立的,互不影响的(看不懂,没关系,一点一点往下面看)。

通过nginx可以实现虚拟主机的配置,nginx支持三种类型的虚拟主机配置,分别是:1、基于ip的虚拟主机, 2、基于端口的虚拟主机,3、基于域名的虚拟主机

3.2 Nginx配置文件的结构

......
events {.......
}
http{.......server{.......}server{.......}}

nginx的 /conf/nginx.conf 配置中,每个server标签就是一个虚拟主机。 实际上,就是同一机器,用不同的目录虚拟成不同的访问入口。

其中,因ip不同形成的不同的访问入口称为“基于ip的虚拟主机”,因端口不同形成的不同的访问入口称为“基于端口的虚拟主机”,因域名不同形成的不同的访问入口称为“基于域名的虚拟主机”。

3.3 Nginx三种虚拟主机方式——基于ip的虚拟主机配置

一台nginx服务器绑定两个ip:192.168.101.3、192.168.101.103,访问不同的ip请求不同的html目录,即:访问http://192.168.101.3将访问“html3”目录下的html网页,访问http://192.168.101.103将访问“html103”目录下的html网页,如图:

对于上图的解释:
一个物理服务器,提供两个ip地址,分别是192.168.101.3:80和192.168.101.103:80,在外界客户端开来,好像有两个服务器,都可以独立网络请求,因为它们后台是不同的文件目录,分别是/usr/local/nginx/html3和/usr/local/nginx/html103,不会产生任何数据文件干扰。

配置Nginx——修改nginx安装目录/conf/nginx.conf(这里是/usr/local/nginx/conf/nginx.conf文件),如下:

#user  nobody;
worker_processes  1;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;#配置虚拟主机192.168.101.3server {#监听的ip和端口,配置192.168.101.3:80listen       80;#虚拟主机名称这里配置ip地址server_name  192.168.101.3;#所有的请求都以/开始,所有的请求都可以匹配此locationlocation / {#使用root指令指定虚拟主机目录即网页存放目录#比如访问http://ip/test.html将找到/usr/local/html3/test.html#比如访问http://ip/item/test.html将找到/usr/local/html3/item/test.htmlroot   /usr/local/nginx/html3;#指定欢迎页面,按从左到右顺序查找index  index.html index.htm;}}#配置虚拟主机192.168.101.103server {listen       80;server_name  192.168.101.103;location / {root   /usr/local/nginx/html103;index  index.html index.htm;}}}

3.4 Nginx三种虚拟主机方式——基于端口的虚拟主机配置

nginx对外提供80和8080两个端口监听服务,请求80端口则请求html80目录下的html,请求8080端口则请求html8080目录下的html,如图:

对于这个图的理解是:
一个物理服务器,提供两个ip地址,分别是192.168.101.3:80和192.168.101.3:8080,在外界客户端开来,好像有两个服务器,都可以独立网络请求,因为它们后台是不同的文件目录,分别是/usr/local/nginx/html80和/usr/local/nginx/html8080,不会产生任何数据文件干扰。

配置Nginx——修改nginx安装目录/conf/nginx.conf(这里是/usr/local/nginx/conf/nginx.conf文件),如下:

#user  nobody;
worker_processes  1;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;#配置虚拟主机server {#监听的ip和端口,配置80listen       80;#虚拟主机名称这里配置ip地址server_name  192.168.101.3;#所有的请求都以/开始,所有的请求都可以匹配此locationlocation / {#使用root指令指定虚拟主机目录即网页存放目录#比如访问http://ip/test.html将找到/usr/local/html3/test.html#比如访问http://ip/item/test.html将找到/usr/local/html3/item/test.htmlroot   /usr/local/nginx/html80;#指定欢迎页面,按从左到右顺序查找index  index.html index.htm;}}#配置虚拟主机server {listen       8080;server_name  192.168.101.3;location / {root   /usr/local/nginx/html8080;index  index.html index.htm;}}}

3.5 Nginx三种虚拟主机方式——基于域名的虚拟主机配置

两个域名指向同一台nginx服务器,用户访问不同的域名显示不同的网页内容。两个域名是aaa.test.com和bbb.test.com,nginx服务器使用虚拟机192.168.101.3 ,如图:

对于这个图的理解是:

一个物理服务器,提供两个域名地址,分别是aaa.test.com和bbb.test.com,在外界客户端开来,好像有两个服务器,都可以独立网络请求,因为它们后台是不同的文件目录,分别是/usr/local/aaa_html和/usr/local/bbb_html,不会产生任何数据文件干扰。

在192.168.101.3上创建/usr/local/aaa_html,此目录为aaa.test.com域名访问的目录;在192.168.101.3上创建/usr/local/bbb_html,此目录为bbb.test.com域名访问的目录。

配置Nginx——修改nginx安装目录/conf/nginx.conf(这里是/usr/local/nginx/conf/nginx.conf文件),如下:

#user  nobody;
worker_processes  1;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;#配置虚拟主机aaa.test.com
server {#监听的ip和端口,配置本机ip和端口listen 192.168.101.3:80;      #虚拟主机名称是aaa.test.com,请求域名aaa.test.com的url将由此server配置解析server_name aaa.test.com;   #所有的请求都以/开始,所有的请求都可以匹配此locationlocation / {#使用root指令指定虚拟主机目录即网页存放目录#比如访问http://ip/test.html将找到/usr/local/aaa_html/test.html#比如访问http://ip/item/test.html将找到/usr/local/aaa_html/item/test.htmlroot /usr/local/aaa_html;  #指定欢迎页面,按从左到右顺序查找index index.html index.htm; }}#配置虚拟主机bbb.test.comserver {listen 192.168.101.3:80;server_name bbb.test.com;location / {root /usr/local/bbb_html;index index.html index.htm;}}
}


在三种虚拟主机(基于IP的虚拟主机、基于端口的虚拟主机、基于域名的虚拟主机)中,项目开发中使用的最多的是基于域名的虚拟主机。

(1) 对于基于IP的虚拟主机:由于ip地址本来就稀缺,一个物理服务器配两个ip是不合实际的(毕竟,一个ip比一个服务器贵),所以,基于ip的虚拟主机不常用到,读者了解即可;

(2) 对于基于端口的虚拟主机:端口倒是不稀缺0-65535(一共65536个,默认是80端口),但是想让用户在浏览器上输入端口是非常不切实际的,所以,基于ip的虚拟主机也不常用到,读者了解即可;

(3) 对于基于域名的虚拟主机:一个物理服务器/服务器群(一个ip)配置多个域名,是可行的,因为:

一来,域名平均价格比ip便宜的多(即租用多个域名比多个ip便宜,所以基于域名的虚拟主机比基于ip的虚拟主机便宜,注意:这里使用了平均两个字,希望读者不要抬杠);

二来,用户可以容易的记得域名,然后在浏览器中输入域名;

所以,基于ip的虚拟主机经常用到,读者一定要知道,下面我们将反向代理和负载均衡,在上面的一层会用到虚拟主机,都是基于域名的虚拟主机。

四、Nginx三大功能——负载均衡(反向代理+weight权重)

4.1 正向代理与反向代理

要搞清楚什么是负载均衡,我们先要搞清楚什么是反向代理,因为负载均衡是在反向代理的基础上加上weight权重得到的。

正向代理:是指客户端的代理,代表客户端向服务端发出网络请求,如图:

反向代理:是指服务端的代理,代表服务端向客户端发出响应结果,如图:

正向代理+反向代理,由客户端代理服务器代表Client客户机向服务端发出网络请求,由服务端代理服务器代表Server服务机向客户端发出响应结果。如图:

最最最简单的理解,正向代理和反向代理这个知识是计算机网络中的一个知识,由于当前使用的http网络请求时基于请求-响应模式,服务端开启后被动等待(websocket协议服务端也可以发送消息给客户端),由客户端主动发起网络请求(get请求、post请求),服务端提供结果响应,然后客户端再一次主动发起网络请求,服务端再一次提供结果响应

客户端局域网LAN1中的代理服务器代表客户端主机,我们称之为正向代理,正向代理隐藏了客户端,其存在的意义在于 客户端无法直接访问到服务端,但是 代理服务器可以访问到服务端,所以客户端通过代理服务器来访问到服务端。
服务端局域网LAN2中的代理服务器代表服务端主机,我们称之为反向代理,反向代理隐藏了服务端,一个常见的应用就是服务端的负载均衡,其(即负载均衡)存在的意义在于 以合理的方式将请求均分到服务端集群 各个服务器,是高并发的必备要素。

反向代理和负载均衡:负载均衡是反向代理的一个应用。

4.2 Nginx实现反向代理

Nginx是如何实现反向代理的,我们一步步来分析。两个tomcat服务通过nginx反向代理,本例子使用三台虚拟机进行测试,

nginx服务器:192.168.101.3
tomcat1服务器:192.168.101.5
tomcat2服务器:192.168.101.6

如图:

配置Nginx——修改nginx安装目录/conf/nginx.conf(这里是/usr/local/nginx/conf/nginx.conf文件),如下:

#user  nobody;
worker_processes  1;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;#配置一个代理即tomcat1服务器upstream tomcat_server1 {server 192.168.101.5:8080;}#配置一个代理即tomcat2服务器upstream tomcat_server2 {server 192.168.101.6:8080;}#配置一个虚拟主机server {listen 80;server_name aaa.test.com;location / {#域名aaa.test.com的请求全部转发到tomcat_server1即tomcat1服务上proxy_pass http://tomcat_server1;#欢迎页面,按照从左到右的顺序查找页面index index.jsp index.html index.htm;}}server {listen 80;server_name bbb.test.com;location / {#域名bbb.test.com的请求全部转发到tomcat_server2即tomcat2服务上proxy_pass http://tomcat_server2;index index.jsp index.html index.htm;}}
}

server标签里面的location标签,里面有一些常用参数,一个个解释:

4.2.1 proxy_pass参数,请求转发

核心:反向代理最重要的参数 proxy_pass ,表示将实际请求全部转发到具体服务上。

Nginx可以实现反向代理的功能,Nginx只做请求的转发,后台有多个http服务器提供服务,nginx的功能就是把请求转发给后面的服务器,决定把请求转发给谁,nginx提供算法。

4.2.2 proxy_method 参数,定义nginx的发出请求的请求方式

server {listen 80;server_name localhost;location / {proxy_pass http://192.168.44.1:9096;proxy_method POST;proxy_set_header Host $host;#获取客户端的ip地址设置到header中proxy_set_header X-Real-IP $remote_addr;#获取所有转发请求的ip信息列表proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}

浏览器访问 192.168.44.181(这是centos地址)/user/query ,这个到服务端被nginx挡住,就是localhost:80,转给 192.168.44.1:9096 (就是本地idea启动的tomcat,本地ip为192.168.44.1,tomcat端口为 9096)

这个nice 就是 idea上启动的tomcat 返回给浏览器的,@RestController = @Controller + @ResponseBody ,所以返回的是字符串。

4.2.3 proxy_set_header参数,取到客户端的网络信息

这里实际上进行了两次请求,浏览器发送请求给nginx,和 nginx发送请求给本地idea上的tomcat,即:

浏览器发送请求给nginx:192.168.44.181(这是centos地址)/user/query,就是到了centos上的 localhost:80

nginx发送请求给本地idea上的tomcat:centos上的 localhost:80 转发到 192.168.44.1:9096 就是idea 启动的tomcat.

所有的,在idea的tomcat上获得的网络请求信息,都是第二次post请求(nginx发送给本地idea上的tomcat)的,因为第一次get请求是浏览器发送给nginx的,要想获得第一次get请求的信息,需要先将nginx收到的浏览器请求的信息存到自定义的变量名里面,然后nginx发送给tomcat,这样tomcat就可以拿到第一次请求的网络信息了

proxy_set_header 自定义变量名(发给tomcat) $符号拿到nginx系统内置变量,就是nginx存放的,第一次请求发送给nginx的

server {listen 80;server_name localhost;location / {proxy_pass http://192.168.44.1:9096;proxy_method POST;#设置代理请求的请求头(Host是key,$host是value,是nginx内置变量,不用在nginx.conf中赋值,直接取用)proxy_set_header Host $host;#获取客户端的ip地址设置到header中(X-Real-IP是key,$remote_addr是value,是nginx内置变量,不用在nginx.conf中赋值,直接取用)proxy_set_header X-Real-IP $remote_addr;#获取所有转发请求的ip信息列表(X-Forwarded-For是key,$proxy_add_x_forwarded_for是value,是nginx内置变量,不用在nginx.conf中赋值,直接取用)proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}

idea上tomcat取出三个变量值

在反向代理的过程中,既可以获得原始网络信息(就是nginx的信息),也可以获得转发的网络信息(就是idea的信息)。

request.getMethod()  # 表示nginx这个转发请求的类型
request.getRemoteAddr()  # 表示nginx这个转发请求的来源,就是nginx所在地址
# nginx将代理请求发送给idea,idea收到之后以下方式
# (1) request 表示从nginx来的请求
# (2) .getHeader 表示请求头
# (3) 键名Host X-Real-IP X-Forwarded-For 表示请求头的键名
request.getHeader("Host")
request.getHeader("X-Real-IP")  # 目的idea的地址
request.getHeader("X-Forwarded-For")  # 目的idea的地址

问题:curl http -kv 走nginx代理发现 404 ,
看日志:find / -name nginx 找到nginx的 tail -f access.log 日志,里面只有 404;找到 nginx 的 tail -f error.log 日志,里面啥都没有。
解决方案:增加proxy_set_header Host $host; 参考
https://blog.csdn.net/weixin_41585557/article/details/82426784
https://www.jianshu.com/p/77a461bd0bd5

4.2.4 location参数,不同匹配规则和优先级

location / 这个是最常用的,优先级最低的,所有如下表,从上往下,优先级越来越低。如果上面的匹配到,下面的就不会再尝试匹配了。

模式 含义
localtion = /uri = 表示精确匹配,只有完全匹配上才能生效。
localtion ^~ /uri ^~ 开头对URL路径进行前缀匹配,并且在正则之前。
localtion ~ pattern 开头表示区分大小写的正则匹配
localtion ~* pattern 开头表示不区分大小写的正则匹配
localtion /uri 不带任何修饰符,也表示前缀匹配,但是在正则匹配之后
localtion / 通用匹配,任何未匹配到其他 location的请求都会匹配到,相当于 switch 中的 default

从上到下是:

(1) 精准匹配(url要完全匹配上)
(2) 前缀匹配(url只要匹配到前面部分)
(3) 区分大小写的正则匹配pattern
(4) 不区分大小写的正则匹配pattern,即前缀匹配(url只要匹配到前面部分)
(5) 前面五个都没匹配上,就用 /

4.3 Nignx实现负载均衡,upstream参数

上面讲过,Nginx实现负载均衡是在反向代理的基础上加上一个weight权重,这里一步步分析。nginx作为负载均衡服务器,用户请求先到达nginx,再由nginx根据负载配置将请求转发至 tomcat服务器。

nginx负载均衡服务器:192.168.101.3
tomcat1服务器:192.168.101.5
tomcat2服务器:192.168.101.55
tomcat3服务器:192.168.101.6
tomcat4服务器:192.168.101.66

如图:

配置Nginx——修改nginx安装目录/conf/nginx.conf(这里是/usr/local/nginx/conf/nginx.conf文件),如下:

#user  nobody;
worker_processes  1;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;#配置一个代理即tomcat1服务器upstream tomcat_server1 {server 192.168.101.5:8080   weight=1;server 192.168.101.55:8080  weight=2;}#配置一个代理即tomcat2服务器upstream tomcat_server2 {server 192.168.101.6:8080  weight=2;server 192.168.101.66:8080  weight=3;}#配置一个虚拟主机server {listen 80;server_name aaa.test.com;location / {#域名aaa.test.com的请求全部转发到tomcat_server1即tomcat1服务上proxy_pass http://tomcat_server1;#欢迎页面,按照从左到右的顺序查找页面index index.jsp index.html index.htm;}}server {listen 80;server_name bbb.test.com;location / {#域名bbb.test.com的请求全部转发到tomcat_server2即tomcat2服务上proxy_pass http://tomcat_server2;index index.jsp index.html index.htm;}}
}

最后,请求aaa.test.com,通过nginx负载均衡,将请求转发到tomcat应用服务器。通过观察tomcat的访问日志或tomcat访问页面即可知道当前请求由哪个tomcat服务器受理。

所以,反向代理可能只有一个目标tomcat服务器,但是负载均衡一定有不止一个目标tomcat服务器(nginx只转发到唯一一个目标tomcat服务器,就不叫负载均衡了),既然有一个多个目标tomcat服务器,就 引入一个 upstream 参数,这是负载均衡最重要的参数。

upstream 块里面,每个服务器后面可以配置一些参数

upstream tomcats{server 192.168.44.168:2673 weight=2 max_fails=3 fail_timeout=15;server 192.168.44.168:2674 weight=3;server 192.168.44.168:2675 weight=1;server 192.168.44.168:2676 down;server 192.168.44.168:2677 backup;
}
配置块名称 作用
weight 默认为1。weight越大,负载的权重就越大。比如三台服务器权重分别是1、2、3,接受请求的比例分别是1/6、2/6、3/6。
max_conns 限制分配给某台Server处理的最大连接数量,超过这个数量,将不会分配新的连接给它。默认为0,表示不限制。
max_fails 默认为1。某台Server允许请求失败的次数,超过最大次数后,在fail_timeout时间内,新的请求将不会分配给这台机器。
fail_timeout 默认为10秒。某台Server达到max_fails次失败请求后,在fail_timeout 期间内,nginx会认为这台Server暂时不可用,不会将请求分配给它。
backup 其它所有的非backup机器down或者忙的时候,请求backup机器。
down 表示当前的server暂时不参与负载。

对上面参数的解释
(1) weight和max_conns:tweight 使用的是比例,max_conns使用的是具体的最大数量,默认无限制.
(2) max_fails 和 fail_timeout :这两个参数连在一起用,表示 某个server(一般是对应tomcat) 失败次数达到 max_fails ,那么在 fail_timeout 的时间内不会转发给这个 server(即tomcat).
(3) backup:标识备用机器.
(4) down:标识该机器暂时不用.

对于负载均衡,只要知道它的最重要的 upstream 参数就好,还有就是nginx的默认的负载均衡算法和常用的负载均衡算法。

wrr:英文全称weighted round-robin,就是权重(就是上面的weight)轮询,这是默认负载均衡方式.
ip_hash:IP的哈希结果固定选择一个真实服务器,每个请求只访问tomcat,解决跨节点session共享问题,分布式登录的时候用到。
leas_conn:该负载均衡方案同时考虑连接数和权重两个因素,连接数越小且权重越大,则优先,如果上一次刚刚分配,本次不分配。

哈希算法的参数如何使用,就是配置好,就 upstream 块里面 server全部生效,默认是wrr weight round robin权重轮询。

upstream ecif{# 这里表示使用ip_hash的负载均衡算法ip_hash;# 三个同时生效server 192.168.44.1:12673;server 192.168.44.1:12674;server 192.168.44.1:12675;
}server {listen 80;server_name localhost;location / {proxy_pass http://ecif;}
}

4.4 Nginx三大功能一起小结

一图小结——Nginx再也不复杂(http服务器+虚拟主机+负载均衡):

配置Nginx——修改nginx安装目录/conf/nginx.conf(这里是/usr/local/nginx/conf/nginx.conf文件),如下:

​#user  nobody;
worker_processes  1;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;#配置一个代理即tomcat1服务器
upstream tomcat_server1 {server 192.168.101.5:8080   weight=1;server 192.168.101.55:8080  weight=2;}
#配置一个代理即tomcat2服务器upstream tomcat_server2 {server 192.168.101.6:8080  weight=2;
server 192.168.101.66:8080  weight=3;}#配置两个虚拟主机server {listen 80;server_name aaa.test.com;location / {#域名aaa.test.com的请求全部转发到tomcat_server1即tomcat1服务上proxy_pass http://tomcat_server1;#欢迎页面,按照从左到右的顺序查找页面index index.jsp index.html index.htm;}}server {listen 80;server_name bbb.test.com;location / {#域名bbb.test.com的请求全部转发到tomcat_server2即tomcat2服务上proxy_pass http://tomcat_server2;index index.jsp index.html index.htm;}
}
# http服务器
server {listen       81; # 监听的端口server_name  localhost; # 域名或iplocation / {      # 访问路径配置root   /usr/local/nginx/index;# 根目录index  index.html index.htm; # 默认首页}}}

看到 upstream 就一定有proxy_pass,upstream + proxy_pass 就是用到了 负载均衡
看到 proxy_pass 就一定要到反向代理

看到 多个server 就将一个服务器虚拟出了多个虚拟主机

至于静态服务器,只要用到了nginx就会用它来存放图片等静态资源,无法从 conf/nginx.conf 中看出来。

五、实践——Nginx安装使用(以centos7.0为例)

nginx是C语言开发,本节演示centos7.0上安装Nginx

5.1 安装好Nginx

步骤一:安装好相关依赖(gcc、pcre、zlib、openssl)

(1)gcc

安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc:yum install gcc-c++

(2)pcre

PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库:yum install -y pcre-devel

注:pcre-devel是使用pcre开发的一个二次开发库。nginx也需要此库。

(3)zlib

zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库:yum install -y zlib zlib-devel

(4)openssl

OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。

nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库:yum install -y zlib zlib-devel

步骤二:下载linux版本nginx压缩包

由于各个用户所需要的nginx版本不一定相同,所有这里不再提供nginx安装包,用户在到nginx官网下载。

(本节使用截止2019/12/01最新nginx-1.16.1.tar.gz安装演示,其他版本安装相同)

步骤三:解压并配置nginx

解压nginx:tar -zxvf nginx-1.16.1.tar.gz

配置nginx

进入解压目录中:cd nginx-1.16.1.tar.gz

配置nginx:

./configure \--prefix=/usr/local/nginx \--pid-path=/var/run/nginx/nginx.pid \--lock-path=/var/lock/nginx.lock \--error-log-path=/var/log/nginx/error.log \--http-log-path=/var/log/nginx/access.log \--with-http_gzip_static_module \--http-client-body-temp-path=/var/temp/nginx/client \--http-proxy-temp-path=/var/temp/nginx/proxy \--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \--http-scgi-temp-path=/var/temp/nginx/scgi

注意:此处将临时文件目录指定为/var/temp/nginx,需要在/var下创建temp及nginx目录,一定要新建这个目录 否则后面无法启动./nginx

步骤四:编译安装

编译:继续上面的目录下(即刚才配置nginx的解压目录下)输入命令 make

安装:继续上面的目录下(即刚才配置nginx的解压目录下)输入命令 make install

步骤五:启动nginx并访问测试成功

启动nginx

cd /usr/local/nginx/sbin/./nginx

注意:执行./nginx启动nginx,这里可以-c指定加载的nginx配置文件,如下:

./nginx -c /usr/local/nginx/conf/nginx.conf

如果不指定-c,nginx在启动时默认加载conf/nginx.conf文件,此文件的地址也可以在编译安装nginx时指定./configure的参数(–conf-path= 指向配置文件(nginx.conf))

查询nginx进程:ps aux|grep nginx,若查到nginx进程,则已经启动成功,如下:

5.2 相关附加操作

附1:关闭nginx

方式1,快速停止:

cd /usr/local/nginx/sbin./nginx -s stop

此方式相当于先查出nginx进程id再使用kill命令强制杀掉进程。

方式2,完整停止(建议使用):

cd /usr/local/nginx/sbin./nginx -s quit

此方式停止步骤是待nginx进程处理任务完毕进行停止。

附2:重启nginx

方式1,先停止再启动(建议使用):

对nginx进行重启相当于先停止nginx再启动nginx,即先执行停止命令再执行启动命令。

如下:

./nginx -s quit./nginx

方式2,重新加载配置文件:

当nginx的配置文件nginx.conf修改后,要想让配置生效需要重启nginx,使用-s reload不用先停止nginx再启动nginx即可将配置信息在nginx中生效,如下:

./nginx -s reload

附3:设置开机自启动nginx(这个建设设置,不用每次启动了)

输入 vi /etc/init.d/nginx 新建编辑文件(输入下面的代码)

#!/bin/bash
# nginx Startup script for the Nginx HTTP Server
# it is v.0.0.2 version.
# chkconfig: - 85 15
# description: Nginx is a high-performance web and proxy server.
#              It has a lot of features, but it's not for everyone.
# processname: nginx
# pidfile: /var/run/nginx.pid
# config: /usr/local/nginx/conf/nginx.conf
nginxd=/usr/local/nginx/sbin/nginx
nginx_config=/usr/local/nginx/conf/nginx.conf
nginx_pid=/var/run/nginx.pid
RETVAL=0
prog="nginx"
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -x $nginxd ] || exit 0
# Start nginx daemons functions.
start() {if [ -e $nginx_pid ];thenecho "nginx already running...."exit 1
fiecho -n $"Starting $prog: "daemon $nginxd -c ${nginx_config}RETVAL=$?echo[ $RETVAL = 0 ] && touch /var/lock/subsys/nginxreturn $RETVAL
}
# Stop nginx daemons functions.
stop() {echo -n $"Stopping $prog: "killproc $nginxdRETVAL=$?echo[ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /var/run/nginx.pid
}
# reload nginx service functions.
reload() {echo -n $"Reloading $prog: "#kill -HUP `cat ${nginx_pid}`killproc $nginxd -HUPRETVAL=$?echo
}
# See how we were called.
case "$1" in
start)start;;
stop)stop;;
reload)reload;;
restart)stopstart;;
status)status $progRETVAL=$?;;
*)echo $"Usage: $prog {start|stop|restart|reload|status|help}"exit 1
esac
exit $RETVAL

输入 :wq 保存并退出

输入 chmod a+x /etc/init.d/nginx 使vi生效

vi /etc/rc.local

加入一行 /etc/init.d/nginx start 保存并退出,下次重启会生效。

成功标志 开机启动后,centos7浏览器上localhost成功(当然最小化安装没有浏览器,桌面安装可以用浏览器看一下)

若是没有成功还是要到 cd /etc/usr/local/nginx/sbin ./nginx 启动

六、尾声

本文先介绍nginx三大功能原理图与配置文件,然后介绍centos7上安装使用nginx,希望对读者有用。

天天打码,天天进步!

Nginx_01_Nginx三大基础功能(静态服务器、虚拟主机、负载均衡/服务端代理)相关推荐

  1. 服务器虚拟主机玩魔域,服务器虚拟主机玩魔域

    服务器虚拟主机玩魔域 内容精选 换一换 主机迁移服务是一种P2V/V2V迁移服务,可以帮您把X86物理服务器或者私有云.公有云平台上的虚拟机迁移到华为云弹性云服务器上,从而帮助您轻松地把服务器上的应用 ...

  2. 【云服务器 ECS 实战】一文掌握负载均衡服务原理及配置方法

    一.负载均衡基本原理概述 协议/端口 轮询策略 会话保持 二.云服务器 ECS 负载均衡相关配置 协议&监听配置 后端服务器配置 健康检查配置 测试 在上期文章中,介绍了负载均衡的概述及优势, ...

  3. svn服务器主机型号,svn服务器虚拟主机

    svn服务器虚拟主机 内容精选 换一换 将云服务器加入云服务器组.添加成功后,该云服务器与云服务器组中的其他成员尽量分散地创建在不同主机上.仅支持添加虚拟化类型为KVM的弹性云服务器.当前只支持反亲和 ...

  4. 虚拟服务器目录,服务器虚拟主机目录

    服务器虚拟主机目录 内容精选 换一换 用户可以在公有云MRS集群以外的节点上使用客户端,在使用客户端前需要安装客户端.如果集群外的节点已安装客户端且只需要更新客户端,请使用安装客户端的用户例如root ...

  5. wdcp服务器/虚拟主机管理系统,wdcp服务器/虚拟主机管理系统1.1发布(最后更新20110423)...

    wdcp服务器/虚拟主机管理系统1.1发布 (最后更新20110423,查看更新日志) wdcp (WDlinux Control Panel) 是一套用PHP开发的Linux服务器管理系统,旨在易于 ...

  6. win2003服务器 虚拟主机安全配置

    win2003服务器 虚拟主机安全配置 注入漏洞.上传漏洞.弱口令漏洞等问题随处可见.跨站***,远程控制等等是再老套不过了的话题.有些虚拟主机管理员不知是为了方便还是不熟悉配置,干脆就将所有的网站都 ...

  7. 搭建虚拟服务器会被封吗,梦幻用云服务器虚拟主机玩会封吗

    梦幻用云服务器虚拟主机玩会封吗 内容精选 换一换 弹性云服务器(Elastic Cloud Server,ECS)是由CPU.内存.操作系统.云硬盘组成的基础的计算组件.弹性云服务器创建成功后,您就可 ...

  8. 梦幻用云服务器虚拟主机玩会封吗,梦幻用云服务器虚拟主机玩会封吗

    梦幻用云服务器虚拟主机玩会封吗 内容精选 换一换 场景描述绑定到云服务器上,实现云服务器连接公网的目的.搭配服务弹性云服务器ECS或裸金属服务器.虚拟私有云绑定云服务器实例场景描述NAT网关通过与弹性 ...

  9. Linux web 网站服务器 虚拟主机

    Linux  web 网站服务器  虚拟主机 转载于:https://blog.51cto.com/daijiehao/1861625

最新文章

  1. [R语言画图]气泡图symbols
  2. 设计模式系列3-----C++实现命令模式(Command Pattern)
  3. 【大数据-Hadoop】dbeaver
  4. php模板如何使用,ThinkPHP如何使用模板
  5. 获取系统信息1——linux系统中的时间
  6. 唯品会2017年双11大促技术保障实践,全域提供25万QPS服务能力
  7. 固态硬盘ps3111开卡工具_固态硬盘必备工具:系统无损迁移、僵尸文件立现原形...
  8. 大数据之-Hadoop3.x_MapReduce_序列化概述---大数据之hadoop3.x工作笔记0094
  9. mysql front 视图_mysql 视图
  10. java drawimage api_HTML5 Canvas API中drawImage()方法的使用实例
  11. php mysql 获取排名,Mysql排序获取排名的实例代码
  12. 机器学习:多变量线性回归
  13. 使用VideoView实现简单视频播放器
  14. C++验证哥德巴赫猜想
  15. jenkins linux虚拟机,Linux虚拟机安装Jenkins并实现部署
  16. 转:Jquery json的超强组合(DataTable2JSON)
  17. 单片机IC卡读取开题报告_基于单片机的IC卡读写器设计(含开题报告)
  18. Windows界面编程第十二篇 位图显示特效 飞入效果与伸展效果
  19. 003.宋浩老师《线性代数》笔记(第二章矩阵)(二)
  20. Ant实现自动打包部署

热门文章

  1. 【每天听见吴晓波-2016-07-04】上海房价未来五年还会翻番
  2. EasyRecovery年中狂欢还没结束,震惊
  3. Java.Net互操作技术介绍
  4. ISLR读书笔记(1)统计学习简介
  5. 计算机编程 寒假项目总结,我的软件工程之路--寒假总结
  6. 图解 Spring 循环依赖,看过之后再也不怕面试被问到了!
  7. No provider available from registry localhost:9090 for service
  8. MWC 2018火热开幕,AI取代手机成主角,华为超越苹果称霸!
  9. 华云大咖说 | 华云数据与数科网维携手共建国产云生态
  10. 数据处理一条龙!这15个Python库不可不知