Nginx与洗脚城技师那些有意思的小故事
FBI WARNING:
内容仅作为举例用途,本人不曾去过洗脚城,也不知道技师是什么
我们今天来讲讲Nginx的一些小常识吧。
什么是Nginx
Nginx
是一款是由伟大且牛逼的俄罗斯的程序设计师 Igor Sysoev(伊戈尔 赛索耶夫) 在摸鱼玩耍时所开发高性能的 Web反向代理
服务器,也是一个 IMAP/POP3/SMTP
代理服务器。
什么是反向代理
说到反向代理之前,我们来看看什么是 正向代理(跑腿代购)。
正向代理运行在客户端的出口,获取客户端发送的请求,用自己的身份发送到服务器并获取返回数据,最终返回给客户端。
常见的正向代理,如网络爬虫的IP代理、VPN、游戏加速器......
那么,什么是反向代理呢?
反向代理服务器运行在服务端的入口,根据客户端请求的部分参数进行请求的分发与调度等。(那不就是洗脚城的前台吗?)
常见的反向代理场景:
- 负载均衡
- 动静分离
- 业务分离
- ......
Nginx 有哪些作用?
1. Nginx的虚拟站点服务
Nginx可基于 端口号、域名(IP) 实现多站点服务,已实现前端访问80或443端口,通过上述不同条件访问不同的后端服务
一个洗脚城前台,后面有不知道数量的技师。
server
{
listen 80;
server_name http://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反向代理实现负载均衡
通过反向代理指定上游多个负载点,配置不同的负载优先级以及调度策略来实现负载均衡。
按业务能力和服务质量,洗脚城前台往往会针对不同的技师分配不同的任务。
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解决一些特定的需求
- 相同域名,不同路径访问不同资源
- 不同域名,解决访问跨域等问题
.......
技师根据不同的客户需求,分配不同业务能力的技师。
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完成其他场景下的小需求
跨域问题
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;
# 其他人通通甩掉
}
}
总结一下
我真的没去过洗脚城。
作者:Hamm
来源:juejin.cn/post/7295995236886396939
来源:juejin.cn/post/7295995236886396939