非常全的Nginx配置

1. 负载均衡

你在多台服务器上部署了多个后台服务,Nginx 可以将前端的请求按照“一定规则”分发到不同的服务器,从而减轻单台服务器的压力。

案例: 假如你有3台服务器去处理用户的请求

# 定义服务器组(轮询)
upstreambackend_servers{
server 192.138.9.105:8080 weight=3;
server 192.138.9.11:8080 weight=2;
server 192.138.9.12:8080 backup;
}
server{
location /blog {
proxy_passhttp://backend_servers;
}
}
  • weight :表示权重,权重越高,表示优先处理多个请求

  • backup:备份服务器,其他服务器挂了才启用备份服务器

  • proxy_pass:请求转发

Nginx 负载均衡的几种策略:

(1)轮询(默认)

     1)请求按顺序依次分发到各个服务器

     2)每个服务器接收的请求数量基本相等

     3)适合服务器配置相同的场景

      

        案例:

        upstreambackend{
                server 192.138.9.105:8080;
                server 192.138.9.11::8080;
                server 192.138.9.12:8080;
        }

 (2)加强轮询

  关键字:weight

    1)根据服务器性能分配不同的权重

    2)权重越高,接收的请求比例越大

    3)适合服务器配置之不均的场景

  案例:

        upstreambackend{
        server 192.138.9.105:8080 weight=3;
        server 192.138.9.11:8080 weight=2;
        server 192.138.9.12:8080 weight=1;
        }

(3)IP哈希

  1)同一个客户端额请求总是发送到同一台服务器

  2)基于客户端IP地址计算哈希值

 3)适合需要会话保持应用

案例:

upstreambackend{
ip_hash; # 基于客户端IP的哈希算法
server 192.168.3.15:8080;
server 192.168.3.16:8080;
server 192.168.3.17:8080;
}

应用场景:

  a:购物车应用

 b:用户会话管理

 c:需要状态保持的服务

(4)最少连接

  1)将新的请求发送到当前连接数最少的服务器

  2)考虑服务器的当前负载情况

  3)适合请求处理时间差异大的场景

upstreambackend{
least_conn; # 最少连接数算法
server 192.168.3.15:8080;
server 192.168.3.16:8080;
server 192.168.3.17:8080;
}

(5)加强最少连接

   1)结合权重和当前连接数

   2)计算:链接数/权重,选择值最小的服务器

   3)既考虑性能差异,又考虑实时负载

  

upstreambackend{
least_conn;
server 192.168.3.15:8080 weight=3;
server 192.168.3.16:8080 weight=2;
server 192.168.3.17:8080 weight=1;
}

(5)随机算法

      1)随机选择后端服务器

       2)可配合权重使用:random two weight=1;

       3)适合无状态服务的负载均衡

upstreambackend{
random; # 随机选择服务器
server 192.168.3.15:8080;
server 192.168.3.16:8080;
server 192.168.3.17:8080;
}

(6)URL哈希

   1)相同URl的请求总是发送到同一台服务器

   2)提高缓存命中率

   3)适合缓存服务器负载均衡

upstreambackend{
hash $request_uri; # 基于请求URL的哈希
server 192.168.3.15:8080;
server 192.168.3.16:8080;
server 192.168.3.17:8080;
}

2. 缓存配置

Nginx的 缓存功能 可以大大地提升网站性能,降低后端服务器的压力。

比如你从服务器获取图片zhifou.jpg,nginx 可以设置几天内从浏览器缓存读取资源,过了一个时间段后再从服务器获取资源,可以有效降低服务器压力。

对于一些不经常变化的资源,我们可以通过 Nginx 设置缓存。

在Nginx中,主要通过 proxy_cache_path、proxy_cache 等指令来配置缓存。

1. 定义缓存路径

首先,你需要在 Nginx 的 http 上下文中使用 proxy_cache_path 指令来创建缓存目录和共享内存空间。

http{
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
}

2. 启用缓存

