一般来讲nginx正常启动或reload时是不会报任何提示的,一般出现提示表示配置文件写错了。或者nginx二进制文件模块不全。当然会有特殊情况,有提示不一定是配置文件写错了,而没提示不代表能正常运行,我最近都遇到了。
1. Tomcat获取来自nginx转发的真实IP
- 在nginx.conf中添加如下内容
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
- 在tomcat server.xml 中的Host标签最后追加如下内容
<Valve className="org.apache.catalina.valves.RemoteIpValve" />
2.nginx autoindex相关
首先贴一下常用的一些属性:
autoindex on;
# 文件大小 人性化 显示
autoindex_exact_size off;
# 文件的时间基准为服务器的时间
autoindex_localtime on;
# 解决部分浏览器乱码
charset utf-8,gbk;
root相对路径
开启autoindex之后需要指定root路径
如果是手动编译安装的话,root 相对路径为nginx的根目录
如果是yum安装的话,则是/etc/nginx
所以,如果要展示的内容刚好在这个路径上的话,则可以直接写 root ./
403权限不足
该错误通常在开启nginx的autoindex功能之后出现,原因是nginx默认的用户对于autoindex指定的目录读写权限不足导致。最简答的解决办法,直接在配置文件头部加一句user root;
即表示让nginx以root权限运行
404找不到页面
先看一段配置
这段配置表示,当访问download.yionr.cloud/a
时,实际访问的服务器路径为/etc/nginx/a
需要注意的是,这个路径是root和location 拼接起来的结果,而不是单单由root决定的。
当location的格式为 /xxx
时,浏览器访问域名+uri
(uri末尾不人为地添加一个斜杠)会自动的在uri的最后面加上一个/
但是!当location的格式为/xxx/
时,浏览器如果访问这个域名+uri
,而结尾不人为带上一个斜杠,则部分浏览器不会自动加上一个斜杠,导致最终结果就会因为找不到目标资源而404
实测在Chrome中无论哪种配置,都会自动在末尾添加斜杠。
502 Bad Gateway
这个报错主要是在我改成使用docker部署nginx刚开始出现的错误。
在之前我都是所有配置直接在nginx.conf里面写的,但是如果是yum安装的nginx,则会将配置文件分散,并在nginx.conf中include conf.d/*.conf
。 从原理上来讲,无论哪种方式配置都不会有问题,但是!如果版本变了呢?如果nginx版本变了之后,官方的配置发生了一点略微的改变,那再直接拿之前nginx.conf覆盖就很要命了。而conf.d下的conf文件内容都只有server{}
块的内容,这里面的东西是不容易随着版本变化而变化的。所以,请不要再将所有配置都写在nginx.conf中了,而且分开写还方便自己找呢! 但是如果都写在nginx.conf中,如果要迁移配置,而两边nginx版本、环境不同的话,就可能会发生问题!比如502.
如果你和我之前一样,迁移nginx.conf到不同版本了,然后改了配置文件reload一下,发现没什么报错,而配置文件感觉跟没生效一样,然后访问后来配置的域名都很莫名其妙的502了,那就是你的配置文件没生效,不用怀疑了,这是我怀疑了好几天的结果!请立刻,将配置文件打散,你的问题马上就会解决掉。
所以在用docker部署nginx的时候,一个要注意的就是要使用 --network host
,而不是用-p加端口映射,否则因为docker的网络机制,在配置文件里面配置的localhost不是代表宿主机,而是代表docker虚拟子网下这个容器。就会出现访问不到宿主机docker部署的其他服务的情况。另一个要注意的就是,不要映射nginx.conf文件了,改成映射conf.d文件夹。