nginx 配置|禁止访问规则
文章目录
- 1. nginx配置详解
- 1.1 nginx中remote_addr和x_forwarded_for参数使用说明
- 1.2 简单说明下nginx location匹配规则
- 1.3 Nginx 正则表达式
- 1.4 Nginx中的location匹配与rewrite跳转
- 2. 黑/白名单IP限制访问配置
- 2. 1 第一种方法:allow、deny
- 2.2 第二种方法,ngx_http_geo_module
- 2.3 ngx_http_geo_module 负载均衡(扩展)
- 3. 限制特定ip对特定网页的访问
- 4. 国家地区IP限制访问
- 5. 相关优质文章
1. nginx配置详解
配置详解1
配置详解2
1.1 nginx中remote_addr和x_forwarded_for参数使用说明
做网站时经常会用到remote_addr和x_forwarded_for这两个头信息来获取客户端的IP,然而当有反向代理或者CDN的情况下,这两个值就不够准确了,需要调整一些配置。1)什么是remote_addr
remote_addr代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的
web服务器(Nginx,Apache等)就会把remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样web
服务器就会把remote_addr设为这台代理机器的IP。2)什么是x_forwarded_for
正如上面所述,当你使用了代理时,web服务器就不知道你的真实IP了,为了避免这个情况,代理服务器通常会增加一个叫做x_forwarded_for的头信息,把连接它的客户
端IP(即你的上网机器IP)加到这个头信息里,这样就能保证网站的web服务器能获取到真实IP-------------------使用HAProxy做反向代理----------------------
通常网站为了支撑更大的访问量,会增加很多web服务器,并在这些服务器前面增加一个反向代理(如HAProxy),它可以把负载均匀的分布到这些机器上。你的浏览器访
问的首先是这台反向代理,它再把你的请求转发到后面的web服务器,这就使得web服务器会把remote_addr设为这台反向代理的IP,为了能让你的程序获取到真实的客户端
IP,你需要给HAProxy增加以下配置:option forwardfor
它的作用就像上面说的,增加一个x_forwarded_for的头信息,把你上网机器的ip添加进去------------------使用Nginx的realip模块--------------------
当Nginx处在HAProxy后面时,就会把remote_addr设为HAProxy的IP,这个值其实是毫无意义的,你可以通过nginx的realip模块,让它使用x_forwarded_for里的值。使用这
个模块需要重新编译Nginx,增加--with-http_realip_module参数set_real_ip_from 10.1.10.0/24;
real_ip_header X-Forwarded-For;
上面的配置就是把从10.1.10这一网段过来的请求全部使用X-Forwarded-For里的头信息作为remote_addr------------------将Nginx架在HAProxy前面做HTTPS代理---------------
网站为了安全考虑通常会使用https连接来传输敏感信息,https使用了ssl加密,HAProxy没法直接解析,所以要在HAProxy前面先架台Nginx解密,再转发到HAProxy做负载均
衡。这样在Web服务器前面就存在了两个代理,为了能让它获取到真实的客户端IP,需要做以下配置。首先要在Nginx的代理规则里设定:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
这样会让Nginx的https代理增加x_forwarded_for头信息,保存客户的真实IP。其次修改HAProxy的配置:
option forwardfor except 10.1.10.0/24
这个配置和之前设定的差不多,只是多了个内网的IP段,表示如果HAProxy收到的请求是由内网传过来的话(https代理机器),就不会设定x_forwarded_for的值,保证后面的
web服务器拿到的就是前面https代理传过来的。-----------------为什么PHP里的HTTP_X_FORWARDED_FOR和Nginx的不一样------------------
当你的网站使用了CDN后,用户会先访问CDN,如果CDN没有缓存,则回源站(即你的反向代理)取数据。CDN在回源站时,会先添加x_forwarded_for头信息,保存用户的真实IP,
而你的反向代理也会设定这个值,不过它不会覆盖,而是把CDN服务器的IP(即当前remote_addr)添加到x_forwarded_for的后面,这样x_forwarded_for里就会存在两个值。
Nginx会使用这些值里的第一个,即客户的真实IP,而PHP则会使用第二个,即CDN的地址。为了能让PHP也使用第一个值,你需要添加以下fastcgi的配置。fastcgi_param HTTP_X_FORWARDED_FOR $http_x_forwarded_for;
它会把nginx使用的值(即第一个IP)传给PHP,这样PHP拿到的x_forwarded_for里其实就只有一个值了,也就不会用第二个CDN的IP了。忽略x_forwarded_for其实,当你使用了Nginx的realip模块后,就已经保证了remote_addr里设定的就是客户端的真实IP,再看下这个配置set_real_ip_from 10.1.10.0/24;
real_ip_header X-Forwarded-For;
它就是把x_forwarded_for设为remote_addr,而nginx里的x_forwarded_for取的就是其中第一个IP。使用这些设置就能保证你的remote_addr里设定的一直都是客户端的真实IP,而x_forwarded_for则可以忽略了:)
1.2 简单说明下nginx location匹配规则
location匹配命令
~ 表示执行一个正则匹配,区分大小写
~* 表示执行一个正则匹配,不区分大小写
^~ 表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
= 进行普通字符精确匹配
@ 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files=前缀的指令严格匹配这个查询。如果找到,停止搜索。
所有剩下的常规字符串,最长的匹配。如果这个匹配使用^〜前缀,搜索停止。
正则表达式,在配置文件中定义的顺序。
如果第3条规则产生匹配的话,结果被使用。否则,如同从第2条规则被使用。location 匹配的优先级(与location在配置文件中的顺序无关)
= 精确匹配会第一个被处理。如果发现精确匹配,nginx停止搜索其他匹配。
普通字符匹配,正则表达式规则和长的块规则将被优先和查询匹配,也就是说如果该项匹配还需去看有没有正则表达式匹配和更长的匹配。
^~ 则只匹配该规则,nginx停止搜索其他匹配,否则nginx会继续处理其他location指令。
最后匹配理带有"~"和"~*"的指令,如果找到相应的匹配,则nginx停止搜索其他匹配;
当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用。
location = / { # 只匹配"/".
[ configuration A ]
}location / { # 匹配任何请求,因为所有请求都是以"/"开始,但是更长字符匹配或者正则表达式匹配会优先匹配
[ configuration B ]
}location ^~ /images/ { # 匹配任何以 /images/ 开始的请求,并停止匹配 其它location
[ configuration C ]
}location ~* \.(gif|jpg|jpeg)$ { # 匹配以 gif, jpg, or jpeg结尾的请求. 但是所有 /images/ 目录的请求将由 [Configuration C]处理.
[ configuration D ]
}
1.3 Nginx 正则表达式
^ :匹配输入字符串的起始位置
$ :匹配输入字符串的结束位置
* :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+ :匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
? :匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
. :匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式
\ :将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“\$”则匹配“$”
\d :匹配纯数字
{n} :重复 n 次
{n,} :重复 n 次或更多次
{n,m} :重复 n 到 m 次
[] :定义匹配的字符范围
[c] :匹配单个字符 c
[a-z] :匹配 a-z 小写字母的任意一个
[a-zA-Z0-9] :匹配所有大小写字母或数字
() :表达式的开始和结束位置
| :或运算符从功能看 rewrite 和 location 似乎有点像,都能实现跳转,主要区别在于 rewrite 是在同一域名内更改获取资源的路径,而 location 是对一类路径做控制访问或反向代理,还可以proxy_pass 到其他机器。
其他参考:https://www.cnblogs.com/kabi/p/10729664.html
1.4 Nginx中的location匹配与rewrite跳转
location匹配与rewrite跳转
2. 黑/白名单IP限制访问配置
nginx配置黑白名单有好几种方式,这里只介绍常用的两种方法。
2. 1 第一种方法:allow、deny
deny和allow指令属于ngx_http_access_module,nginx默认加载此模块,所以可直接使用。
这种方式,最简单,最直接。设置类似防火墙iptable,使用方法:
- 直接配置文件中添加:
#白名单设置,allow后面为可访问IP
location / {allow 123.13.123.12;allow 23.53.32.1/100;deny all;
}#黑名单设置,deny后面接限制的IP,为什么不加allow all? 因为这个默认是开启的
location / {deny 123.13.123.12;
}#白名单,特定目录访问限制
location /tree/list {allow 123.13.123.12;deny all;
}
- 或者通过读取文件IP配置白名单
location /{include /home/whitelist.conf;#默认位置路径为/etc/nginx/ 下,#如直接写include whitelist.conf,则只需要在/etc/nginx目录下创建whitelist.confdeny all;
}
在/home/目录下创建whitelist.conf,并写入需要加入白名单的IP,添加完成后查看如下:
cat /home/whitelist.conf#白名单IP
allow 10.1.1.10;
allow 10.1.1.11;
白名单设置完成,黑名单设置方法一样。
2.2 第二种方法,ngx_http_geo_module
默认情况下,一般nginx是有加该模块的,ngx_http_geo_module:官方文档,参数需设置在位置在http模块中。
此模块可设置IP限制,也可设置国家地区限制。位置在server模块外即可。
语法示例:
- 配置文件直接添加
geo $ip_list {default 0;#设置默认值为0192.168.1.0/24 1;10.1.0.0/16 1;
}
server {listen 8081;server_name 192.168.152.100;location / {root /var/www/test;index index.html index.htm index.php;if ( $ip_list = 0 ) {#判断默认值,如果值为0,可访问,这时上面添加的IP为黑名单。#白名单,将设置$ip_list = 1,这时上面添加的IP为白名单。proxy_pass http://192.168.152.100:8081;}
- 同样可通过读取文件IP配置
geo $ip_list {default 0;#设置默认值为0include ip_white.conf;
}
server {listen 8081;server_name 192.168.152.100;location / {root /var/www/test;index index.html index.htm index.php;if ( $ip_list = 0 ) {return 403;#限制的IP返回值为403,也可以设置为503,504其他值。#建议设置503,504这样返回的页面不会暴露nginx相关信息,限制的IP看到的信息只显示服务器错误,无法判断真正原因。}
在/etc/nginx目录下创建ip_list.conf,添加IP完成后,查看如下:
cat /etc/nginx/ip_list.conf192.168.152.1 1;
192.168.150.0/24 1;
设置完成,ip_list.conf的IP为白名单,不在名单中的,直接返回403页面。黑名单设置方法相同。
2.3 ngx_http_geo_module 负载均衡(扩展)
ngx_http_geo_module,模块还可以做负载均衡使用,如web集群在不同地区都有服务器,某个地区IP段,负载均衡至访问某个地区的服务器。方式类似,IP后面加上自定义值,不仅仅数字,如US,CN等字母。
示例:
如果三台服务器:122.11.11.11,133.11.12.22,144.11.11.33
geo $country {default default;111.11.11.0/24 uk;#IP段定义值uk111.11.12.0/24 us;#IP段定义值us}
upstream uk.server {erver 122.11.11.11:9090;#定义值uk的IP直接访问此服务器
} upstream us.server {server 133.11.12.22:9090;#定义值us的IP直接访问此服务器
}upstream default.server {server 144.11.11.33:9090;#默认的定义值default的IP直接访问此服务器
}server {listen 9090;server_name 144.11.11.33;location / {root /var/www/html/;index index.html index.htm;}}
3. 限制特定ip对特定网页的访问
举例:
server {listen 8080;server_name 127.0.0.1;location / {root html/dist/;index index.html index.htm;try_files $uri $uri/ @router;index index.html;}# ^~ 表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录# 匹配任何以 /city 开头的地址,匹配符合以后,停止往下搜索正则# /city 服务器端的接口,不是浏览器(客户端)的地址location ^~ /city {allow 125.36.3.68;deny all;root html/dist/;index index.html index.htm;try_files $uri $uri/ @router;index index.html;}location /myapi/ {proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://192.168.2.22:9090/;}location @router {rewrite ^.*$ /index.html last;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}
4. 国家地区IP限制访问
国家地区IP限制访问
5. 相关优质文章
- linux下安装nginx
- nginx 配置|禁止访问规则
参考:
https://blog.csdn.net/wpxxs/article/details/110197873?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2defaultCTRLISTRate-1-110197873-blog-85932079.pc_relevant_multi_platform_whitelistv4eslandingctr2&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2defaultCTRLISTRate-1-110197873-blog-85932079.pc_relevant_multi_platform_whitelistv4eslandingctr2&utm_relevant_index=1
nginx 配置|禁止访问规则相关推荐
- nginx配置禁止访问目录或禁止访问目录下的文件
某些网站系统需要用户上传图片等文件到某些目录下,难免程序有些漏洞,导致用户上传了php.cgi等等可执行的文件,导致网站陷入非常为难的境地. 此时我们可以通过nginx来禁止用户访问这些目录下的可执行 ...
- Android Linux自带iptables配置IP访问规则
利用Linux自带iptables配置IP访问规则,即可做到防火墙效果 初始化防火墙Chain规则 禁止指定app访问数据网络 禁止指定app访问wifi 转载于:https://www.cnblog ...
- Apache和Nginx下禁止访问特定的目录或文件
例如:http://www.domain.com/test/a.txt,此时a.txt里的内容会全部暴露在外面了(有时这个txt是很机密的文件),这样以来就不安全了. 同样:我在Nginx配置后后也存 ...
- Linux中nginx配置图片访问路径
1.在Linux系统中下载nginx 这里介绍在ubuntu中下载nginx: https://blog.csdn.net/qq_23832313/article/details/83578836 2 ...
- nginx设置禁止访问某个页面及只允许域名访问或某个ip禁止访问
nginx配置访问某页面时提示404或跳转到首页,在server中配置与location同级下 server {if ($request_uri ~* "/xxxx.html"){ ...
- 快速通过nginx配置域名访问
配置nginx进行域名访问文件 在nginx安装目录下的conf目录下新建一个配置文件,比如你新加的域名为admin.hello.com,你希望通过这个域名访问admin项目,那么新建一个admin. ...
- Nginx配置wss访问实现微信小程序的websocket通信
WSS是Web Socket Secure的简称, 它是WebSocket的加密版本.WSS与WS类似于HTTPS和HTTP,不同之处在于是不同的通信协议,都运行在SSL(Secure Socket ...
- Nginx配置同时访问http和https
nginx配置SSL证书之后,https正常访问,但是http访问报400错误,配置如下: server {listen 80 default backlog=2048;listen 443;serv ...
- Nginx配置https访问
在这里我使用的是阿里云ECS,里面提供一年免费SSL证书 1.什么是HTTPS 根据维基百科的解释: 超文本传输安全协议(缩写:HTTPS,英语:Hypertext Transfer Protocol ...
最新文章
- 【Harvest源码分析】GetFilteredSignal函数
- 2017年诺贝尔生理学或医学奖揭晓
- 程序员幽默:一整天都在修复 bug 是啥感觉?
- 如何使用云原生数据湖,助力线上教育行业逐步智能化
- rust笔记3 referenceborrow
- 学习银行转账系统-代码摘取csdn
- 《机器学习基石》笔记:第一讲
- mac-数据库建模工具Workbench、PDMan
- 4种方法解决js跨域的实现方式
- 劉筱娟:人工智能名片能在移动互联网营销上发挥什么作用?
- html css 画梯形,css怎么画梯形?
- 异常处理(二)---------Field * in * required a bean of type '*' that could not be found.
- nginx代理 域名重定向
- android tablayout放图片,Android TabLayout的Indicator如何设置为图片
- 哥伦比亚大学计算机科学硕士排名,2020年哥伦比亚大学排名TFE Times美国最佳计算机科学硕士专业排名第16...
- ios自建服务器降级,iOS14降级操作步骤 iOS14怎么降级到iOS13
- 计算机电缆线对成缆系数,电线电缆的成缆系数是什么含义?
- 菩提本无树 明镜亦非台
- Python爬虫之模拟登陆
- matlab 文件输出到text文件总结
热门文章
- SQL优化 21 连击 + 思维导图
- linux中vim如何显示行数,vim 在linux下中如何设置显示行数
- 腐烂国度2主宰版计算机学知识,一、主宰版新内容/mod说明_腐烂国度2主宰版图文全攻略_全任务全基地详解资料攻略_新基地位置_3DM单机...
- 计算机中丢失mfc100d.dll,mfc100d.dll
- 中级会计师考过还考英语计算机不,中级会计师考试是笔试还是机考 机考怎么操作...
- 【毕业论文】| 基于Unity3D引擎的冒险游戏的设计与实现
- 私营的企业能不能随便的开除员工
- 深度学习实战13(进阶版)-文本纠错功能,经常写错别字的小伙伴的福星
- 【遥感图像处理】什么是亚像素,超像素?
- 在云服务器上基于docker安装jenkins