Nginx
一、概述
1. 什么是 nginx
Nginx 是高性能的 HTTP和反向代理的服务器,处理高并发能力是十分强大的,能经受高负载的考验。
2. 正向代理:客户端 <一> 代理 一>服务端
是一个位于客户端和原始服务器(originserver)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
- 正向代理的用途:
- 访问原来无法访问的资源,如内网环境资源;
- 可以做缓存,加速访问资源
- 客户端访问授权,上网进行认证
- 记录用户访问记录(上网行为管理),对外隐藏用户信息
3. 反向代理:客户端 一>代理 <一> 服务端
以暴露代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
客户端是无感知代理的存在的,反向代理对外都是透明的,访问者者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。
- 反向代理的作用:
- 保证内网的安全,阻止web攻击。
- 隐藏后端服务器的信息,屏蔽黑名单中的 IP。
- 负载均衡,通过反向代理服务器来优化网站的负载
- 提高可扩展性和灵活性。客户端只能看到反向代理服务器的IP,可以增减服务器或者修改它们的配置。
- 缓存、静态(HTML/CSS/JS)内容直接返回。
总结理解
区别
-
自我理解
正向代理是客户端的,客户端需要配置才可以使用正向代理,是通过代理服务器访问另一个服务器,类似跳板机。即真正被访问的服务器不知道谁真正请求了自己,只清楚代理服务器。
反向代理是服务端的,即客户端不清楚自己具体访问哪一台服务器,只知道代理服务器。
从不同角度看而已。类似支付宝付款码支付(被扫)和扫码支付(主扫)。 -
图示
正向代理中,proxy和client同属一个LAN,对server透明(server不知道谁访问了你)
反向代理中,proxy和server同属一个LAN,对client透明(client不知道访问的具体是谁)
4. 负载均衡
增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,即为负载均衡。
5. 动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
二、linux安装Nginx
yum安装
- 添加源
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
- 安装Nginx
通过yum search nginx看看是否已经添加源成功。如果成功则执行下列命令安装Nginx。
yum install -y nginx
- 启动Nginx并设置开机自动运行
systemctl start nginx.service
systemctl enable nginx.service
-
测试效果
-
查看安装目录
rpm -ql nginx
基本命令
1、查看 nginx 版本号
./nginx -v
nginx -v
2、启动 nginx
./nginx
systemctl start nginx.service
3、停止 nginx
./nginx -s stop
systemctl stop nginx.service
4、重新加载 nginx
./nginx -s reload
5、重启 nginx
systemctl restart nginx.service
6、其他命令
//设置开机自启动
systemctl enable nginx.service
//停止开机自启动
systemctl disable nginx.service
//查看状态
systemctl status nginx.service
ps -ef | grep nginx
//检验配置文件
./nginx -t
三、Nginx配置文件-
nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
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;
}
第一部分:全局块-配置服务器整体运行的配置指令
比如 worker_processes 1;
处理并发数的配置,值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。
第二部分:events块-影响 Nginx 服务器与用户的网络连接
比如 worker_connections 1024; 支持的最大连接数为 1024;
部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
第三部分:http块☆-套娃完事
- http 全局块
http 全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等。 - server 块
与虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的(就是套娃)。
每个 http 块可以包括多个 server 块,而每个server块就相当于一个虚拟主机。
而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。- 全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。 - location 块
一个 server 块可以配置多个 location 块。这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如前面的/uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
- 全局 server 块
location 指令说明
用于匹配 URL。
语法:
location [=|~|~*|^~] /uri/ {
…
}
1、= :表示精确匹配,用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
2、~:正则匹配,用于表示 uri 包含正则表达式,并且区分大小写。
3、~*:正则匹配,用于表示 uri 包含正则表达式,并且不区分大小写。
4、^~:前缀匹配(优先于正则匹配),用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
5、/:通用匹配, 如果没有其它匹配,任何请求都会匹配到
注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。
. : 匹配除换行符以外的任意字符
? : 重复0次或1次
+ : 重复1次或更多次
* : 重复0次或更多次
\d :匹配数字
^ : 匹配字符串的开始
$ : 匹配字符串的介绍
{n} : 重复n次
{n,} : 重复n次或更多次
[c] : 匹配单个字符c
[a-z] : 匹配a-z小写字母的任意一个
匹配顺序
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
(location `=` ) > (location `完整路径` ) > (location `^~` 路径) > (location `~`,`~*` 从上向下正则顺序,匹配在最后一条终止) > (location 部分起始路径) > (`/`)
- 注意事项:
1.nginx匹配顺序是先匹配普通location,在匹配正则location;
2.普通匹配规则无顺序无论写在配置文件的那个地方都一样,但是正则匹配则是按照匹配配置文件中由上到下的先后顺序匹配;
细节
- 正则location
~ 和 ~:
“~”表示区分大小写;
“~”表示不区分大小写 - 普通location
除了上面其余全是(包括没有前缀) “=”,“^~”,“@”
^~ 中的“^”表示非;
“~”表示正则,意思为不要继续匹配正则;
“=”也表示阻止正则location;
“~”的区别为:“~”依然遵守“最大前缀”匹配;而“=”必须是严格匹配。
“@ ”是用来定义“Named Location ”的(可以理解为独立于“普通location”和“正则location”之外的第三种类型),这种“Named Location ”不是用来处理普通的HTTP 请求的,它是专门用来处理“内部重定向(internally redirected )”请求的。
注意:这里说的“内部重定向(internally redirected )”是不需要跟浏览器交互的,纯粹是服务端的一个转发行为。
参考博文:
https://www.cnblogs.com/sign-ptk/p/6723048.html
https://www.jianshu.com/p/38810b49bc29
第三、负载均衡配置
upstream 参数-官方文档
参数 | 描述 |
---|---|
service | 反向代理服务地址 加端口(可以是内网域名) |
weight | 权重 |
max_fails | 失败多少次 认为主机已挂掉则,踢出 |
fail_timeout | 踢出后重新探测时间 |
backup | 备用服务 |
max_conns | 允许最大连接数 |
slow_start | 当节点恢复,不立即加入 |
- service
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除 配置如下:
upstream myService{
server 127.0.0.1:8050 ;
server 127.0.0.1:8060 ;
}
- weight(权重)
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream myWeight {
server 127.0.0.1:8050 weight=5;
server 127.0.0.1:8060 weight=1;
}
- max_conns
可以根据服务的好坏来设置最大连接数,防止挂掉,比如1000,我们可以设置800
upstream myMax_conns {
server 127.0.0.1:8050 weight=5 max_conns=800;
server 127.0.0.1:8060 weight=1;
}
- max_fails、fail_timeout
max_fails:
失败多少次 认为主机已挂掉则,踢出,公司资源少的话一般设置2~3次,多的话设置1次
upstream myMax_fails {
//代表在30秒内请求某一应用失败3次,认为该应用宕机,后等待30秒,这期间内不会再把新请求发送到宕机应用,而是直接发到正常的那一台,时间到后再有请求进来继续尝试连接宕机应用且仅尝试1次,如果还是失败,则继续等待30秒...以此循环,直到恢复。
server 127.0.0.1:8050 weight=1 max_fails=1 fail_timeout=20;
server 127.0.0.1:8060 weight=1;
}
负载均衡算法
- 轮询(默认)
- 轮询+weight(权重)
- ip_hash:基于Hash计算
对请求IP进行Hash计算,根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处,可以解决session不共享的问题。 - url_hash(第三方)
应用场景: 静态资源缓存,节约存储,加快速度 - 最少链接数-least_conn
- 最快响应时间-least_time
最小的响应时间,计算节点平均响应时间,然后取响应最快的那个,分配更高权重。
示意图
-
ip_hash
-
url_hash
-
Nginx执行流程
- 客户端请求server_name
- 依据负载均衡策略,获得server
- 对url进行location匹配
- 转发请求,返回资源
参考博文:https://blog.csdn.net/caijunsen/article/details/83002219
配置示例:
//1.加入upstream节点
upstream myServer {
server 127.0.0.1:9001;
server 127.0.0.2:9002;
}
//2.将server节点下的location节点中的proxy_pass配置为:http:// + upstream名称
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_pass http://myServer;
}
}
- 演示:
动静分离
Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。
- 实现方式:
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
另外一种方法就是动态跟静态文件混合在一起发布,通过nginx location 来分开
通过 location 指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。
Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量;适合不经常变动的资源
autoindex:是否开启目录浏览
nginx 原理与优化参数配置
master-workers 的机制的好处
- 每个worker是独立的进程,不需要加锁,所以省掉了锁带来的开销。
- worker互相之间不会影响。