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

总结一下

我真的没去过洗脚城。

相关推荐
qq_3129201121 分钟前
安装lua-nginx-module实现WAF功能
nginx·junit·lua
Shepherd06191 小时前
【Jenkins实战】Windows安装服务启动失败
运维·jenkins
Biomamba生信基地1 小时前
Linux也有百度云喔~
linux·运维·服务器·百度云
new_abc2 小时前
Ubuntu 22.04 ftp搭建
linux·运维·ubuntu
七月在野,八月在宇,九月在户2 小时前
前端--> nginx-->gateway产生的跨域问题分析
前端·nginx·gateway
鹿鸣天涯2 小时前
‌华为交换机在Spine-Leaf架构中的使用场景
运维·服务器·网络
小白也有IT梦2 小时前
域名绑定服务器小白教程
运维·nginx
有梦想的咕噜2 小时前
Secure Shell(SSH) 是一种网络协议
运维·网络协议·ssh
dntktop3 小时前
免费,WPS Office教育考试专用版
运维
苹果醋33 小时前
C语言 strlen 函数 - C语言零基础入门教程
java·运维·spring boot·mysql·nginx