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;
        # 其他人通通甩掉
    }
}

总结一下

我真的没去过洗脚城。

相关推荐
乘云数字DATABUFF3 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
荣--5 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森5 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜5 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB6 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode8 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220708 天前
如何搭建本地yum源(上)
运维
ping某9 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树8811 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠11 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql