Linux架构之Nginx 常见问题

Stella981
• 阅读 782

第54章 Nginx常见问题

一、Nginx多Sever优先级

在开始处理一个http请求时,nginx会取出header头中的Host变量,与nginx.conf中每个serverserver_name进行匹配,由此决定到底由哪一个server来处理这个请求。但如果nginx配置多个相同的server_name,会导致server_name出现优先级访问冲突。

[root@web01 conf.d]# cd ~[root@web01 ~]# cd /etc/nginx/conf.d/​1、#配置nginx(server1.conf)[root@web01 conf.d]# vim server1.confserver {   listen 80;   server_name localhost server1.com;​   location / {       root /code/test1;       index index.html;   }}​#配置nginx(server2.conf)[root@web01 conf.d]# vim server2.confserver {   listen 80;   server_name localhost server2.com;​   location / {       root /code/test2;       index index.html;   }}​​#配置nginx(server3.conf)[root@web01 conf.d]# vim server3.confserver {   listen 80;   server_name localhost server3.com;​   location / {       root /code/test3;       index index.html;   }}​​

2、#准备站点目录[root@web01 conf.d]# mkdir /code/test{1..3}[root@web01 conf.d]# echo test1 > /code/test1/index.html[root@web01 conf.d]# echo test2 > /code/test2/index.html[root@web01 conf.d]# echo test3 > /code/test3/index.html​

3、#检查语法提示冲突,忽略并重启[root@web01 conf.d]# nginx -tnginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignorednginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignorednginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignorednginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful[root@web01 conf.d]# nginx -s reload​

/etc/nginx/conf.d中,把其他conf文件都打包一下,只留server1.confserver2.confserver3.conf

4、#根据ip访问#1. 用户第一次访问,读取server1.conf配置返回结果[root@web01 code]# curl 10.0.0.7test1​​5、#此时将server1.conf修改为server4.conf重启nginx[root@web01 code]# cd /etc/nginx/conf.d/[root@lb01 conf.d]# mv server1.conf server4.conf[root@lb01 conf.d]# nginx -s reload​6、#windows键+R,输入drivers,找到etc目录,进入etc目录,找到host域名解析文件,修改内容如下:10.0.0.7 server1.com server2.com server3.com​​7、#检查并重启nginx[root@web01 conf.d]# nginx -tnginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignorednginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignorednginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignorednginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful[root@web01 conf.d]# nginx -s reload​8、#再次访问时,读取server2.conf配置返回结果[root@web01 conf.d]# curl 10.0.0.7test2

测试访问效果,打开浏览器,输入server1.com

 Linux架构之Nginx 常见问题

将server1.conf修改为server4.conf重启nginx,测试访问效果,打开浏览器,输入server2.com

Linux架构之Nginx 常见问题

Server_name优先级总结

再开始处理一个HTTP请求时,Nginx会读取header(请求头)中的host,与每个server中的server_name进行匹配,来决定用哪一个server标签来完成处理这个请求,有可能一个Host与多个server中的server_name都匹配,这个时候就会根据匹配优先级来选择实际处理的server。优先级匹配结果如下:

1.首先选择所有的字符串完全匹配的server_name。(完全匹配)

2.选择通配符在前面的server_name,如_.haoda.com www.haoda.com_

3.选择通配符在后面的server_name,如bgx.* haoda.com haoda.cn

4.最后选择使用正则表达式匹配的server_name

5.如果全部都没有匹配到,那么将选择在listen配置项后加入[default_server]的server块

6.如果没写,那么就找到匹配listen端口的第一个Server块的配置文件

注意:当出现多个相同的server_name情况下,配置文件排序优先使用则会被调用,所以建议配置相同端口,不同域名,这样不会出现域名访问冲突。

===========================================================

二、Nginx禁止IP直接访问

当用户通过访问IP或者未知域名访问你得网站的时候,你希望禁止显示任何有效内容,可以给他返回500,目前国内很多机房都要求网站关闭空主机头,防止未备案的域名指向过来造成麻烦。

方式1:Nginx禁止IP访问

#配置nginx[root@web01 conf.d]# cd /etc/nginx/conf.d/[root@web01 conf.d]# vim server4.confserver {       listen 80 default_server;           #默认优先返回;       server_name _;                     #空主机头或者IP;       return 500;                         #直接返回500错误;​}​#windows键+R,输入drivers,找到etc目录,进入etc目录,找到host域名解析文件,注释内容如下:10.0.0.7 server1.com server2.com server3.com​#检查并重启nginx[root@web01 conf.d]# nginx -tnginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignorednginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignorednginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful[root@web01 conf.d]# nginx -s reloadnginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignorednginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored​​​测试访问效果,打开浏览器,输入10.0.0.7

 Linux架构之Nginx 常见问题

