Skip to main content

moregeek program

nginx 生产环境常见场景配置_虚拟的现实的博客-多极客编程

1.禁止其它域名访问

nginx安装在192.168.111.124,上面配置2个域名doc.myj.com.cn和zabbix.myj.com.cn。默认情况下输入http://192.168.111.124会打开doc.myj.com.cn页面,要求实现只能通过域名访问,使用IP地址提示403或跳转其它页面。

1.1.增加default.conf配置文件

server {
listen 80 default_server;
server_name _;
return 403; ## index 403.html

}

1.2.重启生效

详情可参考:​​https://nginx.org/en/docs/http/server_names.html​

2.跨域问题处理

假如代理服务器地址是 ​​www.c.com/proxy/html/api/msg?method=1=2​​;   ​​www.c.com​​是nginx主机地址

远端服务器地址:​​http://www.b.com/api/msg?method=1=2​

在nginx服务器上做如下配置。在location下面再添加一个location。

location ^~/proxy/html/{
rewrite ^/proxy/html/(.*)$ /$1 break;
proxy_pass http://www.b.com/;
}

2.1.说明

'^~ /proxy/html/ ‘

  就像上面说的一样是一个匹配规则,用于拦截请求,匹配任何以 /proxy/html/开头的地址,匹配符合以后,停止往下搜索正则。

rewrite ^/proxy/html/(.*)$ /$1 break;

  代表重写拦截进来的请求,并且只能对域名后边的除去传递的参数外的字符串起作用,例如​​www.c.com/proxy/html/api/msg?method=1=2重写。只对/proxy/html/api/msg重写。​

  rewrite后面的参数是一个简单的正则 ^/proxy/html/(.*)$ ,$1代表正则中的第一个(),$2代表第二个()的值,以此类推。

  break代表匹配一个之后停止匹配。

3.Node.js 反向代理

服务端如果使用nodejs运行服务,由于端口不能同时多个服务占用,而服务器中可能又是多个网站,那么可以使用 Nginx 做反向代理,比如有这些网站域名和端口:

域名

端口

​www.o.com​

8001

​www.xo.com​

8002

​www.xo.cn​

8003

3.1.配置文件

server {
server_name www.o.com;
listen 80;

# 设置这个网站的根目录
root /wwwroot/www.o.com/;

# 由于下面配置了文件不存在则代码到 Node.js 中,那么直接访问目录(不带默认主页)的话会有问题,这里做下判断
# 如果访问目录下有 index.html 文件,则直接重写到该文件
# break 表示重写且停止,但 url 不变,而 permanent 表示301重定向,url 会更新
if ( -f $request_filename/index.html ){
rewrite (.*) $1/index.html break;
}

# 如果请求的文件不存在,则代理到 Node.js
if ( !-f $request_filename ){
rewrite (.*) /index.js;
}

# 代理node服务 8001
location = /index.js {
# 设置一些代理的header信息,这些信息将被透传到 Node.js 服务的header信息里
proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;

# 代理服务
proxy_pass http://127.0.0.1:8001$request_uri;

# 忽略其他重写
proxy_redirect off;
}
}

内容说明

访问链接

解析过程

备注

​www.o.com/index.html​

Nginx

由于文件存在,直接使用 Nginx 输出

​www.o.com​

Nginx

由于判断该目录下有 ​​index.html​​​ 文件,则自动重写到该文件,但 ​​url​​ 不变


​www.o.com/xx.html​

Nginx -> Node.js:8001

由于文件不存在,使用 Nginx 代理到 Node.js 的 8001 端口

​www.o.com/o/​

Nginx -> Node.js:8001

首先判断该目录是否存在

如果存在再判断是否有 ​​index.html​​ 文件

一旦不成立,直接代理到 Node.js

4.重写网页图片 CDN

在不调整网页代码的情况下重新调整页面展示图片的后端网络

location ^~ /test/ {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host "appfleet.com";
proxy_set_header X-Forwarded-Proto https;
proxy_pass http://127.0.0.1:2368;
proxy_redirect off;

#disable compression
proxy_set_header Accept-Encoding "";
#rewrite the html
sub_filter_once off;
sub_filter_types text/html;
sub_filter '<img src="https://appfleet.com' '<img loading="lazy" src="https://appfleet-com.cdn.ampproject.org/i/s/appfleet.com';
}

5.rewrite 重定向

5.1.rewrite 语法格式及参数语法

rewrite是实现URL重写的关键指令,根据regex (正则表达式)部分内容,重定向到replacement,结尾是flag标记。

rewrite    <regex>    <replacement>    [flag];

  • 关键字      正则        替代内容         flag标记
  • 关键字:其中关键字error_log不能改变
  • 正则:perl兼容正则表达式语句进行规则匹配
  • 替代内容:将正则匹配的内容替换成replacement
  • flag标记:rewrite支持的flag标记

rewrite参数的标签段位置:server,location,if

