Nginx与洗脚城技师那些有意思的小故事

FBI WARNING:

内容仅作为举例用途,本人不曾去过洗脚城,也不知道技师是什么

我们今天来讲讲Nginx的一些小常识吧。

什么是Nginx

Nginx 是一款是由伟大且牛逼的俄罗斯的程序设计师 Igor Sysoev(伊戈尔 赛索耶夫) 在摸鱼玩耍时所开发高性能的 Web反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。

什么是反向代理

说到反向代理之前,我们来看看什么是 正向代理(跑腿代购)。

正向代理运行在客户端的出口,获取客户端发送的请求,用自己的身份发送到服务器并获取返回数据,最终返回给客户端。

常见的正向代理,如网络爬虫的IP代理、VPN、游戏加速器......

那么,什么是反向代理呢?

反向代理服务器运行在服务端的入口,根据客户端请求的部分参数进行请求的分发与调度等。(那不就是洗脚城的前台吗?)

常见的反向代理场景:

  • 负载均衡
  • 动静分离
  • 业务分离
  • ......

Nginx 有哪些作用?

1. Nginx的虚拟站点服务

Nginx可基于 端口号、域名(IP) 实现多站点服务,已实现前端访问80或443端口,通过上述不同条件访问不同的后端服务

一个洗脚城前台,后面有不知道数量的技师。

config 复制代码
server
{
    listen 80;
    server_name www.hamm.cn;
    index index.html;
    root  /home/www/portal_site;
}
server
{
    listen 80;
    listen 443 ssl http2;
    # 证书相关配置
    server_name api.hamm.cn;
    index index.html;
    root  /home/www/api_service;
}
server
{
    listen 80;
    server_name static.hamm.cn;
    index index.html;
    root  /home/www/static_service;
    autoindex on;
}

2. Nginx反向代理实现负载均衡

通过反向代理指定上游多个负载点,配置不同的负载优先级以及调度策略来实现负载均衡。

按业务能力和服务质量,洗脚城前台往往会针对不同的技师分配不同的任务。

config 复制代码
upstream api_slb {
    server 192.168.123.78:8100 weight=5 max_fails=3 fail_timeout=5;        
    server 192.168.123.78:8200 weight=3 max_fails=3 fail_timeout=5;
    server 192.168.123.79:8100 weight=2 max_fails=3 fail_timeout=5;
    # 优先使用局域网测试服务器的服务 按权重进行负载
    
    
    # 如果测试服务器不可用,可通过下面两台备用服务跑
    
    server 192.168.123.77:8080 weight=2 backup;
    # 同事张三 代码一般是最新 优先使用
    server 192.168.123.151:8080 weight=1 backup;
    # 同事李四 工位最近 做备机 方便沟通 
}
server {
    listen 80;
    server_name api.hamm.cn;
    location / {
        proxy_pass http://api_slb;
    }
}

3. Nginx业务分离或动静分离

使用Nginx解决一些特定的需求

  • 相同域名,不同路径访问不同资源
  • 不同域名,解决访问跨域等问题 .......

技师根据不同的客户需求,分配不同业务能力的技师。

config 复制代码
upstream api_service {
    server 192.168.123.78:8100;
}
upstream web_frontend {
    server 192.168.123.66:8010;
}
server {
    listen 80;
    
    # 使用统一域名 http://hamm.cn访问所有资源
    
    server_name hamm.cn;
    
    # 匹配 http://hamm.cn/api/****
    # 到系统API服务器上
    location /api/ {
        proxy_pass http://api_service;
    }
    
    # 如果资源在本机 可使用Nginx自带的静态资源服务
    location /static {
        index index.html;
        alias /home/www/static
    }
    
    # 匹配其他请求到前端服务器上
    location / {
        proxy_pass http://web_frontend
    }   
}

4. Nginx完成其他场景下的小需求

跨域问题

config 复制代码
server {
    # API服务
    listen 80;
    server_name api.hamm.cn;
    
    # 设置允许跨域的域名 支持通配符 如* 代表所有
    add_header Access-Control-Allow-Origin hamm.cn;
    
    # 跨域时允许提交的header数据
    add_header Access-Control-Allow-Headers 'authorization','content-type';
    
    # 允许跨域的请求方法
    add_header Access-Control-Allow-Methods 'option,get,put,post';
    
    # 还有很多配置项 自己百度吧:)
}
server {
    # 前端
    listen 80;
    server_name hamm.cn;
}

代理过滤

使用 sub_filter 模块将代理中一些数据进行过滤或替换:)

config 复制代码
server {
    ...
    
    location /api {
        ...
        sub_filter_types application/json;
        sub_filter_once off;

        sub_filter '搜藏成功' '收藏成功';
    }
}

技师服务的时候有点不耐烦,大喊了一声 "傻X客户",洗脚城前台为了洗脚城的形象,给替换成了 "好帅的客户"

自定义错误页

config 复制代码
server
{
    listen 80;
    server_name api.hamm.cn;
    error_page 502 503 404 403 500 /error.json;
}

技师让客户不高兴的时候,洗脚城每次都出来给大家唱首歌缓和下气氛。

流量控制 请求黑名单IP 防盗链 请求拦截

技师提前预判是不是意向客户,或者专门找事的客户,提前处理好这些事情,不让技师烦恼。

config 复制代码
server
{
    listen 80;
    server_name static.hamm.cn;
    root  /home/www/static_files/images;
    location ~ .*\.(jpg|gif|png|bmp)$ {
        # 如果是百度爬虫 让它一边去
        if ($http_user_agent ~ 'Baiduspider') {
            # rewrite * "/getout.jpg";
            return 403;
        }
        # 图片 允许直接访问 如有跨域 只允许指定的域名访问
        valid_referers none *.hamm.cn;
        if ($invalid_referer) {
            # 其他的请求 通通甩掉
            return 403;
        }
    }
    location /admin/ {
        # 如果是上传到admin目录下的文件
        allow 123.45.67.89;
        # 只允许指定的IP可以访问
        deny all;
        # 其他人通通甩掉
    }
}

总结一下

我真的没去过洗脚城。

相关推荐
q***46523 分钟前
若依部署Nginx和Tomcat
运维·nginx·tomcat
行初心28 分钟前
uos基础 dmesg 查看内核的实时日志
运维
行初心31 分钟前
uos基础 journalctl 查看系统的实时日志
运维
行初心41 分钟前
uos基础 ffmpeg 查看多媒体解码的配置信息
运维
路人甲ing..1 小时前
Ubuntu 怎么把树莓派内存卡备份制作成为镜像
linux·运维·ubuntu
QMY5205201 小时前
爬虫技术抓取网站数据的方法
运维·爬虫·自动化
zz-zjx1 小时前
docker进阶---docker底层实践2025
运维·docker·容器
Fanmeang3 小时前
华为SRv6技术:引领IP网络进入新时代的智能导航系统
运维·网络·华为·vpn·ipv6·srv6
我科绝伦(Huanhuan Zhou)3 小时前
【免费】MySQL自动化巡检工具,一键生成WORD巡检报告
运维·mysql·自动化
SiriusSun_3 小时前
Windows10 wsl2 ubuntu22.04 docker安装
运维·docker·容器