Nginx-Note
Nginx这工具我早有耳闻,但出于种种原因(偷懒罢了),我始终没尝试学习、使用。如今,课程正好涉及,我也就顺便学学看咯。
Nginx本质是一个轻量级的Web服务器。作为Web服务器,其行为无非接受http请求,返回http响应。
但Nginx能名誉互联网,必然有其过人之处——虚拟Web服务器、反向代理、负载均衡。
三个名词我就不一一解释了,作为一篇初心者笔记,还是以记录如何配置使用为主。
Nginx配置文件结构
Nginx的配置文件默认为nginx.conf,在nginx可执行文件的同一文件夹下。当然,也可以在执行时使用-c filename参数指定本次启动的配置文件。
Nginx的配置文件大体结构如下:
1 |
|
全局、events、http三个板块分别定义了Nginx总体运作模式、事件监听器、http服务器。
全局定义
提及全局定义,不得不提一提Nginx的运作模式。
略~
events定义
略~
http定义
全局定义与events定义,设定了Nginx作为一个Web服务器的资源使用与性能,而http则定义了Nginx的行为,使其能够满足我们的需求,因而http定义也是最重要的。
1 | http{ |
我们先仔细看看http定义的组成:http全局定义、server、upstream。
后两者构成了Nginx行为的核心。
server定义
Server即服务器、主机的意思,那么此处的Server指的是什么呢?指的就是虚拟主机。
Nginx是Web服务器,但其不仅仅只运行一个网站,而是作为一个Web服务器的容器,其中可以放置多个网站,每个网站都有自己的虚拟主机名,这些网站可以被访问,也可以被其他网站访问。
通过配置多个Server,即多台虚拟主机,Nginx就可以实现一个程序实现多个网站的行为。
1 | server{ |
Server的定义包含listen port、server_name、location三个部分。
- listen port: 用于指定该虚拟主机监听的port、IP地址。
- sever_name: 被Nginx用于在多台虚拟主机监听重叠时判定归属。
- location:定义了该虚拟主机的路径映射。
其中,通过location到不同文件夹(root),我们即可实现不同网站的不同内容;同时,在location中使用proxy_pass,即可将请求转发给其他网站,实现代理。
PS:此处还有 rewrite 与 proxy_set_header 两个部分,这两个部分暂且省略——我也不大会。有需求可以参考Nginx的文档/或者等我补档。
PS:此处还有两点需要注意:
- location后的/api/ 需以/结尾,否则会被认为是文件,当然,现代浏览器一般都会自动补全/。
- 当仅仅作为其他网站的代理,而非upsteam中配hi的集群时,proxy_pass 后的网址的末尾的/具有相当大的重要性。如果没有,则被衔接为代理到 http://backend/api/;而有的话,则被代理到 http://backend/。当然,如果location后为 / 则无所谓咯。
upstream
上文说到,配置server的location可以实现代理,但是如果需要实现一个location代理到多个同样的网站(也就是负载均衡),那么就需要配置upstream,即虚拟主机的集群,当然,也不一定是虚拟主机,也可以是真实的集群——或者随便配置点其他网站玩玩看。
1 | upstream backend { |
如上面的配置,即将backend的代理请求转发至8.8.8.8:80和7.7.7.7:80,具体分配,则看所配置的负载均衡算法,我也就不作赘述了。
http全局定义
在Web主机中,许多配置是相同的,比如:识别的MIME、对文件是否压缩的处理等等。诚然,我们可以在每个server中进行详细配置,但是,如果能一次配置,处处使用起步更好?
server在运行中对这些配置的搜索就跟编程代码一致,从内向外,从小作用域到大作用域进行搜索。于是,只要在http全局定义中进行配置,内部无配置的server就会最终在http中找到配置信息,而对有特殊需求的server,在其内部另行配置即可。
参考资料: