手记

nginx常见问题(29)

在前面那些章节记录了nginx基础用法、模块等。这小节会记录nginx在配置时常常碰到的问题。

1.相同server_name多个虚拟主机优先级访问

在多个虚拟主机里面假如有多个server_name,那他们的优先级是什么?

示例

#/etc/nginx/conf.d文件夹下面文件排序方式
testserver1.conf testserver2.conf

#testserver1.conf
server{
	listen 80;
	server_name testserver1 waliblog.com;
	location {
		root /opt/app/code1;
		index index.html;
	}
}

#testserver2.conf
server{
	listen 80;
	server_name testserver2 waliblog.com;
	location {
		root /opt/app/code2
		index index.html;
	}
}

当配置多个相同server_name时,nginx是按照读取/etc/nginx/conf.d文件下面配置文件先后来决定的。所以testserver1.conf会被优先读取,会默认访问/opt/app/code1

2.location匹配优先级

匹配规则 描述
= 进行普通字符精确匹配,也就是完全匹配
^~ 表示普通字符匹配,使用前缀匹配
~ \~* 表示执行一个正则匹配(),()不区分大小写,(*)区分大小写

优先级是由高到低

示例

location = /code1/ {
	rewrite ^(.*)$ /code1/index.html breakl;
}

location ~ /code.* {
	rewrite ^(.*)$ /code3/index.html breakl;
}

location ^~ /code.* {
	rewrite ^(.*)$ /code2/index.html breakl;
}

nginx会优先匹配顺序第一个,第三个,第二个

3.try_files的使用

按顺序检查文件是否存在

示例1

location / {
	try_files $uri $uri/ /index.html;
}

首先会查找$uri下的这个文件,如果不存在会查找$uri/,如果还不存在就会查看/index.html文件是否存在,存在则返回,不存在就会返回404

示例2

location / {
	root /opt/app/code1/cache;
	try_files $uri @wali;
}

location @wali {
	proxy_pass http://127.0.0.1:8080;
}

浏览器输入http://walidream.com/a.html,首先会在/opt/app/code1/cache下面查找a.html文件是否存在,如果不存在就会跳到代理8080端口。常用于缓存,或动静分离。

4.alias和root区别

alias和root都是定义访问根路径。

root

location /blog/image/ {
	root /opt/app/image/;
}

当访问的路径是http://www.walidream.com/blog/image/cat.png时,实际上访问的路径是http://www.walidream.com/opt/app/image/blog/image/cat.png

alias

location /blog/image/ {
	root /opt/app/image/;
}

当访问的路径是http://www.walidream.com/blog/image/cat.png时,实际上访问的路径是http://www.walidream.com/opt/app/image/cat.png没有了/blog/image/路径。

5.如何获取用户的真实ip

当客户端访问服务器时,不是直接访问,而是经过了层层代理之后访问的服务器,我们应该如何精准的获取客户端的ip?

在一级代理时设置X_Real_Ip=$remote_addr,然后在其他代理透传下去,就可以获取用户的真实ip。

6.nginx中常见的错误码

状态码 描述
301 永久重定向
302 临时重定向
403 禁止访问
404 未找到文件
413 用户上传文件限制client_max_body_size
500 服务器遇到错误,无法完成请求
502 后台服务无响应
504 后台服务执行超时
4人推荐
随时随地看视频
慕课网APP