Nginx是一款高性能的反向代理和负载均衡工具。
而Nginx配置是指导Nginx转发请求的文件。
下面是一个示例配置文件。我们可以看到整个配置文件的结构很简单,即由一些全局指令(例如配置工作进程数等)和一些针对特定功能的指令块(例如http配置)构成。
指令块之中还可以嵌套指令块,以完成一些更加复杂的配置。而且子指令块中的配置如果缺省,可以从父指令块中进行获取,进一步简化了配置文件。
http配置是最常用的配置。它最主要的几个组成部分是upstream
指令配置的负载均衡器,和server
指令配置的虚拟服务器。
server
指令最主要的一个工作是配置反向代理,当我们访问指定网址时,Nginx帮我们把请求转发给目标服务器。但是此时对于用户端来说是无感知的。
这里我先使用express在本机3000和3001端口创建了2个Node服务,分别返回其对应的端口号。
现在我期望在访问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 ;
events {
worker_connections ;
}
http {
server {
listen ;
server_name localhost;
location / {
proxy_pass http://127.0.0.1:;
}
location / {
proxy_pass http://127.0.0.1:;
}
error_page /x.html;
location = /x.html {
root html;
}
}
}
我们看到这里报出来了node的异常,因为Nginx仅把请求转发给对应的服务器,并不会修改uri,所以这里实际请求的是127.0.0.1:3001/3001,而我没有在Node中对此路由进行处理,所以Node返回了404
不过我们可以从vs的输出中看到的确获得了请求。
我们看到还有一个location
它没有使用proxy_pass
,而是使用了root
指令。
这个指令是将对应的请求转发至Nginx服务器中,指定文件目录,这里是html/50x.html文件
可以看到这个文件的确就在Nginx的指定目录下。
因此root
指令就可以将静态资源的请求直接定位到文件系统,实现动静分离的需求。
Nginx另一个强大的功能是配置负载均衡。
这里我用upstream
指令配置了一个叫做backend的负载均衡器。另外将 location
为\
的请求转发至这个负载均衡器。
在backend中,我用server
指令定义了2个服务器,分别指向本机的3000端口和3001端口。此外对于3000端口的服务器配置了权重为2(默认为1)。
这样现在对本机8080端口的请求,会按照2:1的比例转发至3000端口和3001端口。
worker_processes ;
events {
worker_connections ;
}
http {
upstream backend {
server 127.0.0.1: weight=;
server 127.0.0.1:;
}
server {
listen ;
server_name localhost;
location / {
proxy_pass http://backend;
}
error_page /x.html;
location = /x.html {
root html;
}
}
}
当然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 ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。