方式2:通过引流的方式将访问的IP直接跳转主站域名

#配置nginx[root@web01 conf.d]# cd /etc/nginx/conf.d/[root@web01 conf.d]# vim server4.confserver {       listen 80 default_server;       server_name _;       return 302 http://server1.com;​}​[root@web01 conf.d]# mkdir /code/test1[root@web01 conf.d]# echo test1 > /code/test1/index.html​#windows键+R,输入drivers,找到etc目录,进入etc目录,找到host域名解析文件,输入内容如下:10.0.0.7 server1.com​[root@web01 conf.d]# nginx -tnginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignorednginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignorednginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful[root@web01 conf.d]# nginx -s reloadnginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignorednginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored​

测试访问效果,打开浏览器,输入10.0.0.7

Linux架构之Nginx 常见问题

===========================================================

三、Nginx路径root与alias

root与alias路径匹配主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上,alias是一个目录别名的定义,root则是最上层目录的定义。

root的处理结果是:root路径+location路径

alias的处理结果是:使用alias定义的路径

3.1)使用root时,

用户访问img.haoda.com/images/pic2.jpg时,实际上Nginx会到/code/img/目录下找pic2.jpg文件

#配置nginx[root@web01 conf.d]# cd /etc/nginx/conf.d/[root@web01 conf.d]# vim img.conf server{       listen 80;       server_name img.haoda.com;​       location /images {               root /code/img/;       }}​#在code目录下创建img目录[root@web01 code]# cd ~[root@web01 ~]# mkdir -p /code/img/​#在img目录下上传图片[root@web01 code]# cd img[root@web01 img]# rz -Erz waiting to receive.​​#windows键+R,输入drivers,找到etc目录,进入etc目录,找到host域名解析文件,输入内容如下:10.0.0.7 img.haoda.com​#检查并重启nginx[root@web01 img]# nginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful[root@web01 img]# nginx -s reload​​​​

打开浏览器,输入http://img.haoda.com/images/pic2.jpg

 Linux架构之Nginx 常见问题

监控错误日志([root@web01 img]# tail -f /var/log/nginx/error.log),可以看到图片实际上存放的路径

 Linux架构之Nginx 常见问题

解决方案:在/code/img目录下创建images目录,将img目录下的图片移至images

​[root@web01 img]# mkdir -p /code/img/images/[root@web01 images]# rz -Erz waiting to receive.​#windows键+R,输入drivers,找到etc目录,进入etc目录,找到host域名解析文件,输入内容如下:10.0.0.7 img.haoda.com​#检查并重启nginx[root@web01 img]# nginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful[root@web01 img]# nginx -s reload​

打开浏览器,输入http://img.haoda.com/images/pic2.jpg

 Linux架构之Nginx 常见问题

使用alias,线上一般使用alias

#使用alias,即/images等价于/code/imgserver{        listen 80;        server_name img.haoda.com;​       location /images {               alias /code/img;       }}​#在/code/img目录下存在图片​​#windows键+R,输入drivers,找到etc目录,进入etc目录,找到host域名解析文件,输入内容如下:10.0.0.7 img.haoda.com​#检查并重启nginx[root@web01 img]# nginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful[root@web01 img]# nginx -s reload​

打开浏览器,输入http://img.haoda.com/images/pic2.jpg

 Linux架构之Nginx 常见问题

===========================================================

四、Nginx try_file路径匹配

nginx的try_file路径匹配,Nginx会按顺序检查文件及目录是否存在(根据 root 和 alias 指令设置的参数构造完整的文件路径),并用找到的第一个文件提供服务。在元素名后面添加斜杠 / 表示这个是目录。如果文件和目录都不存在,Nginx会执行内部重定向,跳转到命令的最后一个 uri 参数定义的 URI 中。

4.1)Nginx try_file配置示例1

#1.配置nginx[root@web01 img]# cd /etc/nginx/conf.d/[root@web01 conf.d]# vim try.conf server {   listen 80;   server_name try.haoda.com;   root /code;   index index.html;​   location / {         try_files $uri /404.html;   }}​​#2. 创建实例目录与文件[root@web01 conf.d]# echo try111 > /code/index.html[root@lb01 conf.d]# echo '404 404 404' > /code/404.html​#3.windows键+R,输入drivers,找到etc目录,进入etc目录,找到host域名解析文件,输入内容如下:10.0.0.7 try.haoda.com​#4.检查并重启nginx[root@web01 img]# nginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful[root@web01 img]# nginx -s reload​​

打开浏览器,输入try.haoda.com

(显示结果的解释:由于访问的是try.haoda.com,而$uri取得是域名后面我们写的内容,由于输入信息时域名后面没有内容,它找不到,所以返回$uri中后面的内容,即404.html)

 Linux架构之Nginx 常见问题

