Nginx常见问题
一、nginx多server优先级
在开始处理一个http请求时,nginx会取出header头中的Host变量(域名),与nginx.conf中的每个server_name进行匹配,以此决定到底由哪一个server来处理这个请求,但nginx如何配置多个相同的server_name,会导致server_name出现优先级访问冲突。
1.准备多个配置文件
[root@web01 conf.d]# cat server1.conf
server {
listen 80;
server_name localhost test1.com;
location / {
root /mm/test1;
index index.html;
}
}
[root@web01 conf.d]# cat server2.conf
server {
listen 80;
server_name localhost test2.com;
location / {
root /mm/test2;
index index.html;
}
}
[root@web01 conf.d]# cat server3.conf
server {
listen 80;
server_name localhost test3.com;
location / {
root /mm/test3;
index index.html;
}
}
## 检查nginx -t 并重启 #会提示警告
[root@web01 ~]# systemctl restart nginx
2.创建站点文件
[root@web01 conf.d]# mkdir /mm/test{1..3}
[root@web01 conf.d]# chown -R www.www /mm/
[root@web01 conf.d]# echo server1 123 > /mm/test1/index.html
[root@web01 conf.d]# echo server2 123 > /mm/test2/index.html
[root@web01 conf.d]# echo server3 123 > /mm/test3/index.html
3.配置本地hosts并访问
1.根据ip地址访问
# 默认从上到下依次匹配
在百度10.10.0.7 会显示 server1 123
如果在把[root@web01 conf.d] server1.conf
改成其他 ,则会显示server2 123
其他同理
2.配置hosts,访问域名
10.10.0.7 test1.com test2.com test3.com
4.多server优先级总结
1.首先选择所有的'字符串完全匹配'的'server_name'。(完全匹配 www.mm.xin.com)
2.选择'通配符在前面'的server_name,如 '*.mm.xin.com'
3.选择'通配符在后面'的server_name,如 'www.mumusir.*'
4.最后选择使用'正则表达式'匹配的server_name,如:'~^www\.(.*)\.com$'
5.如果全部都没有匹配到,那么将选择在'listen配置项'后加入'[default_server]'的server块
6.如果没写,那么就找到匹配listen端口的第一个Server块的配置文件
5.多server优先级验证
# 1、配置完全匹配的配置文件
[root@web01 conf.d]# vim server.mm.conf
server {
listen 80;
server_name www.test.com;
location / {
root /mm/test;
index index.html;
}
}
[root@web01 conf.d]# echo "完全匹配123" > /mm/test/index.html
# 2、配置通配符在前面的配置文件
[root@web01 conf.d]# vim server1.mm.conf
server {
listen 80;
server_name *.test.com;
location / {
root /mm/test1;
index index.html;
}
}
[root@web01 conf.d]# echo "通配符在前面123" > /mm/test1/index.html
# 3、配置通配符在后面的配置文件
[root@web01 conf.d]# vim server2.mm.conf
server {
listen 80;
server_name www.test.*;
location / {
root /mm/test2;
index index.html;
}
}
[root@web01 conf.d]# echo "通配符在后面123" > /mm/test2/index.html
# 4、正则表达式的配置文件
[root@web01 conf.d]# vim server3.mm.conf
server {
listen 80;
server_name ~^www\.(.*)\.com$;
location / {
root /mm/test3;
index index.html;
}
}
[root@web01 conf.d]# echo "正则表达式123" > /mm/test3/index.html
# 5、配置default_server的配置文件
[root@web01 conf.d]# vim server4.mm.conf
server {
listen 80 default_server;
server_name localhost;
location / {
root /mm/test4;
index index.html;
}
}
[root@web01 conf.d]# echo "default_server" > /mm/test4/index.html
# 6、放在第一个的配置文件
[root@web01 conf.d]# vim mm.conf
server {
listen 80;
server_name localhost;
location / {
root /mm/test5;
index index.html;
}
}
[root@web01 conf.d]# echo "第一个123" > /mm/test5/index.html
## 检查nginx -t 并重启
[root@web01 ~]# systemctl restart nginx
6.配置本地hosts并访问
#配置本地hosts
10.10.0.7 www.test.com
7.补充知识
# 补充 中文乱码 在 /etc/nginx/nginx.conf 里添加一行
charset utf8; # 添加一行
access_log /var/log/nginx/access.log main;
# 补充 dG 删除全文全部内容
# yum nginx安装 需要修改/etc/nginx/nginx.conf 里面default_server
二、禁止IP访问
当用户通过访问IP或者未知域名访问你得网站的时候,你希望禁止显示任何有效内容,可以给他返回500,目前国内很多机房都基本关闭外网,使用内网,需要时在开启。
1.禁止IP访问直接返回错误
[root@web02 conf.d]# vim mm.conf
server {
listen 80 default_server; #默认第一个 default_server
server_name localhost;
return 500;
}
2.引流的方式,跳转到其他网站
[root@web02 conf.d]# vim mm.conf
server {
listen 80 default_server;
server_name localhost;
return 302 http://www.baidu.com;
}
3.返回指定的内容
[root@web02 conf.d]# vim mm.conf
server {
listen 80 default_server;
server_name localhost;
default_type text/plain;
return 200 "请使用域名访问正规网站!!!";
}
4.跳转到指定文件
[root@web02 ~]# vim /etc/nginx/conf.d/a.conf
server {
listen 80 default_server;
server_name localhost;
root /mm;
rewrite (.*) /1.png;
}
## /mm/文件下必须有图片
三、nginx的include
一台服务器配置多个网站,如果配置都写在nginx.conf主配置文件中,会导致nginx.conf主配置文件变得非常庞大而且可读性非常的差。那么后期的维护就变得麻烦。
假设现在希望快速的关闭一个站点,该怎么办?
1.如果是写在nginx.conf中,则需要手动注释,比较麻烦
2.如果是include的方式,那么仅需修改配置文件的扩展名,即可完成注释
Include包含的作用是为了简化主配置文件,便于人类可读。
/etc/nginx/nging.conf #修改nginx的配置文件 *conf文件
inlcude /etc/nginx/online/*.conf #线上使用的配置
/etc/nginx/offline #保留配置,不启用(下次使用在移动到online中)
四、nginx的root与alias
root与alias路径匹配主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上,alias是一个目录别名的定义,root则是最上层目录的定义。
root的处理结果是:root路径+location路径
alias的处理结果是:使用alias定义的路径
1.root和alias的配置
[root@lb02 conf.d]# cat image.conf
server {
listen 80;
server_name image.com;
location /picture {
root /mm;
}
}
#使用root时,用户访问http://image.com/picture/11.png时,实际上Nginx会找到/mm/picture/11.png文件
[root@lb02 conf.d]# cat image.conf
server {
listen 80;
server_name image.com;
location /picture {
alias /mm;
}
}
#使用alias时,用户访问http://image.com/picture/11.png时,实际上Nginx会找
到/mm/11.png文件
2.线上配置
[root@lb02 conf.d]# cat image.conf
server {
listen 80;
server_name image.com;
location / {
root /mm;
}
location ~* ^.*\.(png|jpg|gif)$ {
alias /mm/images/;
}
}
五、Nginx调整上传文件大小
在nginx使用上传文件的过程中,通常需要设置文件大小限制,避免出现 413 Request Entity Too Lar
1.nginx上传文件大小限制配置语法
Syntax: client_max_body_size size;
Default: client_max_body_size 1m;
Context: http, server, location
2.nginx长传文件大小限制配置示例
[root@lb02 conf.d]# vim /etc/nginx/nginx.conf
#也可以放入http层,全局生效
server {
listen 80;
server_name _;
client_max_body_size 500m;
}