Nginx
1. Nginx
Nginx 是一个高性能的Web服务器,反向代理服务器和邮件服务器。其特点是占有内存少,并发能力强。
2. Nginx 进程
Nginx 有一个 master 进程和一个或多个 worker 进程。如果启用缓存,Cache Manager 和 Cache Loader 进程也会运行。
-
master 进程:读取配置文件,管理 worker 进程等。
-
worker 进程处理实际的网络请求。进程的数量由 nginx.conf 配置文件中的 worker_processes 指令定义。
Nginx 启停命令:
./nginx #启动 nginx ./nginx -s reload|reopen|stop|quit #-s向主进程发送信号,重新加载配置|重新打开日志|立即关机|正常关机 ./nginx -t #测试配置是否有语法错误
./nginx -v #nginx 版本
3. 反向代理
反向代理:代理服务器接收用户请求,然后将请求通过策略转发给后端服务器,并将后端服务器的响应返回给用户。
Nginx 反向代理功能通过 location 块中的 proxy_pass 指令配置。
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
4. 负载均衡
Nginx 负载均衡功能是通过 upstream 模块来实现的,使用 server 命令指定后端服务器的 IP 地址和端口,还可以设置状态值。
-
down 表示当前的server暂时不参与负载。
-
weight 负载的权重值。
-
max_fails 允许请求的失败次数,默认为1,配合 fail_timeout 一起使用。
-
fail_timeout 经过 max_fails 失败次数后,暂停服务的时间。
-
backup 当其他所有非备机出现故障或者繁忙的时候,才会请求备机,访问压力最小。
负载均衡策略
(1)轮询(默认):将请求按时间顺序依次分发到不同的后端服务器。
upstream backserver {
server 192.168.10.11:80;
server 192.168.10.12:80;
}
(2)加权轮询:指定轮询权重,weight 值越大,分发的几率就越大,主要用于后端服务器性能不均衡的情况。
upstream backserver {
server 192.168.10.11:80;
server 192.168.10.12:80 weight=3;
}
(3)ip_hash:按用户IP的哈希值分发请求,来自同一个IP的请求会转发到同一台后端服务器,可以有效解决 session 共享问题。
upstream backserver {
ip_hash;
server 192.168.10.11:80;
server 192.168.10.12:80;
}
(4)url_hash:按访问的 URL 的哈希值分发请求,每个 URL 会指向后端固定的某个服务器,可以进一步提高后端缓存服务器的效率。需要安装 hash 软件包。
(5)fair:根据后端服务器的响应时间来分发请求,响应时间短的优先分发。需要安装 upstream_fair 模块。
5. 健康检查
Nginx 支持两种健康检查模式:
(1)被动检查
Nginx 在代理请求过程中会监测每个后端服务器对请求的响应状态。通过 upstream 模块中 max_fails,fail_timeout 来实现,是 Nginx 默认健康检查模式。
upstream backserver {
server 192.168.10.11:80 max_fails=2 fail_timeout=10s;
server 192.168.10.12:80 max_fails=2 fail_timeout=10s;
}
(2)主动检查
Nginx 会按照设定的间隔时间主动检查后端服务器。如果后端服务器异常,就不会将请求转发到该服务器。需要安装 ngx_upstream_check_module 模块。
upstream backserver { server 192.168.10.11:80; server 192.168.10.12:80; check interval=5000 rise=2 fall=2 timeout=3000 type=tcp;
#check_http_send "HEAD / HTTP/1.0\r\n\r\n";
#check_http_expect_alive http_2xx http_3xx; }
-
interval:向后端发送的健康检查包的间隔。单位毫秒。
-
rise:如果连续成功达到指定次数,服务器状态就被认为是up。
-
fall:如果连续失败达到指定次数,服务器状态就被认为是down。
-
timeout:后端健康检查请求的超时时间。
6. location
location 用在虚拟服务器 server 部分,根据请求中的 uri 匹配相应的处理规则。定义 location 可以用前缀字符串,也可以用正则表达式。
location [ = | ~ | ~* | ^~ ] uri { ... }
- = 精准匹配
- ^~ 普通字符匹配
- ~ 正则匹配,区分大小写
- ~* 正则匹配,不区分大小写
- / 通用匹配
匹配顺序
(1)精准匹配。如果命中,停止匹配;
(2)^~ 普通字符匹配。如果命中,停止正则匹配,但仍会普通字符匹配;
(3)正则匹配。根据配置文件中的顺序依次检查,如果命中,停止匹配;
(4)普通字符匹配(不带^~ )。继续正则匹配,如果正则命中,停止匹配。没有命中,遵循最长前缀匹配原则。
alias指令和root指令
Nginx 指定服务器静态资源文件有两种方式,alias 和 root。
alias 指令定义路径别名,root 指令定义上层路径。alias 只能位于 location 块中,alias 定义的路径必须以 / 结尾。
location /test/ {
alias /www/root/html/; #请求/test/1.jpg,返回/www/root/html/1.jpg
}
location /test/ {
root /www/root/html/; #请求/test/1.jpg,返回/www/root/html/test/1.jpg
}
index指令
在前后端分离的基础上,通过 Nginx 配置,指定网站主页。通常与 root 指令同时使用。
-
index 指令后面可以跟多个文件,用空格隔开。
-
如果有多个文件,Nginx 会根据文件的枚举顺序来查找。
-
文件可以是相对路径,也可以是绝对路径,绝对路径需要放在最后。
-
指令默认值,index index.html。
index index.$geo.html index.0.html /index.html;
proxy_set_header指令
Nginx 允许重新定义或者添加发往后端服务器的请求头。value可以包含文本、变量或者它们的组合。语法格式:
proxy_set_header field value;
默认情况下,只有两个 field 可以被重新定义。
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
(1)proxy_set_header Host $host
HTTP请求头 Host 字段的值,如果该字段未设置,则为代理服务器的域名。用来获取客户端要访问的域名。
(2)proxy_set_header X-Real-IP $remote_addr
获取客户端IP地址或上一层代理服务器IP地址。
(3)proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
获取客户端IP地址和各层代理服务器IP地址,逗号分隔。
7. 七层负载均衡
七层负载均衡,也称"内容交换",代理服务器和客户端建立TCP连接,接收客户端的请求。然后再根据请求报文中的URL等应用层内容,代理服务器和后端服务器建立TCP连接,将请求转发到后端服务器。
8. 为什么要做动静分离?
Nginx 作为 web 服务器时,静态请求处理能力很强,但是动态请求处理能力不足。为了提高网站的响应速度,减轻服务器的压力,对于 jpg、png、js 等静态资源,我们可以在 Nginx 中进行缓存。当浏览器请求一个静态资源时,Nginx 就可以直接处理。用户请求 jsp 等动态资源时,Nginx 将请求转发给应用服务器来处理。
动静分离的 Nginx 配置:
upstream tomcat_server{
server 192.168.10.20:8080;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location ~ \.jsp$ {
proxy_pass http://tomcat_server;
}
location ~ \.(gif|jpg|jpeg|png|bmp|swf|css)$ {
root /static/
}
}
9. 日志打印响应时间
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" "$request_time" "$upstream_response_time" ';
access_log logs/access.log main;
-
$request_time:指接受客户端请求到响应给客户端的时间。
-
$upstream_response_time:Nginx 与后端服务器建立连接到接收完响应数据并关闭连接的时间。
10. 防盗链
盗链是指跨站访问其他网站的资源,骗取用户的浏览和点击率。盗链会大量消耗被盗链网站的带宽,严重损害了被盗链网站的利益。浏览器向 web 服务器发送请求的时候,一般会在HTTP请求头中带上 Referer 信息,告诉服务器请求网页的来源。防盗链的原理就是根据 referer 属性实现访问控制。
location ~* \.(gif|jpg|png|jpeg)$ {
valid_referers none blocked *.test.com;
if ($invalid_referer) {
return 403;
}
}