但这样会涌现新的问题:

用户发送的要求会被发送到哪台做事器?如果是有软件帮助分发,怎么做到只管即便均衡?

对付这些问题的涌现,我们可以用Nginx来办理,除此以外,Nginx还可以帮助我们区分动态做事器和静态做事器。

二 Nginx是什么?

Nginx (engine x) 是一个高性能的Http做事器和反向代理web做事器,同时也供应了IMAP/POP3/SMTP做事。
它可以用做反向代理做事器,邮件做事器,实现负载均衡和动静分离。

nginxhtmlphpNginx RESTful API

稳定性强、丰富的功能集、大略的配置文件和低系统资源的花费,占用内存少,并发能力强。

中国大陆利用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

三 Nginx安装和配置1.利用docker安装Nginx

docker pull daocloud.io/library/nginx:latest

docker images

docker run -d -p 80:80 --name nginx 29

2.Nginx核心配置文件2.1 找到Nginx内部的配置文件

前辈入Nginx容器内部

docker exec -it 容器id bash #进入容器的终端,可以实行一些如ls pwd等一些大略的shell命令

再进入容器的etc/nginx目录下:

将nginx.conf文件的内容复制出来

2.2 nginx.conf文件构造

# 全局块user nginx;worker_processes 1;error_log /var/log/nginx/error.log warn;pid /var/run/nginx.pid;#events块events { worker_connections 1024;}http { include /etc/nginx/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 /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/.conf;}

全局块:

从配置文件开始到 events 块之间的内容,紧张会设置一些影响nginx 做事器整体运行的配置指令,紧张包括配置运行 Nginx 做事器的用户(组)、许可天生的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
worker_processes 1 #这是 Nginx 做事器并发处理做事的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。

events 块:

events 块涉及的指令紧张影响 Nginx 做事器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否许可同时吸收多个网络连接,选取哪种事宜驱动模型来处理连接要求,每个 word process 可以同时支持的最大连接数等。
上述例子就表示每个 work process 支持的最大连接数为 1024. 这部分的配置对 Nginx 的性能影响较大,在实际中该当灵巧配置。

http块:

http模块顾名思义,便是关于http做事要求的配置。
这些配置包括http要求的文件类型(MIME-TYPE)的定义,http要求日志的输出,http连接的超时时长,单连接要求上限的配置。

http块的末了一句#include /etc/nginx/conf.d/.conf ,是指引入了conf.d目录下的以.conf为结尾的配置文件。
我们找到他们。

default.conf内容如下:

server { listen 80; listen [::]:80; server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { root /usr/share/nginx/html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #}}

去掉注释部分

server { listen 80; listen [::]:80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }

将其更换到nginx.conf文件中的include /etc/nginx/conf.d/.conf,然后可以看到http块的内容为:

http { include /etc/nginx/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 /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; server { listen 80; listen [::]:80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }}

http块构造包含:

server块: 每一个Server模块便是一个独立的虚拟主机,每个虚拟的主机可配置不同的域名或IP地址

​ listen:代表nginx监听的端口号

​ Location模块:每一台虚拟主机下可能因要求URI的不同而进行不同的相应,以是对这些不同的要求进行 分组,每一个组可以称为一个location

​ root:将吸收到的要求根据/usr/share/nginx/html去查找静态资源

​ index:默认去上述root里的路径中找到index.html或者index.htm文件

3.利用docker-compose安装nginx,并配置数据卷

根据上一节的剖析,我们知道未来我们须要在nginx容器内部创建不同的的conf文件用来配置nginx,那么可以通过配置数据卷的办法将创建的conf文件放在容器外部。

创建docker-compose.yml文件

version: '3.0'services: nginx: restart: always image: daocloud.io/library/nginx:latest container_name: nginx ports: - 80:80 volumes: - /wang/docker_nginx/conf.d/:/etc/nginx/conf.d

运行docker-compose.yml文件

docker-compose up -d

在数据卷中手动创建conf配置文件

cd /wang/docker_nginx/conf.dvi default.conf

在default.conf文件中输入

server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } }

保存退出

重启docker-compose

docker-compose restart

运行:

四 Nginx常用功能1.Nginx反向代理1.1 什么是代理

代理实在便是一个中介,A和B本来可以直连,中间插入一个C,C便是中介。
刚开始的时候,代理多数是帮助内网client访问外网server用的。

1.2 正向代理

正向代理隐蔽了用户,用户的要求被代理做事器吸收代替,到了做事器,做事器并不知道用户是谁。

