Nginx是一个高性能的HTTP和反向代理web服务器。其特点是占用内存少,并发能力强。
特点 | 描述 |
占有内存少 | 保持10,000个没有活动的连接,只占2.5M内存 |
并发能力强 | Nginx能支持高达50,000个并发连接数 |
在实际的项目中,Nginx常用功能有反向代理,负载均衡和静态服务器,达到提高服务器的防护、速度和可靠度的目的。
反向代理是一种服务器架构模式,客户端发送的请求首先到达反向代理服务器,由反向代理服务器再转发给后端的真实服务器,最后反向代理服务器将后端服务器的响应结果返回给客户端。在这个过程中,客户端只会与反向代理服务器进行通信,而不会直接与后端真实服务器进行通信,反向代理服务器会处理和转发所有的请求和响应。
负载均衡是反向代理的一项重要功能,即将请求分发到多个后端服务器,实现负载均衡。每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。
当Nginx被用作静态服务器时,其主要功能是托管和提供静态资源,如HTML文件、图片、CSS文件和JavaScript文件等。这些静态资源是由开发者或运维人员预先上传到Nginx服务器上的,而Nginx则负责提供对这些静态资源的访问服务。
什么场景考虑用Nginx?
使用Nginx反向代理隐藏目标服务器的真实IP地址和端口,来保护服务器资源,还可以通过配置进行流量清洗,过滤掉恶意流量和请求,保护后端服务器免受攻击(非杜绝)。
server {
listen 80;
server_name example.com;
location /prod-api/ {
proxy_pass http://backend_server_address;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Range $http_range;
proxy_set_header If-Range $http_if_range;
}
}
#上述配置将监听80端口,并将匹配到的请求转发到后端服务器(backend_server_address)。
前后端分离的项目,Nginx适合部署前端代码。Nginx提供高效的静态文件服务和缓存机制,将前端代码部署到Nginx上,提高网站的响应速度和性能。
server {
listen 80;
server_name example.com;
location / {
root html/dist;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
}
#在上面的配置中,前端工程dist部署在Nginx解压包的\html目录下
#浏览器输入example.com 即可打开dist/index.html页面
Nginx本身支持高并发的访问,还可以通过优化Nginx反向代理配置,比如配置负载均衡,快速响应大量的请求。
下面是Nginx负载均衡的常用策略配置,包括轮询,权重,IP Hash,url_hash。
轮询
http {
upstream backend_servers {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
...
}
}
#轮询:轮询是默认的负载均衡方式,按照时间顺序将请求分配给不同的后端服务器。
?权重
http {
upstream backend_servers {
server backend1.example.com weight=2;
server backend2.example.com weight=1;
server backend3.example.com weight=1;
}
server {
...
}
}
#权重:权重越高处理请求的比例越高。
?IP Hash
http {
upstream backend_servers {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
...
}
}
#IP Hash:由于IP地址具有唯一性,因此可以保证相同的客户端总是被分配到相同的服务器上。
?url_hash
http {
upstream backend_servers {
hash $request_uri consistent;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
...
}
}
#url_hash:通常用于缓存场景,确保相同URL的请求被定向到同一服务器。
这篇文章介绍了Nginx的常用功能和应用场景,在实际配置中,还需根据具体的需求和场景选择合适的配置策略。