在 location 块中,通过 proxy_cache 指令启用你定义好的缓存区域。
server{
listen 80;
location ~ \.(jpg|png|css|js)(.*) {
proxy_passhttp://backend;
proxy_cache my_cache; # 使用名为my_cache的缓存配置
proxy_cache_valid 200 302 10m; # 为200和302状态码的响应设置10分钟缓存
proxy_cache_valid 404 1m; # 为404状态码设置1分钟缓存
add_header X-Cache-Status $upstream_cache_status; # 在响应头中添加缓存命中状态
expires 5d;
}
}
  • proxy_pass:表示如果没有缓存则请求后台服务

  • proxy_cache_valid:针对 http 不通的状态码设置不同的缓存时间

  • expires :给资源设置过期时间,通过 expires 参数设置,可以使浏览器缓存过期时间之前的内容,减少与服务器之间的请求和流量。

3. Gzip 压缩

你想通过压缩一些文件比如 html、css、js等文件来提高页面加载速度,可以在 nginx 的配置里面开启 gzip 压缩。

压缩案例1:压缩 html、css、js文件

http{
# 开启gzip压缩
gzip on;
# 压缩级别 1-9,6是性价比最高的级别
gzip_comp_level 6;
# 最小压缩文件大小,小于1k的文件不压缩
gzip_min_length 1024;

# 启用压缩的MIME类型
gzip_types text/plain text/css text/xml text/javascript
application/javascript application/xml+rss
application/json application/xml;
# 针对代理请求的压缩
gzip_proxied any;
# 添加Vary头,告知客户端支持压缩
gzip_vary on;
server {
listen 80;
server_name localhost;
location /blog {
root /usr/local/blog;
index index.html;
}
}
}

压缩案例2:压缩后端返回的大量 JSON 数据

server{
listen 443 ssl;server_name www.zhifou.com;location /api/zhifou/ {proxy_passhttp://api_backend;
# 专门针对API的压缩配置gzip on;
gzip_comp_level 3; # API响应压缩级别可以低一些gzip_min_length 1000; # 小响应不压缩gzip_types application/json;gzip_proxied any;# 添加压缩信息头add_header X-Compression-Rate "$gzip_ratio";
add_header X-Original-Size "$body_bytes_sent";
}# 实时数据接口,禁用压缩(数据量小,压缩反而增加延迟)location/api/v1{
proxy_passhttp://api_backend;
gzip off;
}}

4. 限流

Nginx的限流功能可以帮助你控制请求的速率,防止服务器被突发流量冲垮,保障应用的稳定运行。

首先你要理解 Nginx 限流的核心:漏桶算法

Nginx的限流基于 ngx_http_limit_req_module 模块,它采用了 漏桶算法 来管理流量。你可以把想象成一个底部有洞的水桶:

基于这个原理,我们来看几个典型的应用场景。

Nginx限流场景案例

场景一:应对突发流量

# 在http块中定义限流规则
http {
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
# ... 其他http配置 ...
server {
# ... server通用配置 ...
location /api/ {
# 应用限流,并设置突发请求缓冲队列大小为20
limit_req zone=api_limit burst=20;
proxy_pass http://my_backend;
}
}
}

场景二:秒杀或抢购活动

场景三:保护大文件下载

背景 :你的网站提供软件包或视频等大文件下载,希望避免单个用户耗尽所有带宽,影响其他用户访问网站。

配置思路 :对下载目录进行限流,并设置一个较小的 burst 值,平滑下载速率。

http {
# 注意这里限速较慢,适合大文件limit_req_zone $binary_remote_addr zone=download_limit:10m rate=200r/m;
server {location /downloads/ {# 设置较小的突发队列,主要是为了应对TCP连接的起始阶段limit_req zone=download_limit burst=10 nodelay;
# 同样可以自定义错误页面error_page 503 = @download_limit;
alias /data/downloads/;
}location @download_limit {
return 429 "下载请求过于频繁,请稍后再试。\n";
}}}

场景四:按服务器全局限流

限流配置的核心参数

建议

5. Nginx 配置 SSL 证书

5.1 SSL证书:网站的“身份证”和“保险箱”

你可以把SSL证书理解为你网站的两个核心功能合体:

当你的网站安装了 SSL 证书后,浏览器地址栏会显示一个小锁图标,网址以 https:// 开头,告诉用户这个连接是安全的。

