Nginx大家想必都听说过,今天简单介绍下Nginx的配置使用。


Nginx和Nginx配置

Nginx是一款高性能的反向代理和负载均衡工具。

而Nginx配置是指导Nginx转发请求的文件。

下面是一个示例配置文件。我们可以看到整个配置文件的结构很简单,即由一些全局指令(例如配置工作进程数等)和一些针对特定功能的指令块(例如http配置)构成。

指令块之中还可以嵌套指令块,以完成一些更加复杂的配置。而且子指令块中的配置如果缺省,可以从父指令块中进行获取,进一步简化了配置文件。

image-20200224193120460

Nginx的Http配置

http配置是最常用的配置。它最主要的几个组成部分是upstream指令配置的负载均衡器,和server指令配置的虚拟服务器。

image-20200224194648370

配置反向代理

server指令最主要的一个工作是配置反向代理,当我们访问指定网址时,Nginx帮我们把请求转发给目标服务器。但是此时对于用户端来说是无感知的。

这里我先使用express在本机3000和3001端口创建了2个Node服务,分别返回其对应的端口号。

image-20200224195223604

image-20200224195239048

现在我期望在访问localhost:8080/3000时,请求能转发至localhost:3000,当我访问localhost:8080/3001时,请求转发至localhost:3001

下面是对应的Nginx配置。这个配置在http指令块中定义了一个虚拟服务器,监听本机的8080端口。

location会匹配请求的uri,如果是以/3000开头,就通过proxy_pass指令将请求转发给127.0.0.1:3000。如果是以/3001开头,就通过proxy_pass指令将请求转发给127.0.0.1:3001

worker_processes 1;

events {
    worker_connections 1024;
}

http {
    server {
        listen 8080;
        server_name localhost;
        location /3000 {
            proxy_pass http://127.0.0.1:3000;

        }

        location /3001 {
            proxy_pass http://127.0.0.1:3001;
        }
        
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }

}

我们看到这里报出来了node的异常,因为Nginx仅把请求转发给对应的服务器,并不会修改uri,所以这里实际请求的是127.0.0.1:3001/3001,而我没有在Node中对此路由进行处理,所以Node返回了404

image-20200224200448738

不过我们可以从vs的输出中看到的确获得了请求。

image-20200224200755716

配置静态文件服务

我们看到还有一个location它没有使用proxy_pass,而是使用了root指令。

这个指令是将对应的请求转发至Nginx服务器中,指定文件目录,这里是html/50x.html文件

image-20200224201357179

可以看到这个文件的确就在Nginx的指定目录下。

image-20200224201629814

image-20200224201710849 因此root指令就可以将静态资源的请求直接定位到文件系统,实现动静分离的需求。

配置负载均衡

Nginx另一个强大的功能是配置负载均衡。

这里我用upstream指令配置了一个叫做backend的负载均衡器。另外将 location\的请求转发至这个负载均衡器。

在backend中,我用server指令定义了2个服务器,分别指向本机的3000端口和3001端口。此外对于3000端口的服务器配置了权重为2(默认为1)。

这样现在对本机8080端口的请求,会按照2:1的比例转发至3000端口和3001端口。

worker_processes 1;

events {
    worker_connections 1024;
}

http {
    upstream backend {
        server 127.0.0.1:3000 weight=2;
        server 127.0.0.1:3001;
    }

    server {
        listen 8080;
        server_name localhost;
        location / {
            proxy_pass http://backend;
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }
}

image-20200224202555690

image-20200224202605722

当然Nginx还可以通过轮询(默认),最小连接优先(least_conn指令),按ip固定服务器(ip_hash指令)等多种方式进行配置。

具体可以参考NGINX Docs - HTTP Load Balancing小节


参考文档:


本文会经常更新,请阅读原文: https://xinyuehtx.github.io/post/Nginx%E9%85%8D%E7%BD%AE%E5%85%A5%E9%97%A8.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名黄腾霄(包含链接: https://xinyuehtx.github.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系