flag标记说明:

  • last  #本条规则匹配完成后,继续向下匹配新的location URI规则
  • break  #本条规则匹配完成即终止,不再匹配后面的任何规则
  • redirect  #返回302临时重定向,浏览器地址会显示跳转后的URL地址
  • permanent  #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

5.2.Nginx rewrite变量

常用于匹配HTTP请求头信息、浏览器主机名、URL

HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST, HTTP_ACCEPT;

connection & request: REMOTE_ADDR, QUERY_STRING;

server internals: DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL;

system stuff: TIME_YEAR, TIME_MON, TIME_DAY。

详解如下:

  • HTTP_USER_AGENT      用户使用的代理,例如浏览器;
  • HTTP_REFERER         告知服务器,从哪个页面来访问的;
  • HTTP_COOKIE          客户端缓存,主要用于存储用户名和密码等信息;
  • HTTP_HOST            匹配服务器ServerName域名;
  • HTTP_ACCEPT          客户端的浏览器支持的MIME类型;      
  • REMOTE_ADDR          客户端的IP地址
  • QUERY_STRING         URL中访问的字符串;
  • DOCUMENT_ROOT        服务器发布目录;
  • SERVER_PORT          服务器端口;
  • SERVER_PROTOCOL      服务器端协议;
  • TIME_YEAR            年;
  • TIME_MON             月;
  • TIME_DAY              日;

5.3.场景举例

1、将uri中的所有空格替换为"_",连续的空格替换为一个"_"放到proxy_pass之前

rewrite '^(\S+) +(\S+)(.*)' $1_$2$3 last;

2、将​​zy.com​​跳转至​​www.zy.com​

if ($host = zy.com' ) {
#其中$1是取自regex部分()里的内容,匹配成功后跳转到的URL。
rewrite ^/(.*)$ http://www.zy.com/$1 permanent;
}

3、访问​​www.zy.com​​跳转​​www.test.com/index01.html​

rewrite   ^/$  http://www.test.com/index01.html  permanent;

4、访问/zy/test01/跳转至/newindex.html,浏览器地址不变

rewrite   ^/zy/test01/$     /newindex.html     last;

5、多域名跳转到​​www.zy.com​

if ($host != ‘www.jfedu.net’ ) {
rewrite ^/(.*)$ http://www.zy.com/$1 permanent;
}

6、访问文件和目录不存在跳转至index.php

if ( ! -e $request_filename ) {
rewrite ^/(.*)$ /index.php last;
}

7、目录对换 /xxxx/123456 ====> /xxxx?id=123456

rewrite    ^/(.+)/(\d+)      /$1?id=$2       last;

8、判断浏览器User Agent跳转

if( $http_user_agent  ~ MSIE) {
rewrite ^(.*)$ /ie/$1 break
}

9、禁止访问以.sh,.flv,.mp3为文件后缀名的文件

location ~ .*\.(sh|flv|mp3)${
return 403;
}

 10、将移动用户访问跳转至移动端

if ( $http_user_agent ~* "(Android)|(iPhone)|(Mobile)|(WAP)|(UCWEB)" ){
rewrite ^/$ http://m.jfedu.net/ permanent;
}

11、访问/10690/zy/123跳转至/index.php?tid/10690/items=123,[0-9]表示任意一个数字,+表示多个,(.+)表示任何多个字符

rewrite   ^/([0-9]+)/zy/(.+)$     /index.php?tid/$1/items=$2     last;

12、匹配URL访问字符串跳转

if ($args ~* tid=13){
return 404;
}

©著作权归作者所有:来自51CTO博客作者waring_id的原创作品,请联系作者获取转载授权,否则将追究法律责任

haproxy搭建web群集_嘎嘣脆的博客-多极客编程

Haproxy搭建Web群集1、负载均衡工具类型 1)LVS负载均衡群集 不支持缓存功能 针对应用层协议实现负载平衡 不支持故障检测 支持故障检测需要和keepalived实现 2)Nginx 使用最广泛的代理工具 支持缓存、网站、代理功能 占用硬件资源小 3)haproxy 专业的负载均衡调度工具 支持四层和七层负载均衡功能 支持会话保持和缓存 可靠性强2、haproxy的

linux 性能优化和内核观察 - cpu 篇(一)_胡源的博客-多极客编程

简介中央处理器(central processing unit,简称 CPU)作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。所有的计算机程序都运行在CPU之上,在大多数情况下CPU都是性能分析的重要关注点。CPU 基础知识CPU 的运行模式CPU 和其它硬件资源都是由系统内核(Kernel)管理的,系统内核运行在一个特殊的模式​​系统模式(System mode)​​​下。用

使用kubeadm+calico部署kubernetes v1.25.3_大雨的博客-多极客编程

1、环境准备主机名IP地址系统版本k8s-master01 k8s-master01.wang.org​ kubeapi.wang.org kubeapi10.0.0.101Ubuntu2004k8s-master02 k8s-master02.wang.org10.0.0.102Ubuntu2004k8s-master03 k8s-master03.wang.org10.0.0.103Ubunt