5.2 HTTP vs HTTPS:明文传输与加密通信

二者的联系

HTTPS实际上是 HTTP的安全升级版 ,可以理解为“HTTP+SSL/TLS加密”。HTTPS在HTTP之下增加了一个安全层,对传输的数据进行加密和解密。

5.3 为什么现代网站必须使用HTTPS?

5.4 Nginx配置SSL证书详细步骤

前期准备:

  1. 获取SSL证书

  • 从某宝购买SSL证书

  • 你会得到两个文件:证书文件(通常为 .crt  .pem )和私钥文件(通常为 .key )

确认服务器环境

  • 确保Nginx已安装并包含 http_ssl_module 模块

  • 准备好服务器远程登录工具(如Xshell)

配置步骤:

5.4.1 上传证书文件

将证书文件和私钥文件上传到服务器,建议放在Nginx配置目录下,如 /etc/nginx/ssl/ 

5.4.2 修改Nginx配置文件

# HTTPS服务器配置
server {
# 监听443端口并启用SSL
listen 443 ssl;
server_name your-domain.com; # 替换为你的域名
# 指定证书路径ssl_certificate /etc/nginx/ssl/your-domain.crt; # 证书文件路径
ssl_certificate_key /etc/nginx/ssl/your-domain.key; # 私钥文件路径
# SSL协议配置(提高安全性)
ssl_protocols TLSv1.2 TLSv1.3; # 使用安全的TLS版本
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!:!a:!MD5:!ADH:!RC4; # 加密套件
ssl_prefer_server_ciphers on;
# 会话缓存设置ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
# 网站根目录和其他配置location / {
root /usr/share/nginx/html;
index index.html index.htm;
}}# HTTP重定向到HTTPS(可选但推荐)
server {
listen 80;
server_name your-domain.com; # 同样的域名
# 301永久重定向到HTTPS版本
return 301 https://$host$request_uri;
}

5.4.3 测试与重启

# 测试配置文件语法是否正确
sudo nginx -t
# 重新加载Nginx使配置生效
sudo systemctl reload nginx

5.4.4 验证配置

完成配置后,在浏览器中用 https://你的域名 访问网站。如果地址栏显示锁形图标,说明SSL证书已成功安装。

常见问题处理

SSL证书类型选择

6.Nginx 部署 vue3 项目

6.1 第一步:打包Vue3项目

为什么要打包?

Vue3项目在开发时用的是 .vue 文件、ES6模块等浏览器不能直接理解的东西,打包就像 把原材料加工成成品 

# 进入你的Vue3项目目录
cdyour-vue3-project
# 安装依赖(如果还没安装)
npm install
# 执行打包命令
npm run build

6.2 第二步:上传文件到服务器

把本地的 dist 文件夹整个上传到服务器,建议放在统一目录,比如:

/home/zhifou/projects/your-project/dist/

6.3 第三步:配置Nginx

⚙️ 基础配置内容

server {
listen 80;
server_name localhost;
# 网站根目录指向打包后的dist文件夹
root /home/zhifou/projects/your-project/dist;
index index.html;
# 主要配置:处理Vue路由
location / {
try_files $uri $uri/ /index.html;
}
# 静态资源缓存配置(提升性能)
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# API代理(如果需要连接后端)
location /api/ {
proxy_pass http://localhost:3000; # 后端服务地址
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}

6.4 第四步:启用配置并测试

# 检查配置文件语法是否正确
sudo nginx -t
# 或者重启Nginx
sudo systemctl restart nginx

6.5 常见问题排查

问题1:页面空白

原因 :资源路径错误 解决 :在Vue项目的 vite.config.js  vue.config.js 中设置正确的publicPath:

// vite.config.js
exportdefault{
base:'./'// 相对路径
}

问题2:路由刷新404

原因 :Nginx没有配置 try_files 解决 :确保配置中有

try_files $uri $uri/ /index.html;

问题3:静态资源加载失败

原因 :文件权限或路径问题 解决 :检查dist文件夹权限,确保Nginx用户有读取权限:

sudo chmod -R 755 /home/zhifou/projects/your-project/dist

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tangwangbi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值