比如我们海内访问谷歌,直接访问访问不到,我们可以通过一个正向代理做事器,要求发到代理服,代理做事器能够访问谷歌,这样由代理去谷歌取到返回数据,再返回给我们,这样我们就能访问谷歌了。

正向代理的用场:

(1)访问原来无法访问的资源,如google

​ (2) 可以做缓存,加速访问资源

(3)对客户端访问授权,上网进行认证

(4)代理可以记录用户访问记录(上网行为管理),对外隐蔽用户信息

1.3 反向代理

反向代理(Reverse Proxy)是指以代理做事器来接管internet上的连接要求,然后将要求转发给内部网络上的做事器,并将从做事器上得到的结果返回给internet上要求连接的客户端,此时期理做事器对外就表现为一个做事器。

用户发送要求到做事器,访问的实在是反向代理做事器,用户不知道终极访问的是哪台做事器。

反向代理的浸染:

(1)担保内网的安全,阻挡web攻击,大型网站,常日将反向代理作为公网访问地址,Web做事器是内网

(2)反向代理做事器是配置在做事真个,客户端不知道访问的到底是哪一台做事器

(3)负载均衡,通过反向代理做事器来优化网站的负载

1.4 Nginx怎么实现反向代理1.启动2台tomcat做事器和1个nginx做事器

docker-compose.yml

version: '3.0'services: tomcat_01: restart: always image: daocloud.io/library/tomcat:8.5.16-jre8 container_name: tomcat_01 ports: - 8085:8080 environment: TZ: Asia/Shanghai volumes: - /wang/data/tomcat_01_webapps:/usr/local/tomcat/webapps - /wang/data/tomcat_01_logs:/usr/local/tomcat/logs tomcat_02: restart: always image: daocloud.io/library/tomcat:8.5.16-jre8 container_name: tomcat_02 ports: - 8086:8080 environment: TZ: Asia/Shanghai volumes: - /wang/data/tomcat_02_webapps:/usr/local/tomcat/webapps - /wang/data/tomcat_02_logs:/usr/local/tomcat/logs

在两台做事器根目录下分别创建一个index.html页面,用作测试页面。

测试一下:

启动一个nginx做事器,上一章已启动过

2.修正default.conf文件,配置反向代理

找到nginx数据卷目录中创建的default.conf文件

输入命令 vi default.conf 进入编辑状态

修正内容如下:

