官方文档
nginx documentation
root和alias区别
- 作用范围:root可以存在于server、http和location中,而alias仅能作用在location中。
- 路径处理:root会将定义路径与URI叠加,即 rootpath + /uri;而alias只取定义路径,即 alias + 请求的文件路径。
- “root” 指令用于指定请求的 URI 对应的文件在服务器文件系统中的根目录。
- 如果请求的 URI 是 “/images/photo.jpg”,并且在配置中指定了 “root /var/www/html”,那么 Nginx 将会在文件系统中寻找文件 “/var/www/html/images/photo.jpg” 来提供服务。
- “root” 指令会将请求的 URI 与指定目录路径进行拼接来确定文件的实际路径。
- “alias” 指令用于将请求的 URI 中特定部分映射到服务器文件系统中的指定路径。
- 如果请求的 URI 是 “/images/photo.jpg”,并且在配置中指定了 “alias /var/www/images”,那么 Nginx 将会在文件系统中寻找文件 “/var/www/images/photo.jpg” 来提供服务。
- “alias” 指令会将请求的 URI 中指定部分替换为指定目录路径来确定文件的实际路径。
- 路径结束:alias后面必须要用“/”结束,否则会找不到文件;而root则对“/”可有可无。
- 使用限制:alias在使用正则匹配时,必须捕捉要匹配的内容并在指定的内容处使用;而root则没有这个限制3。
综上所述,root和alias在功能、使用和配置上都有所不同,选择使用哪个应根据实际需求和场景来决定。
超时时间
以下都设设计到代理服务的超时时间,如果nginx同时设置了upstream负载,那么如果达到了超时时间,则本次请求nginx会切换到下一个代理服务器,从而实现故障切换而不影响客户端
- proxy_read_timeout:http, server, location,定义从代理服务器读取响应的超时。超时仅在两个连续读取操作之间设置,不用于传输整个响应。如果代理服务器在此时间内没有传输任何内容,则连接将关闭。个人理解,在Nginx一整个Http响应接收过程中,可能因为响应体大小等原因导致服务端不是一次性发送,会被分成多次发送,Nginx也就需要多次才能接收完成,而这个配置就是多次接收的最大间隔时间,如果间隔时间超过了这个时间,就会超时,但是需要注意,当Nginx发送完请求后,就会开始计算这个时间,可能是因为当Nginx发送完请求后,服务端会回复一个tcp消息,然后从这个tcp消息开始就计算时间
- proxy_send_timeout:http, server, location,设置将请求传输到代理服务器的超时。超时仅在两个连续写入操作之间设置,不用于传输整个请求。如果代理服务器在此时间内没有接收到任何内容,则连接将关闭。个人理解,在Nginx一整个Http请求发送过程中,可能因为请求大小等原因导致不是一次性发送,会被分成多次发送,而这个配置就是多次发送的最大间隔时间,如果间隔时间超过这个时间,就会超时
- proxy_timeout:stream, server,设置客户端或代理服务器连接上两个连续读取或写入操作之间的超时。如果在此时间内没有传输任何数据,则连接将关闭。个人理解,就是连续两次的写入或者读取之间的间隔时间,因为stream模块没有Http的概念,所以相对好理解
代理规则
- 如果proxy_pass路径最后面有”/“,那么代理路径为:proxy_pass+实际路径在匹配路径之后的地址,例如
1 2 3 4 5
| location /activity/ { proxy_pass http://houtai/; } 请求路径:/activity/servicetime 代理路径:/servicetime(/+servicetime)
|
- 如果proxy_pass路径最后面没有”/“,就需要考虑两种情况,就是proxy_pass中是否包含请求路径
- 不包含请求路径,那么代理路径为:实际请求路径,例如
1 2 3 4 5
| location /activity/ { proxy_pass http://houtai; } 请求路径:/activity/servicetime 代理路径:/activity/servicetime(/activity/servicetime)
|
2. 包含请求路径,那么代理路径为:proxy_pass+实际路径在匹配路径之后的地址,例如
1 2 3 4 5
| location /activity/ { proxy_pass http://houtai/activity; } 请求路径:/activity/servicetime 代理路径:/activityservicetime(/activity+servicetime)
|
重要配置
- **add_header:**添加响应头返回给客户端,但有一个限制需要注意,仅当服务端返回以下状态码时,才会添加:200, 201 (1.3.10), 204, 206, 301, 302, 303, 304, 307 (1.1.16, 1.0.13), or 308 (1.13.0),**不过可以通过在后面加上always取消此限制,**例如:add_header Access-Control-Allow-Origin * always
- **server_name:**电脑一般情况下都会有多个网卡IP,这个配置设置匹配的域名或者ip,一般情况我们都只会设置成localhost或者127.0.0.1,但如果需要对同一个端口在不同ip下实现不同的逻辑,那么就需要这个配置了,比如电脑有一个192.168.10.10的ip,那么就可以对发生在127.0.0.1和192.168.10.10上的请求做出不同的处理,而server_name的实现也好理解,比如我们通过Java的ServerSocket编写一个服务端,也可以对发生不同IP的请求做出不同的处理
1 2 3 4 5 6 7 8
| ServerSocket serverSocket = new ServerSocket(8080); Socket accept = serverSocket.accept(); String hostAddress = accept.getLocalAddress().getHostAddress(); if ("127.0.0.1".equals(hostAddress)){ System.out.println("请求的是127.0.0.1"); }else if ("192.168.79.223".equals(hostAddress)){ System.out.println("请求的是192.168.79.223"); }
|
- **listen [::]:8080:**这种写法可以使nginx监听ipv6,如果想只监听ipv6的地址,可以在后面加上ipv6only on,比如listen [::]:8080 ipv6only on