Nginx是个啥
Nginx (engine x) 是一个高性能的HTTP静态页面服务器,更是一个常用的反向代理服务器,同时还可以作为IMAP/POP3/SMTP代理服务器。
经常使用Nginx服务器,进行一些简单配置,但只是从网上照抄,知其然不知其所以然。
本文,我们主要学习一下nginx的目录结构和基础规则,补一补nginx基础。
目录结构
因为nginx目录是可以指定的,所以真实使用的目录结构请以命令查看。ps aux | grep nginx
配置目录
可能的默认配置目录:
1 | nginx/ |
nginx.conf一般放在这两个目录中,nginx.conf中会写清楚子配置目录,比如:
1 | http { |
那么,子配置文件就放在 /etc/nginx/conf.d/ 目录中,并且子配置文件必须以 .conf 结尾。一般情况下,我们比较少修改 nginx.conf,大部分时候都是修改子配置文件。
根目录
可能的默认根目录:
1 | /usr/share/nginx/html |
根目录下一般会有nginx自带的index.html和50x.html。
curl ${nginx_server}
时看到内容,就是index.html文件中的内容。
我们自己的静态页面项目,最好不要放到默认根目录下,因为默认根目录可以通过ip和路径访问到,这往往是不符合预期的。
推荐的静态页面项目目录为:/usr/share/nginx/work
日志目录
可能的默认日志目录:
1 | /var/log/nginx |
日志文件中一般有两个日志文件,error.log和access.log。
常见配置
静态页面服务器配置
1 | server { |
这个配置,是一个标准的静态页面服务器配置。
使用以上配置,如果已经配置好了域名解析,那么访问 www.voidking.com 时,就会看到nginx首页,也就是 index.html。
反向代理到其他域名
1 | server { |
使用以上配置,访问 www.voidking.com 时,实际上看到的是 voidking.coding.me 这个域名返回的内容。
反向代理到一个服务
1 | server { |
使用以上配置,访问 www.voidking.com 时,实际上看到的是 192.168.56.101:8080 这个服务返回的内容。
反向代理到upstream
1 | upstream www_voidking_com{ |
使用以上配置,访问 www.voidking.com 时,实际上看到的是upstream里的服务返回的内容。
但是问题来了,upstream里有三个服务,到底是哪个服务返回的内容呢?答:不一定,这就要用到传说中的加权轮询算法了。
三个服务的权值分别为 5、2、1(默认),从权值来看,最大可能打到第一个服务。
有没有想到什么知识点?没错,负载均衡,使用了加权轮询算法的负载均衡。
基础规则
location规则
在常见配置中,我们看到了一个叫 location 的关键字。location规则为:
1 | location [ = | ~ | ~* | ^~ ] uri { ... } |
紧跟在location后面的,是可选的修饰符,uri是要匹配的字符串。
常见修饰符:
=
普通匹配。只有请求的url路径与后面的字符串完全相等时,才会命中。空
普通匹配。/
普通匹配。^~
普通匹配。匹配到了uri,则不再进行正则匹配。~
正则匹配。区分大小写。~*
正则匹配。不区分大小写。
匹配规则
匹配过程:
1、先普通匹配,再正则匹配。
2、普通匹配:按最大前缀匹配。若=
或^~
匹配到了,则不再进行后续正则匹配。
3、正则匹配:按配置顺序进行匹配,若匹配到了,则不再进行后续正则匹配。
4、普通匹配和正则匹配都有结果,优先使用正则匹配结果。
proxy_pass规则
如果nginx作为反向代理使用,那么必须要搞明白的就是proxy_pass的规则,这关系到请求能否打到正确的接口。
proxy_pass规则:
- 如果proxy_pass后面没有路径,那么转发时带上uri
- 如果proxy_pass后面有路径,那么转发时使用该路径替换匹配到的uri
保留uri
1 | location /test { |
访问 www.voidking.com/test/index 会被代理到 http://192.168.56.101:8080/test/index 这个url,/test/index
被保留转发给了后端服务。
去掉uri
1 | location /test { |
访问 www.voidking.com/test/index 会被代理到 http://192.168.56.101:8080/index 这个url,/test
被去掉了。
替换uri
1 | location /test { |
访问 www.voidking.com/test/index 会被代理到 http://192.168.56.101:8080/qa/index 这个url,/test/index
被替换成了 /qa/index
,然后转发给了后端服务。
1 | location /test { |
访问 www.voidking.com/test/index 会被代理到 http://192.168.56.101:8080/qaindex 这个url,/test/index
被替换成了 /qaindex
,然后转发给了后端服务。
状态码
- 1xx:信息响应类,表示接收到请求并且继续处理
- 2xx:处理成功响应类,表示动作被成功接收、理解和接受
- 3xx:重定向响应类,为了完成指定的动作,必须接受进一步处理
- 4xx:客户端错误,客户请求包含语法错误或者是不能正确执行
- 5xx:服务端错误,服务器不能正确执行一个正确的请求
详情参考HTTP 状态码详解与选用