Nginx-Note

Nginx这工具我早有耳闻,但出于种种原因(偷懒罢了),我始终没尝试学习、使用。如今,课程正好涉及,我也就顺便学学看咯。

Nginx本质是一个轻量级的Web服务器。作为Web服务器,其行为无非接受http请求,返回http响应。

但Nginx能名誉互联网,必然有其过人之处——虚拟Web服务器、反向代理、负载均衡。

三个名词我就不一一解释了,作为一篇初心者笔记,还是以记录如何配置使用为主。

Nginx配置文件结构

Nginx的配置文件默认为nginx.conf,在nginx可执行文件的同一文件夹下。当然,也可以在执行时使用-c filename参数指定本次启动的配置文件。

Nginx的配置文件大体结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

-------------nginx.conf-------------
#全局
worker_processes 1;

#events定义
events{
work_connections 1024;
}

#http定义
http{

include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;

server{
listen 80;
server_name www.example.com;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}

location /api {
proxy_pass http://
}
}
----------------end------------------

全局、events、http三个板块分别定义了Nginx总体运作模式、事件监听器、http服务器。

全局定义

提及全局定义,不得不提一提Nginx的运作模式。

略~

events定义

略~

http定义

全局定义与events定义,设定了Nginx作为一个Web服务器的资源使用与性能,而http则定义了Nginx的行为,使其能够满足我们的需求,因而http定义也是最重要的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
http{

include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;

server{
listen 80;
server_name www.example.com;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}

location /api {
proxy_pass http://backend;
}

upstream backend {
server 8.8.8.8:80;

# 如果有多个backend,可以在这里添加多个server
}

}

我们先仔细看看http定义的组成:http全局定义、server、upstream。

后两者构成了Nginx行为的核心。

server定义

Server即服务器、主机的意思,那么此处的Server指的是什么呢?指的就是虚拟主机。

Nginx是Web服务器,但其不仅仅只运行一个网站,而是作为一个Web服务器的容器,其中可以放置多个网站,每个网站都有自己的虚拟主机名,这些网站可以被访问,也可以被其他网站访问。

通过配置多个Server,即多台虚拟主机,Nginx就可以实现一个程序实现多个网站的行为。

1
2
3
4
5
6
7
8
9
10
11
server{
listen 80;
server_name www.example.com;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}

location /api/ {
proxy_pass http://backend;
}

Server的定义包含listen port、server_name、location三个部分。

  1. listen port: 用于指定该虚拟主机监听的port、IP地址。
  2. sever_name: 被Nginx用于在多台虚拟主机监听重叠时判定归属。
  3. location:定义了该虚拟主机的路径映射。

其中,通过location到不同文件夹(root),我们即可实现不同网站的不同内容;同时,在location中使用proxy_pass,即可将请求转发给其他网站,实现代理。

PS:此处还有 rewrite 与 proxy_set_header 两个部分,这两个部分暂且省略——我也不大会。有需求可以参考Nginx的文档/或者等我补档。

PS:此处还有两点需要注意:

  1. location后的/api/ 需以/结尾,否则会被认为是文件,当然,现代浏览器一般都会自动补全/。
  2. 当仅仅作为其他网站的代理,而非upsteam中配hi的集群时,proxy_pass 后的网址的末尾的/具有相当大的重要性。如果没有,则被衔接为代理到 http://backend/api/;而有的话,则被代理到 http://backend/。当然,如果location后为 / 则无所谓咯。

upstream

上文说到,配置server的location可以实现代理,但是如果需要实现一个location代理到多个同样的网站(也就是负载均衡),那么就需要配置upstream,即虚拟主机的集群,当然,也不一定是虚拟主机,也可以是真实的集群——或者随便配置点其他网站玩玩看。

1
2
3
4
upstream backend {
server 8.8.8.8:80;
server 7.7.7.7:80;
}

如上面的配置,即将backend的代理请求转发至8.8.8.8:80和7.7.7.7:80,具体分配,则看所配置的负载均衡算法,我也就不作赘述了。

http全局定义

在Web主机中,许多配置是相同的,比如:识别的MIME、对文件是否压缩的处理等等。诚然,我们可以在每个server中进行详细配置,但是,如果能一次配置,处处使用起步更好?

server在运行中对这些配置的搜索就跟编程代码一致,从内向外,从小作用域到大作用域进行搜索。于是,只要在http全局定义中进行配置,内部无配置的server就会最终在http中找到配置信息,而对有特殊需求的server,在其内部另行配置即可。

参考资料:

路上遇见的好博客