nginx下载安装
1、windows版
下载后解压 nginx-1.24.0.zip
配置环境变量
新建变量名:NGINX_HOME,变量名设置为:
nginx的根目录
。
将新建的变量名引入到系统变量 Path 中,变量值:
%变量名%
。
验证:nginx -v
2、window版命令
在命令行窗口内,输入 start nginx,启动nginx
start nginx
在浏览器访问本机80端口: http://localhost/
关闭nginx,输入关闭命令:nginx -s quit
nginx -s quit
再次访问本地端口http://localhost:80,就会无法访问
如果修改配置文件后,重新加载配置文件并重启
重新加载命令:nginx -s reload
关闭nginx服务使用以下命令,同样也是一闪而过是正常的,看一下是否进程已消失即可
快速停止命令:nginx -s stop
完整有序的关闭命令:nginx -s quit
-s 表示给nginx进程发送信号,包含stop(停止)、reload(重新加载)
如果无法结束进程,管理员身份杀掉所有nginx进程:taskkill /im nginx.exe -f
tasklist /fi "imagename eq nginx.exe"
查看nginx是否启动
tasklist /fi "imagename eq nginx.exe"
3、linux版
下面这些步骤我自己并没有用,我的是离线安装的。因为我有老师发送的压缩包的,没测试过下面可行不可行,对了,安装nginx之前一定要拍好快照。
第一步,安装pcre
第一步 联网下载pcre
wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz
第二步 解压压缩文件
使用命令 tar -zxvf pcre-8.37.tar.gz
第三步 ./configure完成后,回到pcre目录下执行make,最后执行make install
第四步 pcre-config --version 检查版本
第二步,安装openssl 、zlib 、 gcc 依赖
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
第三步,安装nginx
使用命令解压
./configure
make && make install
进入目录 /usr/local/nginx/sbin 执行./nginx 启动服务
第四步,关闭防火墙,访问nginx
进入目录 /usr/local/nginx/sbin 执行./nginx 启动服务
测试:在物理机浏览器输入 http://192.168.2.108/
4、linux版命令
1)启动命令
在/usr/local/nginx/sbin目录下执行 ./nginx
2)关闭命令
在/usr/local/nginx/sbin目录下执行 ./nginx -s stop
3)重新加载命令
在/usr/local/nginx/sbin目录下执行
./nginx -s reload
4)查看版本
./nginx -v
nginx.conf
1、目录结构
conf目录:存放和nginx配置相关的配置文件。分为三类
cgi:直译:通用网关接口,是一种标准规范
mime.types:
2、nginx模块
nginx服务器被分解为多个模块,模块之间严格遵守“高内聚,低耦合”的原则,每个模块都聚焦于一个功能。高度模块化的设计是nginx的架构基础。
什么是nginx模块呢?在nginx的实现中,一个模块包含一系列命令(cmd)和这些命令相对应的处理函数(cmd->handler)。nginx的worker进程在执行过程中会通过配置文件的配置指令定位到对应的功能模块的某个命令(cmd),然后调用命令对应的处理函数来完成相应的处理。
一个nginx配置文件包含若干配置项,每个配置项由配置指令和指令参数俩部分组成,可以简单认为配置项是一个键值对。
nginx配置文件中的配置指令如果包含空格,就需要用单引号或双引号引起来。
- 指令参数如果是由简单的字符串构成的,简单配置项就需要以分号结束;
- 指令参数如果是复杂的多行字符串,配置项就需要用花括号“{}”括起来。
3、全局块
nginx 安装目录(/usr/local/nginx/conf/nginx.conf)下,其默认的配置文件都放在这个目录的 conf 目录下,而主配置文件 nginx.conf 也在其中,后续对 nginx 的使用基本上都是对此配置文件进行相应的修改。
将 nginx.conf 配置文件分为三部分:全局块 events块 http块
全局块 从配置文件开始到 events 块之间的内容。
主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
#安全问题,建议用nobody,不要用root.
#user nobody;
#worker数和服务器的cpu数相等是最为适宜
worker_processes 2;
#work绑定cpu(4 work绑定4cpu)
worker_cpu_affinity 0001 0010 0100 1000
#work绑定cpu (4 work绑定8cpu中的4个) 。
worker_cpu_affinity 0000001 00000010 00000100 00001000
#error_log path(存放路径) level(日志等级) path表示日志路径,level表示日志等级,
#具体如下:[ debug | info | notice | warn | error | crit ]
#从左至右,日志详细程度逐级递减,即debug最详细,crit最少,默认为crit。
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
4、events块
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。
events {
#这个值是表示每个worker进程所能建立连接的最大值,所以,一个nginx能建立的最大连接数,应该是worker_connections * worker_processes。
#当然,这里说的是最大连接数,对于HTTP请求本地资源来说,能够支持的最大并发数量是worker_connections * worker_processes,
#如果是支持http1.1的浏览器每次访问要占两个连接,
#所以普通的静态访问最大并发数是: worker_connections * worker_processes /2,
#而如果是HTTP作为反向代理来说,最大并发数量应该是worker_connections * worker_processes/4。
#因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。
worker_connections 1024;
#这个值是表示nginx要支持哪种多路io复用。
#一般的Linux选择epoll, 如果是(*BSD)系列的Linux使用kquene。
#windows版本的nginx不支持多路IO复用,这个值不用配。
use epoll;
# 当一个worker抢占到一个链接时,是否尽可能的让其获得更多的连接,默认是off 。
multi_accept on; //并发量大时缓解客户端等待时间。
# 默认是on ,开启nginx的抢占锁机制。
accept_mutex on; //master指派worker抢占锁
}
5、http 块
http块是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
http 块也可以包括
------------------------------------------------
http全局块
http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
server块
每个 http 块可以包括多个 server 块,而每个 server 块也分为全局 server 块,以及可以同时包含多个 location 块。
# 开头的表示注释内容,我们去掉所有以 # 开头的段落,精简之后的内容如下:
# nginx进程数:worker_processes 值越大,可以支持的并发处理量也越多 worker_processes 1; events { # 表示每个work process 支持的最大连接数为 1024 worker_connections 1024; } http { include mime.types;#文件扩展名与文件类型映射表 default_type application/octet-stream; sendfile on;#开启高效文件传输模式 keepalive_timeout 65;#长连接超时时间,单位是秒 server { listen 80;#监听端口 server_name localhost; #对 “/” 启用反向代理 location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
6、server 块
每一个http块可以包含多个server块,server 块 也分为全局 server 块,多个 location 块
全局 server 块
全局 server块:最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。
listen : 指定服务器侦听请求的IP地址和端口
server_name主要用于区分,名字可以随便起。如果多个server的端口重复,那么根据域名或者主机名进行选择
多个location 块
一个 server 块可以配置多个 location 块。 location 块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是IP别名)之外的字符串(例如 前面的 /uri-string)进行匹配, 对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
location 块后面一个"/",表示访问80端口下的根目录,就走到对应location块的配置。
location / 通用匹配,任何未匹配到其它 location 的请求都会匹配到,相当于 switch 中的 default。
7、nginx.conf 配置文件详解
http {
#当web服务器收到静态的资源文件请求时,依据请求文件的后缀名在服务器的MIME配置文件中找到对应的MIME Type,再根据MIME Type设置HTTP Response的Content-Type,然后浏览器根据Content-Type的值处理文件。
include mime.types; #/usr/local/nginx/conf/mime.types
#如果 不能从mime.types找到映射的话,用以下作为默认值-二进制
default_type application/octet-stream;
#日志位置
access_log logs/host.access.log main;
#一条典型的accesslog:
#101.226.166.254 - - [21/Oct/2013:20:34:28 +0800] "GET /movie_cat.php?year=2013 HTTP/1.1" 200 5209 "http://www.baidu.com" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MDDR; .NET4.0C; .NET4.0E; .NET CLR 1.1.4322; Tablet PC 2.0); 360Spider"
#1)101.226.166.254:(用户IP)
#2)[21/Oct/2013:20:34:28 +0800]:(访问时间)
#3)GET:http请求方式,有GET和POST两种
#4)/movie_cat.php?year=2013:当前访问的网页是动态网页,movie_cat.php即请求的后台接口,year=2013为具体接口的参数
#5)200:服务状态,200表示正常,常见的还有,301永久重定向、4XX表示请求出错、5XX服务器内部错误
#6)5209:传送字节数为5209,单位为byte
#7)"http://www.baidu.com":refer:即当前页面的上一个网页
#8)"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; #.NET CLR 3.0.30729; Media Center PC 6.0; MDDR; .NET4.0C; .NET4.0E; .NET CLR 1.1.4322; Tablet PC 2.0); 360Spider": agent字段:通常用来记录操作系统、浏览器版本、浏览器内核等信息
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#开启从磁盘直接到网络的文件传输,适用于有大文件上传下载的情况,提高IO效率。
sendfile on; //大文件传递优化,提高效率
#一个请求完成之后还要保持连接多久, 默认为0,表示完成请求后直接关闭连接。
#keepalive_timeout 0;
keepalive_timeout 65;
#开启或者关闭gzip模块
#gzip on ; //文件压缩,再传输,提高效率
#设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。
#gzip_min_lenth 1k;//超过该大小开始压缩,否则不用压缩
# gzip压缩比,1 压缩比最小处理速度最快,9 压缩比最大但处理最慢(传输快但比较消耗cpu)
#gzip_comp_level 4;
#匹配MIME类型进行压缩,(无论是否指定)"text/html"类型总是会被压缩的。
#gzip_types types text/plain text/css application/json application/x-javascript text/xml
#动静分离
#服务器端静态资源缓存,最大缓存到内存中的文件,不活跃期限
open_file_cache max=655350 inactive=20s;
#活跃期限内最少使用的次数,否则视为不活跃。
open_file_cache_min_uses 2;
#验证缓存是否活跃的时间间隔
open_file_cache_valid 30s;
upstream myserver{
# 1、轮询(默认)
# 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
# 2、指定权重
# 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
#3、IP绑定 ip_hash
# 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
#4、备机方式 backup
# 正常情况不访问设定为backup的备机,只有当所有非备机全都宕机的情况下,服务才会进备机。当非备机启动后,自动切换到非备机
# ip_hash;
server 192.168.161.132:8080 weight=1;
server 192.168.161.132:8081 weight=1 backup;
#5、fair(第三方)公平,需要安装插件才能用
#按后端服务器的响应时间来分配请求,响应时间短的优先分配。
#6、url_hash(第三方)
#按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
# ip_hash;
server 192.168.161.132:8080 weight=1;
server 192.168.161.132:8081 weight=1;
#fair
#hash $request_uri
#hash_method crc32
}
server {
#监听端口号
listen 80;
#服务名
server_name 192.168.161.130;
#字符集
#charset utf-8;
#location [=|~|~*|^~] /uri/ { … }
# = 精确匹配
# ~ 正则匹配,区分大小写
# ~* 正则匹配,不区分大小写
# ^~ 关闭正则匹配
#匹配原则:
# 1、所有匹配分两个阶段,第一个叫普通匹配,第二个叫正则匹配。
# 2、普通匹配,首先通过“=”来匹配完全精确的location
# 2.1、 如果没有精确匹配到, 那么按照最大前缀匹配的原则,来匹配location
# 2.2、 如果匹配到的location有^~,则以此location为匹配最终结果,如果没有那么会把匹配的结果暂存,继续进行正则匹配。
# 3、正则匹配,依次从上到下匹配前缀是~或~*的location, 一旦匹配成功一次,则立刻以此location为准,不再向下继续进行正则匹配。
# 4、如果正则匹配都不成功,则继续使用之前暂存的普通匹配成功的location.
#不是以波浪线开头的都是普通匹配。
location / { # 匹配任何查询,因为所有请求都以 / 开头。但是正则表达式规则和长的块规则将被优先和查询匹配。
#定义服务器的默认网站根目录位置
root html;//相对路径,省略了./ /user/local/nginx/html 路径
#默认访问首页索引文件的名称
index index.html index.htm;
#反向代理路径
proxy_pass http://myserver;
#反向代理的超时时间
proxy_connect_timeout 10;
proxy_redirect default;
}
#普通匹配
location /images/ {
root images ;
}
# 反正则匹配
location ^~ /images/jpg/ { # 匹配任何以 /images/jpg/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。
root images/jpg/ ;
}
#正则匹配
location ~*.(gif|jpg|jpeg)$ {
#所有静态文件直接读取硬盘
root pic ;
#expires定义用户浏览器缓存的时间为3天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力
expires 3d; #缓存3天
}
#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 html;
}
}
}
8、nginx格式化工具
使用VS Code 的nginx格式化插件
https://marketplace.visualstudio.com/items?itemName=ahmadalli.vscode-nginx-conf
https://marketplace.visualstudio.com/items?itemName=raynigon.nginx-formatter
VS安装插件后,将nginx配置文件复制到VS Code,右键“Format Document”,第一次使用的时候选择刚才安装的nginx-formatter插件,即可完美格式化nginx.conf。
location指令
nginx每个location都是一个匹配目录,nginx的策略是:访问请求来时,会对访问地址进行解析,从上到下逐个匹配,匹配上就执行对应location大括号中的策略,并根据策略对请求作出相应。
location没有’/’
请求就可以模糊匹配以字符串开头的所有字符串。
举例:没有“/”结尾时,location /abc/def 可以匹配 /abc/defghi 请求,也可以匹配 /abc/def/ghi 等
location有’/’
只能精确匹配字符本身。
举例:有“/”结尾时,location /abc/def/ 不能匹配 /abc/defghi 请求,只能匹配 /abc/def/anything 这样的请求
location [=|~|~*|^~]
location 块通过指定模式来与客户端请求的URI相匹配。
#location [=|~|~*|^~] /uri/ { … }
location匹配顺序
nginx有两层指令来匹配请求 URI 。第一个层次是 server 指令,它通过域名、ip 和端口来做第一层级匹配,当找到匹配的 server 后就进入此 server 的 location 匹配。
location 的匹配并不完全按照其在配置文件中出现的顺序来匹配,请求URI 会按如下规则进行匹配:
- 先精准匹配
=
,精准匹配成功则会立即停止其他类型匹配;- 没有精准匹配成功时,进行前缀匹配。先查找带有
^~
的前缀匹配,带有^~
的前缀匹配成功则立即停止其他类型匹配,普通前缀匹配(不带参数^~
)成功则会暂存,继续查找正则匹配;=
和^~
均未匹配成功前提下,查找正则匹配~
和~*
。当同时有多个正则匹配时,按其在配置文件中出现的先后顺序优先匹配,命中则立即停止其他类型匹配;- 所有正则匹配均未成功时,返回步骤 2 中暂存的普通前缀匹配(不带参数
^~
)结果优先级从高到低依次为(序号越小优先级越高):
1. location = # 精准匹配 2. location ^~ # 带参前缀匹配 3. location ~ # 正则匹配(区分大小写) 4. location ~* # 正则匹配(不区分大小写) 5. location /a # 普通前缀匹配,优先级低于带参数前缀匹配。 6. location / # 任何没有匹配成功的,都会匹配这里处理
proxy_pass加不加'/'
若proxy_pass 后加’/',代表去除掉请求和 location 的匹配的字符串。
不加 ’ / ’ 则追加全部请求到地址后面。
----------------------------------------------------------------------
案例 localtion proxy_pass 匹配
1 /frx http://192.168.199.27 /frx/xu
2 /frx/ http://192.168.199.27 /frx/xu
3 /frx http://192.168.199.27/ //xu
4 /frx/ http://192.168.199.27/ /xu
------------------------------------------------------------------------------------------------------
案例 localtion proxy_pass 匹配
1 /frx http://192.168.199.27/bing /bing/xu
2 /frx/ http://192.168.199.27/bing /bingxu
3 /frx http://192.168.199.27/bing/ /bing//xu
4 /frx/ http://192.168.199.27/bing/ /bing/xu
nginx反向代理
1、正向代理
相同点
正向代理和反向代理所处的位置都是客户端和真实服务器之间,
所做的事情也都是把客户端的请求转发给服务器,再把服务器的响应转发给客户端。
不同点:
正向代理服务器,客户端需要知道目标服务器的地址,比如和ip和端口。
反向代理服务器,最大特点是客户端不知道目标服务器地址,只需要将反向代理当作目标服务器一样发送请求就可以了
正向代理是对客户端的伪装,隐藏了客户端的ip、头部、或者其他信息,服务器得到的是伪装过的客户端信息;
举例如:科学上网
PC需要设置正向代理服务器的ip和端口
用户想要访问某国外网站,该网站无法在国内直接访问,但是我们可以访问到一个代理服务器,这个代理服务器可以访问到这个国外网站。 这样呢,用户对该国外网站的访问就需要通过代理服务器来转发请求,并且该代理服务器也会将请求的响应再返回给用户。这个上网的过程就是用到了正向代理。
可以隐藏客户端真实ip:上网者可以通过正向代理的方法隐藏自己的ip,免受攻击
反向代理是对目标服务器的伪装,隐藏了目标服务器的ip、头部、或者其他信息,客户端得到的是伪装过的目标服务器信息
负载均衡:反向代理服务器可以做负载均衡,根据所有真实服务器的负载情况,将客户端请求分发到不同的真实服务器上
2、Hosts文件
Hosts文件模拟域名
c:/windows/system32/drivers/etc/hosts
复制文件到桌面,再主动修改
任何空白地方,都可以写
注意:ip在前 ,域名在后,中间有个空格。
结果再次访问http://www.123.com/
一个修改hosts文件的工具
SwitchHosts官网
SwitchHosts 可以帮助快速切换不同的 hosts 设置、编辑 hosts 文件
3、反向代理(基础版)
需求:使用nginx反向代理,达到访问 www.123.com ,直接跳转到 linux的地址:8080【中间是nginx代理,8080是tomcat的端口号】
1、在liunx系统安装tomcat,使用默认端口8080。
重命名为tomcat8080
进入tomcat的bin目录中,./startup.sh启动tomcat服务器
测试tomcat好用不:
4、配置代理注意事项
在 nginx 中配置 proxy_pass 代理转发时,
proxy_pass 代理规则(是否以“/”结尾)
(1)如果在 proxy_pass 后面的 url 加 /,表示绝对根路径,不会把 location 中匹配的路径部分加入代理 uri。
(2)如果配置 proxy_pass 时,后面没有 /,表示相对路径,Nginx 则会把匹配的路径部分加入代理 uri。
在 nginx.conf 配置文件中增加如下配置, 然后重新加载配置文件
浏览器直接访问ngnix
5、反向代理(加强版)
访问 http://nginx的ip:9000/edu/ 直接跳转到127.0.0.1:8080
访问 http://nginx的ip:9000/vod/ 直接跳转到127.0.0.1:8081
在tomcat8080的webapps目录下创建edu目录,再在edu目录中创建index.html页面,重启tomcat8080。
浏览器访问测试:
在tomcat8081(对tomcat8080复制后并改里面的server.xml中的端口号有3处)的webapps目录下创建vod目录,再在vod录中创建index.html页面,重启tomcat8081。
浏览器访问测试:
此时我们再加入nginx代理
修改/usr/local/nginx/conf/nginx.conf
由于在使用同一个主机同一个端口。所以配置在一个server块中,每个 server 块就相当于一个虚拟主机
在 nginx 中配置 proxy_pass 代理转发时,如果在 proxy_pass 后面的 url 加 /,表示绝对根路径;如果没有 /,表示相对路径,把匹配的路径部分也给代理走。
在浏览器测试:就实现了我们最终的效果
6、代理IP
//在中间没有代理的情况下,的确是最简单有效的方式
//在有反向代理的情况下,直接使用request.getRemoteAddr()获取到的IP地址是Nginx所在服务器的IP地址,而不是客户端的IP
request.getRemoteAddr()
这里通过 Nginx 来部署反向代理:
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
X-Forwarded-For 是一个扩展头,用来表示 HTTP 请求端真实 IP
X-Forwarded-For协议头的格式:
X-Forwarded-For: client, proxy1, proxy2
可以看到,XFF 的内容由「英文逗号 + 空格」隔开的多个部分组成,最开始的是离服务端最远的设备 IP,然后是每一级代理设备的 IP。
不同类型的代理有不同的目的,
对于正向代理来说主要是为了加速并且让局域网的用户有一个真实的 IP 地址,
而透明代理则主要是为了一些其他的目的(比如就是不想让别人知道我的 IP),
而反向代理主要是企业内部安全和负载均衡考虑,
nginx负载均衡
1、nginx负载均衡
反向代理为基础产生了动静资源分离以及负载均衡的方式,减轻 web 服务器的负担,加速了对网站访问速度。
负载均衡(load balance)是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验.
浏览器地址栏输入地址 http://192.168.2.108/edu/a.html,负载均衡效果,将请求平均分配到8080和8081两台服务器上。
1、在tomcat8080和tomcat8081里面的webapps目录中,分别创建名称是edu文件夹,在edu文件夹中创建页面a.html(让a.html内容不一样,查看效果),用于测试
2、在nginx.conf中配置上游服务器,tomcat集合信息
- 注意上游服务器的位置,刚开始我就写在server块里了。
- myserver这个名字是任意的,为了在下面配置代理的时候使用
在物理机的浏览器测试,测试发现是默认的轮询机制
8080和8081部署了相同的项目,可以做到对客户端高并发限流
第一次访问:
第二次访问
2、默认轮询
负载均衡默认策略:轮询(最常用、最合理)
每个请求按时间顺序逐一分配到不同的后端服务器,(转发请求)
如果后端服务器down掉,能自动剔除。(管理应用服务器)
3、权重比
原因:这些服务器性能可能不一样
weight代表权重,默认为1,权重越高被分配的客户端越多
在上游服务器中,指定轮询几率(配置权重)
测试:虽然干预了权重比,还有默认的轮询方案
测试:看的出现在是有权重的轮询
![]()
4、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的跨域问题
在上游服务器中,加上ip_hash;
测试:实现了每个访客固定访问一个后端服务器
nginx 动静分离
在 Web 开发中,通常来说,动态资源其实就是指那些后台资源,而静态资源就是指 HTML,JavaScript,CSS,img 等文件。
1、动静分离的理论实现
反向代理为基础产生了动静资源分离以及负载均衡的方式,减轻 web 服务器的负担,加速了对网站访问速度。
动静分离:可以把动态页面和静态页面由不同的服务器来解析,加快解析速 度。降低原来单个服务器的压力。
将静态资源部署在 Nginx 上,当一个请求来的时候,如果是静态资源的请求,就直接到 nginx 配置的静态资源目录下面获取资源,如果是动态资源的请求,nginx 利用反向代理的原理,把请求转发给后台应用去处理,从而实现动静分离
实现有2种方式:
方式一:纯粹的把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;方式二:将动态跟静态文件混合在一起发布,通过 nginx 来分开,但是动态资源和静态资源放在同一个服务器
2、准备静态资源
3、动静分离核心配置
在nginx.conf的server块中
通过 “location 定位”指定不同的后缀名实现不同的请求转发
测试静态资源:这也是索引目录的好处,注意一定要在最后边加“/”
你也可以直接访问静态资源,如a.html
http://192.168.2.108/image/2.jpg 也可以访问咱的图片资源
访问tomcat中的jsp
如果开启反向代理,访问tomcat动态资源jsp,jsp中引用的静态资源可以从nginx服务器中进行加载。
在tomcat 8080下的webapps/edu/创建index.jsp,文件内容如下:
在浏览中去访问:http://192.168.2.108/edu/index.jsp
如果是轮询机制的话,会一次有,一次没。因为我们只在tomcat8080下部署了
nginx原理与优化参数配置
1、master-workers机制
nginx 后台进程包含一个master进程和多个worker进程。
- 客户端发送请求,master进程发现活来了,会释放信号,给下面的worker进程
- 只有worker进程才有能力和客户端产生连接,处理请求,实现请求转发。
Reactor模型中会维护一个运行循环(run-loop),主要包括事件收集、事件分发、事件处理,这个工作在nginx中由core核心模块负责
事件收集器:负责收集Worker进程的各种IO请求
事件发送器:负责将IO事件发送到事件处理器
事件处理器:负责各种事件的响应工作
所以真正工作的是worker。但是,这个请求并不是由worker直接拿到的。
nginx 的能力取决于worker的数量
master-workers的机制的好处
1、对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。
2、采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程。
3、worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。
2、设置多少个worker
nginx 同redis类似都采用了io多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。每个worker的线程可以把一个cpu的性能发挥到极致。
所以worker数和服务器的cpu数相等是最为适宜的。设少了会浪费cpu,设多了会造成cpu频繁切换上下文带来的损耗
#设置worker数量 worker_processes 4 #work绑定cpu(4 work绑定4cpu)。 worker_cpu_affinity 0001 0010 0100 1000 #work绑定cpu (4 work绑定8cpu中的4个) 。 worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000
3、计算连接数
最大连接数: worker数量* 1024
最大并发数量:
- 静态资源请求(最大连接数/2)
- 动态请求(最大连接数/4)
- 请求包含动态和静态资源 占用6个连接
对于HTTP请求本地资源来说,能够支持的最大并发数量是worker_connections * worker_processes。
如果是支持http1.1的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是: worker_connections * worker_processes /2,
而如果是HTTP作为反向代理来说,最大并发数量应该是worker_connections * worker_processes/4。
因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。
面试题:
第一个:发送请求,占用了woker的几个连接数?
1.客户端发送静态资源请求 占用2个连接
4个worker进程
1个worker进程 1024个连接
4*1024=4096
普通的静态访问最大并发数是: worker_connections * worker_processes /2
2.客户端发送动态资源请求 占用4个连接
HTTP作为反向代理来说,最大并发数量应该是worker_connections * worker_processes/4。
4*1024=4096
3.客户端发送的请求包含动态和静态资源 占用6个连接第二个:nginx有一个master,有四个woker,每个woker支持最大的连接数1024,支持的最大并发数是多少?
4*1024=4096