server { listen 80; server_name localhost; #利用nginx实现反向代理 当访问 http://42.192.12.30/ 时会转到http://42.192.12.30:8085/下 location /{ proxy_pass http://42.192.12.30:8085/; }}

运行结果:

在tomcat_02做事器上支配swagger项目后

连续修正default.conf文件

server { listen 80; server_name localhost; #利用nginx实现反向代理 当访问 http://42.192.12.30/swagger 时会转到http://42.192.12.30:8086/swagger下 location /swagger{ proxy_pass http://42.192.12.30:8086; } #利用nginx实现反向代理 当访问 http://42.192.12.30/ 时会转到http://42.192.12.30:8085/下 location /{ proxy_pass http://42.192.12.30:8085/; }}

我们输入的网址叫做要求URI,nginx用要求URI与location中配置的URI做匹配。

比如我们要求的URI是:http://42.192.12.30/swagger/swagger-ui.html

根据配置文件,当要求主机是http://42.192.12.30 代表进入了Nginx,当路径中有/swagger代表进入了location /swagger,也便是会访问http://42.192.12.30:8086,后面加上相对路径swagger/swagger-ui.html

1.5 nginx中的location指令

location是Nginx中的块级指令(block directive),,location指令的功能是用来匹配不同的url要求,进而对要求做不同的处理和相应。

1.语法规则

2.优先级首先精确匹配 =其次前缀匹配 ^~其次是按文件中顺序的正则匹配然后匹配不带任何润色的前缀匹配末了是交给 / 通用匹配当有匹配成功时候,停滞匹配,按当前匹配规则处理要求

匹配的时候依照最佳匹配规则,按照能匹配到的最多的规则进行匹配。
如 location ^~ /user/add/ 和 location ^~ /user/,要求 http://localhost/user/add/1.html,会匹配location ^~ /user/add/

3.绝对路径和相对路径

绝对路径

location /reg{ proxy_pass http://42.192.12.30:8085/;}

当访问 http://127.0.0.1/reg 时,nginx匹配到/reg路径,把要求转发给42.192.12.30:8085做事,实际要求路径为http://42.192.12.30:8085,nginx会去掉匹配的“/reg”。

相对路径

location /reg { proxy_pass http://42.192.12.30:8085;}

当访问http://127.0.0.1/reg 时,nginx匹配到/reg路径,把要求转发给42.192.12.30:8085做事,实际要求代理做事器的路径为http://42.192.12.30:8085/reg, 此时nginx会把匹配的“/reg”也代理给代理做事器。

3.示例

location = / {#规则A}location = /login {#规则B}location ^~ /static/ {#规则C 匹配任何以 /static/ 开头的查询并且停滞搜索。
任何正则表达式将不会被测试}location ~ \.(gif|jpg|png|js|css)$ {#规则D}location ~ \.png$ {#规则E}location !~ \.js$ {#规则F}location !~ \.js$ {#规则G}location / {#规则H}访问根目录/, 比如http://localhost/ 将匹配规则A访问 http://localhost/login 将匹配规则 B,http://localhost/register 则匹配规则H访问 http://localhost/static/a.html 将匹配规则C访问 http://localhost/b.png 将匹配规则D和规则E,但是规则D顺序优先,规则E不起浸染访问 http://localhost/static/c.png 将匹配规则C,D和规则E,但优先匹配到规则C访问 http://localhost/a.PNG 则匹配规则E, 而不会匹配规则D,由于规则E不区分大小写。
访问 http://localhost/index.js 不会匹配规则F和规则G访问 http://localhost/index.JS 不会匹配规则G,由于不区分大小写。
规则F,规则G属于打消法,符合匹配规则但是不会匹配到。
访问 http://localhost/goods/id/1 则终极匹配到规则H,由于以上规则都不匹配。
2 Nginx负载均衡

Nginx实现负载均衡的策略包含自带的三种策略和第三方供应的插件办法。

自带的三种策略为:

2.1、轮询办法(默认)

每个要求按韶光顺序逐一分配到不同的后端做事器,如果后端做事器down掉,能自动剔除。

修正default.conf文件

upstream server-list{ server 42.192.12.30:8085; server 42.192.12.30:8086;}server { listen 80; server_name localhost; location /{ proxy_pass http://server-list/; }}

upstream模块里面包含了一组upstream做事器,upstream做事器是指上游做事器,也便是nginx所代理的后端做事器。
这些做事器可能被授予了不同的权重、不同的类型乃至可以基于掩护等缘故原由被标记为down。

重启nginx做事器测试

​ 结果如下:两个做事器交流。

2.2、指定权重

指定轮询几率,weight和访问比率成正比,也便是权重越高,被分配的几率越大,用于后端做事器性能不均的情形。

修正default.conf文件

upstream server-list{ server 42.192.12.30:8085 weight=6; server 42.192.12.30:8086 weight=2;}server { listen 80; server_name localhost; location /{ proxy_pass http://server-list/; }}2.3、IP绑定 ip_hash

每个要求按访问ip的hash结果分配,这样每个访客固定访问一个后端做事器,可以办理session共享的问题。

修正default.conf文件

upstream server-list{ ip_hash; server 42.192.12.30:8085 weight=6; server 42.192.12.30:8086 weight=2;}server { listen 80; server_name localhost; location /{ proxy_pass http://server-list/; }}

相同ip 进入的是同一台做事器。

3 Nginx动静分离

之前我们讲过动静分离构造,便是将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台运用分开。
那么支配的时候呢?

支配的时候也该当分开支配,这样可以提高用户访问静态代码的速率,降落对后台运用访问。

比如我们可以将静态资源放到nginx中,动态资源转发到tomcat做事器中。

修正docker-compose.yml文件

添加静态文件数据卷:

version: '3.0'services: nginx: restart: always image: daocloud.io/library/nginx:latest container_name: nginx ports: - 80:80 volumes: - /wang/docker_nginx/conf.d/:/etc/nginx/conf.d - /wang/docker_nginx/static/:/static #设置nginx根目录下的static文件夹对应到/wang/docker_nginx/static目录

修正conf.d目录下的default.conf文件:

配置静态资源路径

upstream server-list{ ip_hash; server 42.192.12.30:8085 weight=6; server 42.192.12.30:8086 weight=2;}server { listen 80; server_name localhost; location /html{ root /static; # 根目录下的static对应的是/wang/docker_nginx/static index index.html index.htm; } location /js{ root /static; # 根目录下的static对应的是/wang/docker_nginx/static autoindex on; } location /{ proxy_pass http://server-list/; }}

测试:

docker-compose down

docker-compose up -d