一、Nginx配置命令
①、Nginx服务的启动
在Linux 平台下,启动Nginx服务器直接运行安装目录下sbin目录中的二进制文件即可。
./nginx -h
- 参数:
- -v : 打印版本号
- -V : 打印版本号和配置
- -t:测试配置正确性并退出
- -q:测试配置时只显示错误
- -s:向主进程发送信号
- -p:指定Nginx服务器路径前缀
- -c: 指定Nginx配置文件路径
- -g: 指定Nginx附加配置文件路径
②、Nginx服务的停止
- 快速停止
快速停止是指立即停止当前Nginx服务正在处理的所有网络请求,马上丢弃连接,停止工作。
./nginx -s stop # 快速关闭
- 平缓停止
平缓停止是指允许Nginx服务将当前正在处理的网络请求处理完成,但不再接收新的请求,之后关闭连接,停止工作。
./nginx -s quit # 等待工作进程处理完成后关闭
③、Nginx服务的重启
更改Nginx服务器的配置和加入新模块后,如果希望当前的Nginx服务应用新的配置或使新模块生效,就需要重启Nginx服务。当然我们可以先关闭Nginx服务,然后使用新的Nginx配置文件重启服务。
./nginx -s reload # 向主进程发送信号,重新加载配置文件,热重启
./nginx -s reopen # 重启 Nginx
二、配置指令详解
①、全局块main
- 配置运行Nginx服务器用户(组)
用于配置运行Nginx服务器用户(组)的指令是user。
user user [group]
注意:
只有被设置的用户或者用户组成员才有权限启动你那个Nginx进程,如果是其他用户尝试启动Nginx进程,将报错
如果希望所有用户都可以启动Nginx进程,有两种办法:
一是将次指令注释:
# user [user] [group]
或者把用户(和用户组)设置为nobody;
user nobody nobody;
- 配置允许生成worker process数
worker process是Nginx服务器实现并发处理的关键所在。理论来说worker_process的值越大,可以支持的并发处理也越多。
worker_process number | auto
- number 指定Nginx进程最多可以产生的worker_process数。
- auto ,设置此值,Nginx进程将自动检测。
- 配置Nginx进程PID存放路径
Nginx进程作为系统的守护进程运行,我们需要在某文件中保存当前运行程序的主进程号。
pid file;
- 配置错误日志的存放路径
在全局块、http块和 server 块中都可以对Nginx服务器的日志进行相关配置。这里首先介绍全局块下日志的存放配置,后两种情况的配置基本相同,只是作用域不同。
error_log_file | stderr[ debug|info | notice| warn |error|crit|alert]
- 配置文件的引入
在一些情况下,我们可能需要将其他的Nginx配置或者第三方模块的配置引用到当前的主配置文件中。Nginx 提供了include指令来完成配置文件的引入,其
include file;
②、events块
- 事件驱动模型
Nginx服务器提供了多种事件驱动模型来处理网络消息。配置文件中为我们提供了相关的指令来强制Nginx服务器选择哪种事件驱动模型进行消息处理。
use method;
其中,method可选择的内容有: select、poll、kqueue、epoll、rtsig、ldev/poll l以及 eventport。
- A)标准事件模型
- Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,Nginx会选择select或poll
- B)高效事件模型
- Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用双处理器的MacOSX系统使用kqueue可能会造成内核崩溃。
- Epoll:使用于Linux内核2.6版本及以后的系统。
- /dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX5.1A+。
- Eventport:使用于Solaris 10。 为了防止出现内核崩溃的问题, 有必要安装安全补丁。
- 配置最大连接数
指令worker_connections主要用来设置允许每一个worker process同时开启的最大连接数。其语法结构为
worker_connections number;
③、HTTP块
- 定义MIME-Type
在常用的浏览器中,可以显示的内容有HTML、XML、GIF及Flash等种类繁多的文本、媒体等资源,浏览器为区分这些资源,需要使用MIME Type。换言之,MIME Type是网络资源的媒体类型。Nginx服务器作为Web服务器,必须能够识别前端请求的资源类型。
include mime.types;
default_type application/octet-stream;
- 自定义服务日志
记录Nginx服务器提供服务过程应答前端请求的日志,我们将其称为服务日志以示区分。Nginx服务器支持对服务日志的格式、大小、输出等进行配置,需要使用两个指令,分别是access _log 和 log_format指令。
access_log path[format[buffer=size]]
- path,配置服务日志的文件存放的路径和名称。
- format,可选项,自定义服务日志的格式字符串,也可以通过“格式串的名称”使log_format指令定义好的格式。“格式串的名称”在 log_format 指令中定义。
- size,配置临时存放日志的内存缓存区大小。
- 配置连接超时时间
与用户建立会话连接后,Nginx服务器可以保持这些连接打开一段时间,指令 keepalive_timeout就是用来设置此时间的。
此指令还可以出现在server块和 location块中。
keepalive_timeout timeout [header timeout];
- timeout,服务器端对连接的保持时间。默认值为75s。
- header_timeout,可选项,在应答报文头部的Keep-Alive域设置超时时间"Keep-Alive:timeout= header_timeout”。报文中的这个指令可以被Mozilla或者Konqueror识别。
- 配置虚拟主机
server{} 包含在http{}内部,每一个server{}都是一个虚拟主机(站点)
server{
}
三、Nginx虚拟主机 —— server
①、监听端口 —— listen
配置网络监听
listen address[:port]
- 参数:
- address,IP地址,如果是IPv6的地址,需要使用中括号“[”括起来,比如[fe80::1]等。
- port,端口号,如果只定义了IP地址没有定义端口号,就使用80端口。
②、虚拟主机 —— server_name
这里的“主机”,就是指此server块对外提供的虚拟主机。设置了主机的名称并配置好 DNS,用户就可以使用这个名称向此虚拟主机发送请求了。
server_name name1 name2 name3 ...;
③、location指令 —— location
location [ = | ~ | ~* | ^~] uri {
...
}
匹配规则 | 含义 | 示例 |
---|---|---|
= | 精确匹配 | location = /images/ {…} |
~ | 正则匹配,区分大小写 | location ~ .(jpg | gif)$ {…} |
~* | 正则匹配,不区分大小写 | location ~* .(jpg | jif)$ {…} |
^~ | 匹配到即停止搜索 | location ^~ /images/ {…} |
不带任何符号 | location / {…} |
示例1
注意如下是对的:
http://baidu.com/abc
http://baidu.com/abc?p1=12312&name=w24
http://baidu.com/abc/
http://baidu.com/abcde
server {
server_name *.*;
location /abc {
……
}
}
示例2
= 表示:必须与指定的模式精确匹配
注意:
那么,如下是对的:
http://baidu.com/abc
http://baidu.com/abc?p1
如下是错的:
http://baidu.com/abc/
http://baidu.com/abcde
server {
server_name *.*;
location = /abc {
……
}
}
示例3
~ 表示:指定的正则表达式要区分大小写
注意:
对的
http://baidu.com/abc
http://baidu.com/abc?name=wcc&password=123
错误
http://baidu.com/ABC
http://baidu.com/abc/
http://baidu.com/abcde
server {
server_name *.*;
location ~ ^/abc$ {
……
}
}
示例4
~* 表示:指定的正则表达式不区分大小写
注意:
那么,如下是对的:
http://baidu.com/abc
http://baidu…com/ABC
http://baidu…com/abc?p1=11&p2=22
如下是错的:
http://baidu…com/abc/
http://baidu…com/abcde
server {
server_name *.*;
location ~* ^/abc$ {
……
}
}
四、Nginx核心指令 —— location
①、配置请求的根目录
Web服务器接收到网络请求之后,首先要在服务器端指定目录中寻找请求资源。在Nginx服务器中,指令root就是用来配置这个根目录的。
root
path为Nginx服务器接收到请求以后查找资源的根目录路径。
root path;
- 注意:
- 也就是说使用root 请求的真实路径是 rootpath + /uri ,也就是文件目录 + URI / 后面的内容。
- root示例
客户端请求www.test.com/images/1.jpg,则对应磁盘映射径/opt/nginx/html/images/images/1.jpg
location /images {
root /opt/nginx/html/images;
index index.html index.htm;
}
alias
alias /opt/nginx/html/images/; //最后面一定要加 “/”
alias path;
- 注意:
- 使用alias uri和文件路径进行了叠加,其实就是alias + 请求的文件。
- alias示例
客户端请求www.test.com/images/1.jpg,则对应磁盘映射路径/opt/nginx/html/images/1.jpg
location /images {
alias /opt/nginx/html/images/; //最后面一定要加 "/"
index index.html index.htm;
}
②、return指令
语法结构 | 注意事项 |
---|---|
return code [text]; | 如果返回2XX的,text才有意义,text会在body中; |
return code URL; | 主要用于重定向; |
return URL; | 须以http或者https开头的; |
- return功能
- 停止处理请求,直接返回响应码或重定向到其他URL;
- 执行return指令后,location中后序指令将不会被执行;
- 常用状态码:
- 200 请求成功
- 301 永久转移到其他URL
- 404 请求资源不存在
- 500 内部服务器错误
code + text
location / {
return 200 'your success';
}
code + URL
#302 表示临时性重定向。访问一个Url时,被重定向到另一个url上。常#用于页面跳转。
location / {
return 302 /bbs;
}
location /bbs {
root html;
index index.html;
}
URL
location / {
return http://baidu.com;
}
③、rewrite指令
# 格式
rewrite regex replacement [flag]
注意:
regex,用于匹配URI的正则表达式。使用括号 “()” 标记要截取的内容。
该指令通过正则表达式的使用来改变URI。可以同时存在一个或者多个指令,按照顺序依次对URL进行匹配和处理。该指令可以在server快或者location块中配置。
location /search {
rewrite ^/(.*) http://baidu.com permanent;
}
- rewrite位置
server,location,if
rewrite常用全局变量
变量 | 说明 |
---|---|
$args | 请求中的参数,如www.123.com/1.php?a=1&b=2的$args就是a=1&b=2 |
$body_bytes_sent | 服务器发送给客户端的响应body字节数 |
$content_length | HTTP请求信息里的"Content-Length" |
$conten_type | HTTP请求信息里的"Content-Type" |
$document_root | nginx虚拟主机配置文件中的root参数对应的值 |
$document_uri | 当前请求中不包含指令的URI,如www.123.com/1.php?a=1&b=2的$document_uri就是1.php,不包含后面的参数 |
$http_referer | 记录此次请求是从哪个连接访问过来的,可以根据该参数进行防盗链设置 |
$host | 主机头,也就是域名 |
$http_user_agent | 客户端的详细信息,也就是浏览器的标识,用curl -A可以指定 |
$http_cookie | 客户端的cookie信息 |
$http_x_forwarded_for | 当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进行相关的x_forwarded_for设置 |
$limit_rate | 如果nginx服务器使用limit_rate配置了显示网络速率,则会显示,如果没有设置,则显示0 |
$remote_addr | 客户端的公网ip |
$remote_port | 客户端的port |
$remote_user | 如果nginx有配置认证,该变量代表客户端认证的用户名 |
$request | 请求的URI和HTTP协议,如“GET /article-10000.html HTTP/1.1” |
$request_body_file | 做反向代理时发给后端服务器的本地资源的名称 |
$request_method | 请求资源的方式,GET/PUT/DELETE等 |
$request_filename | 当前请求的资源文件的路径名称,相当于是$document_root/$document_uri的组合 |
$request_uri | 请求的链接,包括$document_uri和$args |
$scheme | 请求的协议,如ftp,http,https |
$server_protocol | 客户端请求资源使用的协议的版本,如HTTP/1.0,HTTP/1.1,HTTP/2.0等 |
$server_addr | 服务器IP地址 |
$server_name | 服务器的主机名 |
$server_port | 服务器的端口号 |
$status | http状态码,记录请求返回的状态码,例如:200、301、404等 |
$uri | 和$document_uri相同 |
$http_referer | 客户端请求时的referer,通俗讲就是该请求是通过哪个链接跳过来的,用curl -e可以指定 |
$time_local | 记录访问时间与时区,如18/Jul/2014:17:00:01 +0800 |
rewrite正则表达式
字符 | 描述 |
---|---|
\ | 将后面接着的字符标记为一个特殊字符或者一个原义字符或一个向后引用 |
^ | 匹配输入字符串的起始位置 |
$ | 匹配输入字符串的结束位置 |
* | 匹配前面的字符零次或者多次 |
+ | 匹配前面字符串一次或者多次 |
? | 匹配前面字符串的零次或者一次 |
. | 匹配除“\n”之外的所有单个字符 |
(pattern) | 匹配括号内的pattern |
rewrite最后一项参数
标记符号 | 说明 |
---|---|
last | 本条规则匹配完成后继续向下匹配新的location URI规则 |
break | 本条规则匹配完成后终止,不在匹配任何规则 |
redirect | 返回302临时重定向 |
permanent | 返回301永久重定向 |
- 地址重写
地址重写是实际上是为了实现址标准化,就像访问www.baidu.cn可以出现www.baidu.com的首页,服务器会把www.baidu.cn重写成www.baidu.com,浏览器的地址栏也会显示www.baidu.com。
- 地址转发
地址转发一般发生在同一站点项目内,而地址重写则没有限制。
示例
实例1
创建三个文件夹,每个文件夹下有个1.html文件;
location /images {
rewrite /images/(.*) /pics/$1; //•将URL /images/1.html 重写为 /pics/1.html
}
location /pics {
rewrite /pics/(.*) /photos/$1; //•将URL /pics/1.html 重写为 /photos/1.html
}
location /photos {
}
示例2
将URL /images/1.html 重写为 /pics/1.html, 重新进入server段后匹配了/pics location段,然后又被重写。
location /images {
rewrite /images/(.*) /pics/$1 last;
}
示例3
将URL /images/1.html 重写为 /pics/1.html, 并且不再匹配其他location段
location /images {
rewrite /images/(.*) /pics/$1 break;
}
示例4
无论/search 后面跟什么内容,最后都会被永久重定向到百度页面
location /search {
rewrite ^/(.*) http://baidu.com permanent;
}
④、if指令
# 格式
if(condition){...};
该指令用来支持条件判断,并根据条件判断结果选择不同的Nginx配置,可以在server块或locatio块中配置该指令。它可以支持以下几种设置方法:
- 这里的字符串不需要加引号。
- 变量名-如果变量的值为空字符串或者“0”开头的任意字符串,if指令认为条件为false,其他情况为true,比如:
if ($slow) {
..... #Nginx配置
}
- 使用 “=”(等于) 和 “!=” (不等于) 比较变量和字符串是否相等,相等时if指令为条件为true,反之为false。
if ($request_method = POST) {
return 405;
}
变量与正则表达式
~ 表示匹配过程对大小写敏感
~* 表示匹配过程对大小写不敏感
!~ 表示匹配失败是if指令认为条件为true否则为false
if ($http_user_agent ~ MSIE) {
# $http_user_agent 的值中是否包含MSIE字符串,如果包含,为true
}
-
示例
判断ip地址是否为192.168.66.10如果是返回“test if ok in Url/serach”
location /search {
if ($remote_addr = "192.168.66.10"){
return 200 "test if ok in url search"
}
}
⑤、set和break指令
set
该指令用于设置一个新的变量。
- variable,为变量的名称。注意要用符号“$”作为变量的第一个字符,且变量不能与Nginx务器预设的全局变量同名。
- value,为变量的值,可以是字符串、其他变量或变量的组合等
set variable value
break
该指令用于中断当前相同作用域中的其他Nginx配置。
break;
⑥、Gzip压缩指令
Nginx开启Gzip压缩功能, 可以使网站的css、js 、xml、html 文件在传输时进行压缩,提高访问速度, 进而优化Nginx性能!
- Gzip压缩作用
将响应报⽂发送⾄客户端之前可以启⽤压缩功能,这能够有效地节约带宽,并提⾼响应⾄客户端的速度。Gzip压缩可以配置http,server和location模块下。Nginx开启Gzip压缩参数说明:
压缩参数说明
指令 | 含义 |
---|---|
gzip on | 决定是否开启gzip模块,on表示开启,off表示关闭; |
gzip_min_length 1k | 设置允许压缩的页面最小字节(从header头的Content-Length中获取) ,当返回内容大于此值时才会使用gzip进行压缩,以K为单位,当值为0时,所有页面都进行压缩。建议大于1k |
gzip_buffers 4 16k; | 设置gzip申请内存的大小,其作用是按块大小的倍数申请内存空间,param2:int(k) 后面单位是k。这里设置以16k为单位,按照原始数据大小以16k为单位的4倍申请内存 |
gzip_http_version 1.1; | 识别http协议的版本,早起浏览器可能不支持gzip自解压,用户会看到乱码 |
gzip_comp_level 2; | 设置gzip压缩等级,等级越底压缩速度越快文件压缩比越小,反之速度越慢文件压缩比越大;等级1-9,最小的压缩最快 但是消耗cpu |
gzip_types text /plain``application /x-javascript text /css``application /xml``; | 设置需要压缩的MIME类型,非设置值不进行压缩,即匹配压缩类型 |
gzip_vary on; | 启用应答头"Vary: Accept-Encoding" |
gzip_proxied off; | nginx做为反向代理时启用,off(关闭所有代理结果的数据的压缩),expired(启用压缩,如果header头中包括 “Expires” 头信息),no-cache(启用压缩,header头中包含 “Cache-Control:no-cache” ), no-store(启用压缩,header头中包含 “Cache-Control:no-store” ),private(启用压缩,header头中包含 “Cache-Control:private” ),no_last_modefied(启用压缩,header头中不包含 “Last-Modified” ),no_etag(启用压缩,如果header头中不包含 “Etag” 头信息),auth(启用压缩,如果header头中包含 “Authorization” 头信息) |
gzip_disable msie6; | (IE5.5和IE6 SP1使用msie6参数来禁止 gzip 压缩 )指定哪些不需要 gzip 压缩的浏览器(将和User-Agents进行匹配),依赖于PCRE库 |
-
如下是线上常使用的Gzip压缩配置
http { gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 9; gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php application/javascript application/json; gzip_disable "MSIE [1-6]\."; gzip_vary on; }
Nginx的Gzip压缩功能虽然好用,但是下面两类文件资源不太建议启用此压缩功能。
-
- 图片类型资源 (还有视频文件)
- 原因:图片如jpg、png文件本身就会有压缩,所以就算开启gzip后,压缩前和压缩后大小没有多大区别,所以开启了反而会白白的浪费资源。
-
- 大文件资源
- 原因:会消耗大量的cpu资源,且不一定有明显的效果。
-
五、Nginx场景实践
①、浏览器缓存
浏览器缓存是为了加速浏览,浏览器在用户磁盘上,对最近请求过的文档进行存储。当访问者再次请求这个页面时,浏览器就可以从本地磁盘显示文档,这样,就可以加速页面的阅览,缓存的方式节约了网络的资源,提高了网络的效率。
语法:expires[time| epoch | max |off]
默认值:expires off
作用域:http、server、location
- 示例
比如,对常见格式的图片、Flash文件在浏览器本地缓存30天,对JS、CSS文件在浏览器本地缓存1小时,代码如下
location ~ .*\.(gif|jpg|png)$
{
expires 30d;
}
location ~.*\.(js|css)?$
{
expires 1h;
}
②、防盗链
内容不在自己的服务器上,通过技术手段将其他网站的内容(比如一些音乐、图片、软件的下载地址)放置在自己的网站中,通过这种方法盗取其他网站的空间和流量。
- 基于http_refer防盗链配置模块
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。
valid_referers none blocked 192.168.66.100;
if ($invalid_referer) {
return 403;
}
参数:
- none : 允许没有http_refer的请求访问资源;
- blocked : 允许不是http://开头的,不带协议的请求访问资源;
- 192.168.66.100: 只允许指定ip来的请求访问资源;
③、代理服务
正向代理
正向代理,是在用户端的。比如需要访问某些国外网站,我们可能需要购买vpn。
- 正向代理最大的特点:
- 1 客户端非常明确要访问的服务器地址;
- 2 服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;
- 3 正向代理模式屏蔽或者隐藏了真实客户端信息。
反向代理
客户端给服务器发送的请求,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,nginx扮演的就是一个反向代理角色。
反向代理,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。
- 反向代理设置指令
学习Nginx服务器的反向代理服务,要涉及与后端代理服务器相关的配置指令比较重要,是为客户端提供正常Web服务的基础,大家应该熟练掌握尤其是proxy_pass指令,在实际应用过程中需要注意一些配置细节,需要小心使用。
- proxy_pass指令
该指令用来设置被代理服务器的地址,可以是主机名称、IP地址加端口号等形式。
proxy_pass URL;
示例
server{
....
listen 80;
server_name *.*;
location / {
proxy_pass http://192.168.66.101:8080;
}
}
④、负载均衡
- 什么是负载均衡
负载均衡是高可用网络基础架构的关键组件,通常用于将工作负载分布到多个服务器来提高网站、应用、数据库或其他服务的性能和可靠性。
upstream指令
upstream块不属于虚拟主机,只能在http块里配置,它定义了在反向代理时Nginx需要访问的后端服务器集群和负载均衡策略。
- http
upstream back_end { # upstream需要一个名字
server 192.168.66.100 max_conns=2 fail_timeout=1s;
server 192.168.66.101 weight = 1;
server 192.168.66.102 weight = 1;
}
- upstream参数:
- max_conns 节点的最大连接数
- slow_start 缓慢启动时间
- down 节点下线
- backup 备用节点
- max_fails 允许的最大失败数
- fail_timeout 超过最大失败数后的等待时间
- server
server{
lisetn 80;
server_name *.*;
location / {
proxy_set_header Host $host; #转发原始请求的host头部
proxy_pass http://back_end; #转发到upstream块定义的服务器集群。
}
}
负载均衡算法
轮询(默认)
轮询方式,依次将请求分配到各个后台服务器中,默认的负载均衡方式。适用于后台机器性能一致的情况。挂掉的机器可以自动从服务列表中剔除。
upstream bakend {
server 192.168.0.14;
server 192.168.0.15;
}
轮询加权重
根据权重来分发请求到不同的机器中,指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream bakend {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}
IP_hash
每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。俗称IP绑定。
upstream backServer{
server 127.0.0.1:8080 ;
server 127.0.0.1:8081 ;
ip_hash;
}
server {
listen 80;
server_name www.itmayiedu.com;
location / {
### 指定上游服务器负载均衡服务器
proxy_pass http://backServer;
index index.html index.htm;
}
}
url_hash
按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装Nginx的hash软件包。
fair
比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间 来分配请求,响应时间短的优先分配。Nginx本身不支持fair,如果需要这种调度算法,则必须安装upstream_fair模块。
- fair模块安装
模块介绍
- fair采用的不是内建负载均衡使用的轮换的均衡算法,而是可以根据页面大小、加载时间长短智能的进行负载均衡。
模块安装
解压
unzip nginx-upstream-fair-master.zip
切换到nginx目录执行一下操作
# 切换安装目录 cd /usr/local/nginx-1.19.2/ # 添加模块,重新安装 ./configure --add-module=/opt/soft/nginx-upstream-fair-master # 编译一下 make # 进入objs文件夹,查看拷贝nginx文件 cd /usr/local/nginx-1.19.2/objs # cp /usr/local/nginx-1.19.2/objs/nginx /usr/local/nginx/sbin
- 配置实现
upstream backserver {
fair;
server 192.168.0.14;
server 192.168.0.15;
}
⑤、Nginx配置故障转移
当上游服务器(真实访问服务器),一旦出现故障或者是没有及时相应的话,应该直接轮训到下一台服务器,保证服务器的高可用。
server {
listen 80;
server_name www.itmayiedu.com;
location / {
# 指定上游服务器负载均衡服务器
proxy_pass http://backServer;
# 故障转移的条件:
# 如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
proxy_next_upstream http_502 http_504 error timeout invalid_header;
# nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_connect_timeout 1s;
# nginx发送给上游服务器(真实访问的服务器)超时时间
proxy_send_timeout 1s;
# nginx接受上游服务器(真实访问的服务器)超时时间
proxy_read_timeout 1s;
# 重试次数
proxy_next_upstream_tries 3;
index index.html index.htm;
}
}
⑥、跨域问题
为什么会出现跨域问题
- 出于浏览器的同源策略限制。同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
- 解决跨域请求
只需要在Nginx的配置文件中配置以下参数:
location / {
# 服务器默认不准跨域,下面设置代表可以接收所有请求源 接收所有跨域
add_header Access-Control-Allow-Origin *;
# 运行客户端请求类型
add_header Access-Control-Allow-Methods'GET, POST, OPTIONS';
# 设置预检请求 w3c http 首部字段
add_header Access-Control-Allow-Headers'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
if ($request_method = 'OPTIONS') {
return 204;
}
}
参数:
- Access-Control-Allow-Origin 表示服务器可以接受所有的请求源(Origin),即接受所有跨域的请求。
- Access-Control-Allow-Methods 明确了客户端所要访问的资源允许使用的方法或方法列表。
- Access-Control-Allow-Headers 设置预检请求。
⑦、动静分离
Nginx动静分离简单来说就是把动态和静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求和静态请求分开,可以理解成使用Nginx处理静态请求,Tomcat处理动态请求。
通过请求分离
upstream webservers {
server 192.168.66.101:8080 weight=5;
server 192.168.66.102:8080 weight=5;
}
server {
listen 80;
server_name *.*;
location / {
root html;
index index.html index.htm;
proxy_set_header Host $host;
proxy_pass http://webservers;
}
location /image/ {
root static;
}
location /web/ {
proxy_set_header Host $host;
proxy_pass http://webservers;
}
}
}
根据扩展名分离
upstream webservers {
server 192.168.66.101:8080 weight=5;
server 192.168.66.102:8080 weight=5;
}
server {
listen 80;
server_name *.*;
location / {
root html;
index index.html index.htm;
proxy_set_header Host $host;
proxy_pass http://webservers;
}
location ~ .*.(jpg|png|gif|css|js)$ {
root static;
}
}
}
⑧、缓存机制
配置proxy_cache模块
- 参数说明:
- proxy_cache_path 缓存文件路径
- levels 设置缓存文件目录层次;levels=1:2 表示两级目录
- keys_zone 设置缓存名字和共享内存大小
- inactive 在指定时间内没人访问则被删除
- max_size 最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源。
- 在nginx.conf文件中添加如下代码:
http{
......
proxy_cache_path /data/nginx/tmp-test levels=1:2 keys_zone=tmp-test:100m inactive=7d max_size=1000g;
}
- 使用proxy_cache
location /tmp-test/ {
proxy_cache tmp-test;
proxy_cache_valid 200 206 304 301 302 10d;
proxy_cache_key $uri;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8081/media_store.php/tmp-test/;
}
参数:
- Proxy_cache tmp -test 使用名为 tmp -test 的对应缓存配置
- proxy_cache_valid 200 206 304 301 302 10d; 对httpcode为200…的缓存10天
- proxy_cache_key $uri 定义缓存唯一key,通过唯一key来进行hash存取
- proxy_set_header 自定义http header头,用于发送给后端真实服务器。
- proxy_pass 指代理后转发的路径,注意是否 需要 最后的 /
- 主动清理缓存文件
location /tmp-test/ {
allow 127.0.0.1; //只允许本机访问
deny all; //禁止其他所有ip
proxy_cache_purge tmp-test $uri; //清理缓存
}
⑧、限流
根据nginx官网提供的说法,有两种算法,一种是漏桶算法,一种是令牌桶算法
- limit_req_zone 用来限制单位时间内的请求数目,以及速度限制。
- limit_req_conn 用来限制同一时间连接数,即并发限制。
Nginx限速配置指令
- 放在http{} 内
- 参数解析:
- 第一个参数:$binary_remote_addr 限制同一客户端ip地址。
- 第二个参数:zone=mylimit:10m 用来存储访问的频次信息。
- 第三个参数:rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,还可以有比如30r/m的。
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
- 放在server{}内
- 参数:
- 第一个参数:zone=one 设置使用哪个配置区域来做限制,与上面limit_req_zone 里的name对应。
- 第二个参数:burst=5,重点说明一下这个配置,burst爆发的意思,这个配置的意思是设置一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内。
- 第三个参数:nodelay,如果设置,超过访问频次而且缓冲区也满了的时候就会直接返回503,如果没有设置,则所有请求会等待排队。
limit_req zone=mylimit burst=1 nodelay;
Nginx并发限制配置指令
ngx_http_limit_conn_module 提供了限制连接数的能力,利用limit_conn_zone 和 limit_conn 两个指令即可。
- 放在http{} 内
http{
#ip limit
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
}
- 放在server{}内
在需要 限制并发数 和 下载带宽 的网站配置 server {}里加上如下代码:
server {
limit_conn perip 10;
limit_conn perserver 100;
}
参数说明:
- limit_conn perip 10 作用的key 是 binary_remote_addr,表示限制单个IP同时最多能持有10个连接。
- limit_conn perserver 100 作用的key是 server_name,表示虚拟主机(server) 同时能处理并发连接的总数。
设置白名单
限流主要针对外部访问,内网访问相对安全,可以不做限流,通过设置白名单即可。利用 Nginx ngx_http_geo_module 和ngx_http_map_module 两个工具模块即可搞定。
- 查看是否具有该功能
./configure --help |grep http_limit_req_module
./configure --help |grep http_geo_module
./configure --help |grep http_map_module
- 在 nginx.conf 的 http 部分中配置白名单
geo $limit {
default 1;
39.100.243.125 0;
192.168.0.0/24 0;
172.20.0.35 0;
}
map limit limit_key {
0 "";
1 $binary_remote_addr;
}
limit_req_zone $limit_key zone=myRateLimit:10m rate=10r/s;
参数:
- geo 对于白名单(子网或IP都可以) 将返回0,其他IP将返回1。
- map 将limit转换为 limit_key,如果是 $limit 是0(白名单),则返回空字符串;如果是1,则返回客户端实际IP。
- limit_req_zone 限流的key不再使用 binary_remote_addr,而是limit_key 来动态获取值。如果是白名单,limit_req_zone 的限流key则为空字符串,将不会限流;若不是白名单,将会对客户端真实IP进行限流
⑨、高可用
- 双机热备方案
这种方案是国内企业中最为普遍的一种高可用方案,双机热备其实就是指一台服务器在提供服务,另一台为某服务的备用状态,当一台服务器不可用另外一台就会顶替上去。
环境服务配置
两台Nginx服务器
Nginx 主服务器 192.168.66.100
Nginx 备服务器 192.168.66.101
Lvs 虚拟VIP 192.168.66.99
环境搭建
yum install -y keepalived
- keepalived 常用命令
service keepalived start
service keepalived stop
- 启动报错:
Starting keepalived (via systemctl): Job for
keepalived.service failed. See 'systemctl status
keepalived.service’ and ‘journalctl -xn’ for details.
# 解决办法
cd /usr/sbin/
rm -f keepalived
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
使用keepalived虚拟VIP
修改主keepalived文件
文件 :/etc/keepalived/keepalived.conf
修改:State 为MASTER
! Configuration File for keepalived
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
#运行脚本,脚本内容下面有,就是起到一个nginx宕机以后,自动开启服务
interval 2 #检测时间间隔
weight -20 #如果条件成立的话,则权重 -20
}
# 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
state MASTER #来决定主从
interface ens33 # 绑定虚拟 IP 的网络接口,根据自己的机器填写
virtual_router_id 121 # 虚拟路由的 ID 号,两个节点设置必须一样
mcast_src_ip 192.168.212.141 #填写本机ip
priority 100 # 节点优先级,主要比从节点优先级高
nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认 1s
authentication {
auth_type PASS
auth_pass 1111
}
# 将 track_script 块加入 instance 配置块
track_script {
chk_nginx #执行 Nginx 监控的服务
}
virtual_ipaddress {
192.168.212.110 # 虚拟ip,也就是解决写死程序的ip怎么能切换的ip,也可扩展,用途广泛。可配置多个。
}
}
修改从keepalived信息
文件:/etc/keepalived/keepalived.conf
修改:State 为BACKUP
! Configuration File for keepalived
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
#运行脚本,脚本内容下面有,就是起到一个nginx宕机以后,自动开启服务
interval 2 #检测时间间隔
weight -20 #如果条件成立的话,则权重 -20
}
# 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
state BACKUP #来决定主从
interface ens33 # 绑定虚拟 IP 的网络接口,根据自己的机器填写
virtual_router_id 121 # 虚拟路由的 ID 号,两个节点设置必须一样
mcast_src_ip 192.168.212.141 #填写本机ip
priority 100 # 节点优先级,主要比从节点优先级高
nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认 1s
authentication {
auth_type PASS
auth_pass 1111
}
# 将 track_script 块加入 instance 配置块
track_script {
chk_nginx #执行 Nginx 监控的服务
}
virtual_ipaddress {
192.168.212.110 # 虚拟ip,也就是解决写死程序的ip怎么能切换的ip,也可扩展,用途广泛。可配置多个。
}
}
实现高脚本
写入nginx_check.sh脚本 /etc/keepalived/nginx_check.sh,该脚本一定要授权。chmod 777 nginx_check.sh3
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq
0 ];then
killall keepalived
fi
fi