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

本文介绍了Nginx的基本概念,包括其作为高性能Web服务器的角色,反向代理的工作原理,以及如何利用Nginx实现多站点服务、负载均衡、业务分离和解决跨域问题。通过洗脚城的例子生动地解释了这些技术的应用。
摘要由CSDN通过智能技术生成

FBI WARNING:

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

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

什么是Nginx

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

什么是反向代理

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

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

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

image.png

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

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

常见的反向代理场景:

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

image.png

Nginx 有哪些作用?

1. Nginx的虚拟站点服务

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

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

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;
}

image.png

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

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

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

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;
    }
}

image.png

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

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

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

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

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
    }   
}

image.png

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

  • 跨域问题
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 模块将代理中一些数据进行过滤或替换:)

server {
    ...
    
    location /api {
        ...
        sub_filter_types application/json;
        sub_filter_once off;

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

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

  • 自定义错误页
server
{
    listen 80;
    server_name api.hamm.cn;
    error_page 502 503 404 403 500 /error.json;
}

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

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

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

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

image.png

总结一下

我真的没去过洗脚城。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值