打开浏览器,输入try.haoda.com/index.html

(显示结果的解释:由于访问的是try.haoda.com/index.html,而$uri取到了index.html所以返回/code/index.html的内容)

 Linux架构之Nginx 常见问题

#此时修改配置文件server {    listen 80;    server_name try.haoda.com;   root /code;   index index.html;​   location / {         try_files $uri $uri/ /404.html;   }   }​#windows键+R,输入drivers,找到etc目录,进入etc目录,找到host域名解析文件,输入内容如下:10.0.0.7 try.haoda.com​#检查并重启nginx[root@web01 img]# nginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful[root@web01 img]# nginx -s reload​

打开浏览器,输入try.haoda.com

(我们访问的是try.haoda.com,而$uri是域名后面的内容,我们在输入域名信息时,域名后面没有写任何内容,因此没有匹配到第一个$uri,于是第二个$uri就是“空/”,他访问的便是“空/”,也就是我们在浏览器中输入try.haoda.com/,跳转index页面,进的是根,就是root,即匹配到/code/index.html)

Linux架构之Nginx 常见问题

===========================================================

4.2)Nginx try_file配置示例2

#1. 配置nginx[root@web01 conf.d]# vim try.conf server {    listen 80;   server_name try.haoda.com;   root /code;   index index.html;​   location / {       try_files $uri $uri/ @java;             #当$uri和$uri/都匹配不到时,由后端的java来进行处理,名字可自定义,但一定要加@   }​   location @java {   proxy_pass http://172.16.1.8:8080;         #配置后端tomcat   }}​#2. 在web02上配置后端tomcat[root@web02 ~]# cd /usr/share/tomcat/webapps/ROOT[root@web02 ROOT]# echo 'i am tomcat' > index.html[root@web02 ROOT]# systemctl start tomcat​#3. 把文件都挪走[root@lb01 code]# mv index.html index1.html /tmp/​#4.检查并重启nginx[root@web01 code]# nginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful[root@web01 code]# nginx -s reload​​#5. 测试访问[root@lb01 code]# curl http://try.haoda.com/index.htmli am tomcat

 

===========================================================

五、Nginx优雅显示错误页面

error_page错误日志

5.1)第一种配置情况1(跳转网络地址)

#配置nginx[root@web01 code]# cd /etc/nginx/conf.d/[root@web01 conf.d]# vim error.confserver {   listen       80;   server_name www.haoda.com;   root /code;​   location / {       index index.html;       error_page 404 http://www.baidu.com;   }}​恢复/code目录下index.html,使得该文件没被压缩​#windows键+R,输入drivers,找到etc目录,进入etc目录,找到host域名解析文件,输入内容如下:10.0.0.7 www.haoda.com​#检查并重启nginx[root@web01 code]# nginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful[root@web01 code]# nginx -s reload​

打开浏览器,输入error.haoda.com/11,页面自动跳转到百度首页

 Linux架构之Nginx 常见问题

5.2)第二种配置情况1(跳转404图片)

#配置nginx[root@web01 code]# cd /etc/nginx/conf.d/[root@web01 conf.d]# vim error.confserver {   listen       80;   server_name error.haoda.com;   root /code;​   location / {       index index.html;   }​   error_page 404 403 /404.jpg;}​#在code目录下上传404.jpg[root@web01 conf.d]# cd /code[root@web01 code]# lltotal 80212-rw-r--r-- 1 root root       12 Sep 2 19:11 404.html-rw-r--r-- 1 root root   29239 Sep 2 20:30 404.jpg​#windows键+R,输入drivers,找到etc目录,进入etc目录,找到host域名解析文件,输入内容如下:10.0.0.7 error.haoda.com​#检查并重启nginx[root@web01 code]# nginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful[root@web01 code]# nginx -s reload

打开浏览器,输入error.haoda.com,显示404图片

 Linux架构之Nginx 常见问题

5.3)第二种配置情况2(跳转本地地址)

#配置nginx[root@web01 code]# cd /etc/nginx/conf.d/[root@web01 conf.d]# vim error.confserver {   listen       80;   server_name error.haoda.com;   root /code;​   location / {       index index.html;   }​   error_page 403 404 /404.html;   location = /404.html {       root /code;       index index.html;      }}​​​#windows键+R,输入drivers,找到etc目录,进入etc目录,找到host域名解析文件,输入内容如下:10.0.0.7 error.haoda.com​[root@web01 code]# cat 404.html 404 404 404[root@web01 code]# cat index.htmltry111​​​#检查并重启nginx[root@web01 code]# nginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful[root@web01 code]# nginx -s reload

打开浏览器,输入error.haoda.com,显示404.html页面

Linux架构之Nginx 常见问题

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
3年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这