[ linux ] 缓冲区的理解 以及简易模拟实现封装c标准库_小白又菜的博客-多极客编程

在输出重定向的时候为什么必须fflush(stdout)才能将内容刷新到指定文件呢?我们当时回答是因为存在缓冲区。那么本篇文章我们将重点了解认识一下缓冲区。0.什么是缓冲区?缓冲区的本质就是一段内存。 那么这段内存在哪里呢?我们接下来将会说明这个问题。1.为什么要有缓冲区?我们举个例子来理解这个概念:假设你在北京大学上学,你的朋友在上海交通大学上学,你有10本书想给你的朋友,你打算怎么将这些书送给

redis模糊匹配删除key_牛马的博客-多极客编程

在群里看到的一个Redis 快速删除数据 小技巧。之前我一直用scan出来再删方式,比较慢,不如本文下面这个方法。 造些测试数据 for i in {1..1000};do echo "set age_$i $i" | redis-cli -c -p 7000 ;done单机 查找数据(每行显示10条记录) redis-cli -c -p 7000 --scan --pattern "age_*"

kubectl基本命令_wx5f8d559402e3e的博客-多极客编程

1、kubectl 基本命令1.kubernetes集群管理集群资源的唯一入口是通过相应的方法调用apiserver的接口2. kubectl 是官方的CLI命令行工具,用于与apiserver 进行通信,将用户在命令行输入的命令,组织并转化为apiserver能识别的信息,进而实现管理k8s 各种资源的一种有效途径3. kubectl 的命令大全4.对资源的增、删、查操作比较方便,但对改的操作就

haproxy搭建web群集_嘎嘣脆的博客-多极客编程

Haproxy搭建Web群集1、负载均衡工具类型 1)LVS负载均衡群集 不支持缓存功能 针对应用层协议实现负载平衡 不支持故障检测 支持故障检测需要和keepalived实现 2)Nginx 使用最广泛的代理工具 支持缓存、网站、代理功能 占用硬件资源小 3)haproxy 专业的负载均衡调度工具 支持四层和七层负载均衡功能 支持会话保持和缓存 可靠性强2、haproxy的

记一次堆叠注入拿shell的总结_mb6242cc9db1000的博客-多极客编程

一 前言菜鸡第一次实战中碰到mssql的堆叠注入,大佬们轻喷。本来对堆叠注入没啥了解,这次正巧碰到mssql的堆叠注入,正好加强一下对堆叠注入的理解。二、 堆叠注入因为在sql查询语句中, 分号“;”代表查询语句的结束,所以在执行sql语句结尾分号的后面,再加一条sql语句,就造成了堆叠注入。这种情况很像联合查询,他们的区别就在于联合查询执行的语句是有限的,只能用来执行查询语句,而堆叠注入可以执行

linux 性能优化和内核观察 - cpu 篇(一)_胡源的博客-多极客编程

简介中央处理器(central processing unit,简称 CPU)作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。所有的计算机程序都运行在CPU之上,在大多数情况下CPU都是性能分析的重要关注点。CPU 基础知识CPU 的运行模式CPU 和其它硬件资源都是由系统内核(Kernel)管理的,系统内核运行在一个特殊的模式​​系统模式(System mode)​​​下。用

[ linux ] 缓冲区的理解 以及简易模拟实现封装c标准库_小白又菜的博客-多极客编程

在输出重定向的时候为什么必须fflush(stdout)才能将内容刷新到指定文件呢?我们当时回答是因为存在缓冲区。那么本篇文章我们将重点了解认识一下缓冲区。0.什么是缓冲区?缓冲区的本质就是一段内存。 那么这段内存在哪里呢?我们接下来将会说明这个问题。1.为什么要有缓冲区?我们举个例子来理解这个概念:假设你在北京大学上学,你的朋友在上海交通大学上学,你有10本书想给你的朋友,你打算怎么将这些书送给

资源管理系统apache mesos_枫叶飘飘的博客-多极客编程

Mesos是诞生于UC Berkeley的一个研究项目,它的设计动机是解决编程模型和计算框架在多样化环境下,不同框架间的资源隔离和共享问题。尽管它的直接设计动机与YARN稍有不同,但它的架构和实现策略与YARN类似。当前部分公司在使用Mesos管理集群资源,比如国外的Twitter、国内的豆瓣等。Apache Mesos由以下四个组件组成:1、Mesos MasterMesos Master是整个

redis模糊匹配删除key_牛马的博客-多极客编程

在群里看到的一个Redis 快速删除数据 小技巧。之前我一直用scan出来再删方式,比较慢,不如本文下面这个方法。 造些测试数据 for i in {1..1000};do echo "set age_$i $i" | redis-cli -c -p 7000 ;done单机 查找数据(每行显示10条记录) redis-cli -c -p 7000 --scan --pattern "age_*"