使用Nginx部署常规项目足够了
Nginx 是一款轻量级的高性能 Web 服务器和反向代理服务器,它以其高并发、低内存消耗和稳定性而闻名。Nginx 可以处理静态文件、反向代理动态内容、负载均衡等任务,是构建高可用、高性能 Web 架构的重要组成部分。
为什么使用 Nginx 部署常规项目足够了?
- 高性能
Nginx 采用异步非阻塞的事件驱动模型,可以处理大量的并发连接。与传统的多线程或多进程服务器相比,Nginx 在高并发情况下具有更低的内存消耗和更高的性能。
- 稳定性
Nginx 具有高度的稳定性,能够在长时间运行中保持稳定的性能。它可以自动处理故障和错误,确保服务的可用性。
- 反向代理和负载均衡
Nginx 可以作为反向代理服务器,将请求转发到后端的应用服务器。通过配置负载均衡算法,可以将请求均匀地分发到多个应用服务器上,提高系统的可用性和性能。
- 静态文件服务
Nginx 可以高效地处理静态文件请求,如图片、CSS、JavaScript 等。它可以直接将静态文件返回给客户端,减少了应用服务器的负载。
- 易于配置和管理
Nginx 的配置文件简单易懂,易于配置和管理。可以通过修改配置文件来实现各种功能,如反向代理、负载均衡、静态文件服务等。
nginx.conf默认配置文件分析
1 |
|
根据nginx.conf 默认配置文件可分为6个模块:
1 |
|
全局模块:配置影响nginx全局的指令,比如运行nginx的用户名,nginx进程pid存放路径,日志存放路径,配置文件引入,worker进程数等。
events模块:配置影响nginx服务器或与用户的网络连接。比如每个进程的最大连接数,选取哪种事件驱动模型(select/poll epoll或者是其他等等nginx支持的)来处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
http模块:可以嵌套多个server,配置代理,缓存,日志格式定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
server模块:配置虚拟主机的相关参数比如域名端口等等,一个http中可以有多个server。
location模块:配置url路由规则。
upstream模块:配置上游服务器的地址以及负载均衡策略和重试策略等等。
location路由配置规则
1 | location [ = | ~ | ~* | ^~ ] uri { |
通用匹配使用一个 / 表示,可以匹配所有请求。相当于 switch 中的 default。
1 | location / { |
无修饰符的前缀匹配,匹配前缀是配置的的url
1 | location /prefix_match { |
提示:前缀匹配使用alias来寻找资源
匹配结果
1 | curl http://www.locatest.com/prefixmatch ✅ 301 |
域名/prefixmatch,域名/prefixmatch? 和域名/prefixmatch/ 这三个url能够匹配上无修饰符的前缀匹配。
1 | location ^~ /exactprefixmatch{ |
匹配结果
1 | curl http://www.locatest.com/exactprefixmatch ✅ 200 |
域名/exactprefixmatchmmm 和域名/exactprefixmatch/mmm 是可以匹配上的,而不带修饰符的前缀匹配这两个类型的url是匹配不上的直接返回了404
1 | location = /test { |
1 | location ~ ^/test$ { |
- ~* 不区分大小写的正则匹配
1 | location ~* ^/test$ { |
优先级,从高到底:
精确匹配 =
前缀匹配 ^~
正则匹配 或*
通用匹配
- root 是直接拼接 root + location
1 | location /i/ { |
当请求 /i/top.gif ,/data/w3/i/top.gif 会被返回。
- alias 是用 alias 替换 location
1 | location /i/ { |
当请求 /i/top.gif ,/data/w3/images/top.gif 会被返回
server 和 location 中都可以使用 root,采取就近原则,如果 location 中能匹配到,就是用 location 中的 root 配置,忽略 server 中的 root,当 location 中匹配不到的时候,则使用 server 中的 root 配置
解决跨域
假设页面地址:http://192.168.31.115:8080
假设请求接口地址:http://v.juhe.cn/laohuangli/d?date=2014-09-09&key=dae46b9a6abb27fecaace80f47624f
配置Nginx
1 | server { |
将页面地址代理到8088端口,将接口地址也代理到8088端口
页面中请求接口
1 | fetch('http://192.168.31.115:8088/laohuangli/d?date=2014-09-09&key=dae46b9a6abb27fecaace80f47624f').then(res=>res.json()).then(res=>{ |
访问页面:http://192.168.31.115:8088/
gzip压缩
1 | http{ |
默认是动态压缩,即对每个请求是先压缩后输出。可配置gzip_static on;直接读取生成好的gz文件(前端打包时生成gz文件)
将HTTP请求转到HTTPS
在服务器上监听80端口,使用重定向
1 | server |
这样,如果访问http://service.com 将会跳转到 https://service.coms
使用HTTP2
在监听443端口后加http2即可开启
1 | listen 443 ssl http2; |
负载均衡
将请求分配给空闲服务器处理(电话号码同一个,但是不同客服接听)
1 | upstream firstdemo { |
负载均衡:upstream name {},两个server分别对应着不同的服务器
proxy_pass http://firstdemo
,代理到firstdemo里两个服务器上
灰度系统:可判断cookie版本,走不同服务器
静态资源服务器
把不常修改的静态资源文件放到nginx的静态资源目录中去,这样在访问静态资源时直接读取nginx服务器本地文件目录之后返回,这样就大大减少了后端服务的压力同时也加快了静态资源的访问速度
步骤一:在/www/server/nginx/html下创建images文件夹
步骤二:在Nginx进行配置(注意location的访问方式不同,root指定路径也不同)
1 | server |
访问 http://127.0.0.1/images/1.png
实则访问:/www/server/nginx/html/images/lifecycle.png
防盗链
1 | location ~ .*\.(jpg|png|gif)$ { # 匹配防盗链资源的文件类型 |
请求限制
对于大流量恶意的访问,会造成带宽的浪费,给服务器增加压力。往往对于同一 IP 的连接数以及并发数进行限制。
关于请求限制主要有两种类型:
limit_conn_module 连接频率限制
limit_req_module 请求频率限制
1 | # $binary_remote_addr 远程IP地址 zone 区域名称 10m内存区域大小 |
1 | # $binary_remote_addr 远程IP地址 zone 区域名称 10m内存区域大小 rate 为请求频率 1s 一次 |
总结
通过以上介绍,我们可以看出 Nginx 是一款功能强大的 Web 服务器和反向代理服务器,它可以满足常规项目的部署需求。Nginx 的高性能、稳定性、反向代理和负载均衡、静态文件服务、易于配置和管理等特点,使得它成为了众多开发者的首选。在实际应用中,我们可以根据项目的需求,灵活地配置 Nginx,以实现高效的项目部署。
使用Nginx部署常规项目足够了