Nginx配置详解
安装完毕Nginx后,会有相应的安装目录,安装目录里的conf/nginx.conf为nginx的主配置文件,nginx主配置文件分为4部分,main(全局配置)、server(主机配置)、upstream(负载均衡服务器设置)以及location(URL匹配特定位置的设置)。
在 nginx.conf 的注释符号为: # 默认的 nginx 配置文件 nginx.conf 内容如下:
worker_processes 1;
events {
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;
}
}
}
nginx 文件结构
...
events {
...
}
http
{
...
server
{
...
location [PATTERN]
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
...
}
1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。 2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。 3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。 4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。 5、location块:配置请求的路由,以及各种页面的处理情况。
work process指令
用于配置Nginx生成工作进程的数量,这个是Nginx 服务器实现并发处理服务的关键所在。理论上来说workder process的 值越大,可以支持的并发处理量也越多,但事实上这个值的设定是需要 受到来自服务器自身的限制,建议将该值和服务器CPU的内核数保存一 致。
语法 | worker_processes num/auto; |
---|
默认值 | 1 | 位置 | 全局块 |
如果将worker_processes设置成2,则会看到如下内容
yangyanping@ZBMac-WP2HJYDWY nginx % sudo sbin/nginx -s reload -c conf/nginx.conf
yangyanping@ZBMac-WP2HJYDWY nginx % ps -ef |grep nginx
0 1378 1 0 10:52下午 ?? 0:00.00 nginx: master process ./sbin/nginx -q
-2 20257 1378 0 10:17下午 ?? 0:00.00 nginx: worker process
-2 20258 1378 0 10:17下午 ?? 0:00.00 nginx: worker process
502 20285 496 0 10:18下午 ttys002 0:00.00 grep nginx
yangyanping@ZBMac-WP2HJYDWY nginx %
Nginx负载均衡算法
Nginx提供的多种负载均衡策略,如:轮询,加权轮询,Ip hash。下面我们对其一一进行演示。 我们搭建一个测试环境,部署三个web应用,分别为serverA , serverB,serverC,并在hosts文件中配置测试域名。
127.0.0.1 www.test-nginx.com
- serverA 的访问地址
http://www.test-nginx.com:9091/web/hello 输出内容:hello,I am server A ! - serverB 的访问地址 http://www.test-nginx.com:9092/web/hello 输出内容:hello,I am server B ! - serverC 的访问地址 http://www.test-nginx.com:9093/web/hello 输出内容:hello,I am server C !
1. 轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
worker_processes 4;
events {
worker_connections 1024;
}
http {
include 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 logs/access.log main;
sendfile on;
keepalive_timeout 65;
upstream myweb {
server 127.0.0.1:9091;
server 127.0.0.1:9092;
server 127.0.0.1:9093;
}
server {
listen 80;
server_name localhost;
location /proxy/{
proxy_pass http://myweb/web/;
}
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
发送10次请求访问地址:http://www.test-nginx.com/proxy/hello,输出如下:
hello,I am server A !
hello,I am server B !
hello,I am server C !
hello,I am server A !
hello,I am server B !
hello,I am server C !
hello,I am server A !
hello,I am server B !
hello,I am server C !
hello,I am server A !
2. 加权轮询 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream myweb {
server 127.0.0.1:9091 weight=1;
server 127.0.0.1:9092 weight=2;
server 127.0.0.1:9093 weight=2;
}
发送10次请求访问地址:http://www.test-nginx.com/proxy/hello,输出如下:
hello,I am server A !
hello,I am server B !
hello,I am server C !
hello,I am server B !
hello,I am server C !
hello,I am server A !
hello,I am server B !
hello,I am server C !
hello,I am server B !
hello,I am server C !
3. Ip hash 算法 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream myweb {
server 127.0.0.1:9091;
server 127.0.0.1:9092;
server 127.0.0.1:9093;
ip_hash;
}
发送10次请求访问地址:http://www.test-nginx.com/proxy/hello,输出如下:
hello,I am server A !
hello,I am server A !
hello,I am server A !
hello,I am server A !
hello,I am server A !
hello,I am server A !
hello,I am server A !
hello,I am server A !
hello,I am server A !
hello,I am server A !
4. fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream myweb {
server 127.0.0.1:9091;
server 127.0.0.1:9092;
server 127.0.0.1:9093;
fair;
}
5. url_hash(第三方) 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
upstream myweb {
server 127.0.0.1:9091;
server 127.0.0.1:9092;
server 127.0.0.1:9093;
hash $request_uri;
hash_method crc32;
}
Nginx实现热备
负载均衡的server中常见配置
upstream myweb {
ip_hash;
server 127.0.0.1:9091;
server 127.0.0.1:9092 down; (down 表示当前的server暂时不参与负载)
server 127.0.0.1:9093 weight=2; (weight 默认为1.weight越大,负载的权重就越大)
server 127.0.0.1:9094 backup; (其它所有的非backup机器down或者忙的时候,请求backup机器)
}
我们配置serverC端口为备份服务器,当serverA 和 serverB 都挂掉后 会自动使用备份服务器server C(9093端口),但当主服务器serverA 或serverB又启动后,在继续使用主服务器serverA 或serverB,nginx.conf配置如下:
upstream myweb {
server 127.0.0.1:9091;
server 127.0.0.1:9092;
server 127.0.0.1:9093 backup;
}
server {
listen 80;
server_name localhost;
location /proxy/{
proxy_pass http://myweb/web/;
}
访问地址:http://www.test-nginx.com/proxy/hello 10次输出结果如下,从中可以看出请求未访问到serveC (server 127.0.0.1:9093)。
hello,I am server A !
hello,I am server B !
hello,I am server A !
hello,I am server B !
hello,I am server A !
hello,I am server B !
hello,I am server A !
hello,I am server B !
hello,I am server A !
hello,I am server B !
主动停掉server A(9091端口),再次发送10次请求,10次输出结果如下:
hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !
再主动停掉serverB(9092端口),再次发送10次请求,10次输出结果如下,主服务器serverA和serverB均已宕机,客户端请求都访问到备份服务器serverC。
hello,I am server C !
hello,I am server C !
hello,I am server C !
hello,I am server C !
hello,I am server C !
hello,I am server C !
hello,I am server C !
hello,I am server C !
hello,I am server C !
hello,I am server C !
启动主服务器 serverB后,再次发送10次请求,10次输出结果如下,主服务器serverB已启动,客户端请求会优选访问主服务器,所以请求都会访问到主服务器serverB。
hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !
hello,I am server B !
proxy_pass详解
在Nginx中配置proxy_pass代理转发时,如果在proxy_pass后面的url加/,表示绝对根路径;如果没有/,表示相对路径,把匹配的路径部分也给代理走。 假设下面四种情况分别用 http://127.0.0.1/proxy/hello 进行访问。
- 第一种配置,代理URL:http://127.0.0.1:9091/hello
location /proxy/ { proxy_pass http://127.0.0.1:9091/ } - 第二种配置,代理URL:http://127.0.0.1:9091/proxy/hello
location /proxy/ { proxy_pass http://127.0.0.1:9091 } - 第三种配置,代理URL:http://127.0.0.1:9091/web/hello
location /proxy/ { proxy_pass http://127.0.0.1:9091/web/ } - 第三种配置,代理URL:http://127.0.0.1:9091/webhello
location /proxy/ { proxy_pass http://127.0.0.1:9091/web } MVC测试代码
@RestController
public class HelloController {
@GetMapping({"/web/hello", "webhello"})
public String hello() {
return "hello,I am server A!";
}
}
Nginx日志详解
Nginx日志主要分为两种:访问日志和错误日志。日志开关在Nginx配置文件(/nginx/conf/nginx.conf)中设置,两种日志都可以选择性关闭,默认都是打开的。
- 访问日志
访问日志主要记录客户端访问Nginx的每一个请求,格式可以自定义。通过访问日志,你可以得到用户地域来源、跳转来源、使用终端、某个URL访问量等相关信息。Nginx中访问日志相关指令主要有两条: log_format:log_format用来设置日志格式,也就是日志文件中每条日志的格式,具体如下:log_format name(格式名称) type(格式样式) 举例说明如下:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
名称 | 描述 |
---|
$remote_addr | 远程客户端的IP地址 | $server_name | 虚拟主机名称 | - | 空白,用一个“-”占位符替代,历史原因导致还存在 | $remote_user | 远程客户端用户名称,用于记录浏览者进行身份验证时提供的名字,如果没有登录就是空白 | [$time_local] | 访问的时间与时区,比如18/Jul/2012:17:00:01 +0800,时间信息最后的"+0800"表示服务器所处时区位于UTC之后的8小时 | $request | 请求的URI和HTTP协议,这是整个PV日志记录中最有用的信息,记录服务器收到一个什么样的请求 | $status | 记录请求返回的http状态码,比如成功是200 | $uptream_status | upstream状态,比如成功是200 | $upstream_addr | 后端服务器的IP地址 | $http_referer | 记录从哪个页面链接访问过来的 | $http_user_agent | 客户端浏览器信息 | $http_x_forwarded_for | 客户端的真实ip,通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_addr拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址 |
- access_log
能够使用access_log指令的字段包括:http、server、location。 需要注意的是:nginx进程设置的用户和组必须对日志路径有创建文件的权限,否则,会报错。 Nginx支持为每个location指定强大的日志记录。同样的连接可以在同一时间输出到不止一个的日志中。 access_log指令用来指定日志文件的存放路径(包含日志文件名)、格式和缓存大小,具体如下:
access_log | path(存放路径) | [format(自定义日志格式名称) [buffer=size off]] |
---|
access_log | logs/access.log | main | access_log | | off 关闭日志 |
127.0.0.1 - - [07/Jan/2021:19:37:56 +0800]
"GET /proxy/hello HTTP/1.1" 200 22 "-"
"Mozilla/5.0 (Macintosh;
Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/87.0.4280.88 Safari/537.36"
- 错误日志
错误日志主要记录客户端访问nginx出错时的日志,格式不支持自定义。通过错误日志,你可以得到系统某个服务或server的性能瓶颈等。因此,将日志好好利用,你可以得到很多有价值的信息。错误日志由指令error_log来指定,具体格式如下:
error_log | 存放路径path | 日志等级level |
---|
error_log | logs/error.log | info | error_log | /dev/null | 关闭日志 |
path含义同access_log,level表示日志等级,具体如下:
[ debug | info | notice | warn | error | crit ]
从左至右,日志详细程度逐级递减,即debug最详细,crit最少。日志内容:
2021/01/07 18:30:39 [error]
45306#0: *507 no live upstreams while connecting to upstream,
client: 127.0.0.1, server: localhost,
request: "GET /proxy/hello HTTP/1.1", upstream: "http://myweb/web/hello",
host: "www.test-nginx.com"
|