在前面那些章节记录了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 | 后台服务执行超时 |