Rootop 服务器运维与web架构

2019-12-23
发表者 Venus
The encoded file has format major ID 7, whereas the Loader expects 4 in xxx.php已关闭评论

The encoded file has format major ID 7, whereas the Loader expects 4 in xxx.php

php运行报500错误
通过nginx日志查到错误信息为:

Got error 'PHP message: PHP Fatal error:  Incompatible file format:  
The encoded file has format major ID 7, whereas the Loader expects 4 in /www/xxx.php on line 0\n'

大体意思说编码文件格式主ID是7,然而却载入了4
这个问题实际是由zend加密版本导致的。(这个项目的php代码是经过zend加密的)
通过 https://zend18.zendesk.com/hc/en-us/articles/217058968
可以看到php版本与zend加密版本之间的关系。

服务器上目前是安装了php5.3,对应的Zend Encoder ID为4,那么根据日志提示应该换成php5.6解决。

2019-12-22
发表者 Venus
通过nginx防盗链实现拒绝直接访问图片已关闭评论

通过nginx防盗链实现拒绝直接访问图片

有用户提了个需求,要实现拒绝图片直接访问,只允许在站内引用。
之前说过关于防盗链,现在还是通过防盗链方式实现。

# nginx 配置

server
{
	略·
	location ~* .(gif|jpg|png|jpeg)$
	{
		valid_referers server_names rootop.org; 

		if ($invalid_referer) 
		{ 
			return 403;
		}
	}
}

防盗链 配置中none,blocked去掉就是不允许referer头为空,去掉blocked就是不以http://或https://开头的referer拒绝。
这样直接访问图片会返回403,只有在页面中引用时,才可访问。

PS:
valid_referers 可以忽略客户端请求头referer头中的端口。

2019-12-19
发表者 Venus
nginx实现响应内容修改已关闭评论

nginx实现响应内容修改

ngx_http_sub_module模块是一个替换响应内容的模块,可以实现对请求返回的内容进行修改。
此模块nginx自带,但是需要编译nginx时加上此模块

--with-http_sub_module

官方文档:http://nginx.org/en/docs/http/ngx_http_sub_module.html

server
{
    listen 80 default_server;
    server_name www.a.com;
    index index.html;
    root /www/www.a.com;
    
    sub_filter 'index.html' '替换的内容1';
    sub_filter 'index.php' '替换的内容2';
    sub_filter_once on;
    sub_filter_types *;
}

# 测试html代码

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>测试</title>
</head>
<body>

	
<h3>第1行内容index.html</h3>

	
<h3>第2行内容index.html</h3>

	
<h3>第3行内容index.php</h3>

	
<h3>第4行内容index.php</h3>


</body>
</html>

当sub_filter_once on;值为on时,替换的内容只会替换一次,如果为off,则所有匹配的字符都会替换。
sub_filter_types 指对哪些mime-type类型替换。可以参考nginx下的mime.types文件。星号代表所有。

比如当反向代理后端服务时,后端服务代码里把资源地址写死时,可用此方法应急。

看网上有说开启gzip on;压缩功能时,导致无法替换,经过测试发现是可以。
可能是以前老版本的nginx不支持,这里测试本功能用的版本为nginx/1.16.0

2019-12-16
发表者 Venus
nginx反向代理加防盗链配置已关闭评论

nginx反向代理加防盗链配置

# 配置例子

server
{
	listen   80;
	server_name  www.rootop.org;

	root /home/web/www.rootop.org;
	
	location ~ .*\.(jpg|png|js|css)$
	{
		valid_referers none blocked server_names rootop.org;
		if ($invalid_referer)
		{
			return 404;
		}
		
		proxy_pass http://127.0.0.1:8080;
	}
	
	location /
	{
		proxy_pass http://127.0.0.1:8080;
	}
}

# 注意在防盗链的location中也要加一句proxy_pass,否则图片会从本地找,肯定会返回404状态码。

location ~ .*\.(jpg|png|js|css)$
{
	valid_referers none blocked server_names rootop.org;
	if ($invalid_referer)
	{
		return 404;
	}
	
	proxy_pass http://127.0.0.1:8080;
}

如果不加proxy_pass,在return 404这个地方很容易扰乱排错思路,以为是防盗链返回的404,实际是从本地找不到文件才返回的404.

# 防盗链参数解释

valid_referers 定义一个防盗链白名单
none 表示http请求头中没有Referer这个头信息
blocked 表示http请求头中虽然有Referer头信息,但是中间被防火墙或者被代理服务器删除。
server_names 表示设置的server_name
rootop.org 表示允许的Referer,支持通配符,也支持正则

符合以上条件的,nginx会将$invalid_referer这个内置变量的值设置为空字符串。
不符合的,也就是说Referer头信息不符合以上条件,比如 baidu.com,则会将$invalid_referer变量设置为1
这样通过if条件判断进行返回状态码,或者重定向到其他页面,比如一张图片。

参考官方文档:http://nginx.org/en/docs/http/ngx_http_referer_module.html#valid_referers

2019-12-15
发表者 Venus
nginx if多条件判断的实现已关闭评论

nginx if多条件判断的实现

if判断本身不支持多条件判断,用不了 && 或者|| 这种逻辑运算,而且if也不支持嵌套。
可以通过set变量来迂回实现。

比如这里我要实现访问a.rootop.org跳转到匹配子域名到指定的html页面。
dns和nginx已经配置了泛域名

实现效果:
a.rootop.org -> rootop.org/pages/a.html
b.rootop.org -> rootop.org/pages/b.html

但是这里要排除www.rootop.org的跳转

server
{
	listen 80;
	server_name rootop.org www.rootop.org *.rootop.org;
	root html;
	
	# 子域名跳转指定html页面
	# 先设置个变量
	set $subdomain "";
	
	# 正则获取三级域(也就是主机名)
	if ($http_host ~* "^(.*)\.rootop\.org$")
	{
		set $subdomain $1;
	}

	# 排除www
	if ($subdomain = "www")
	{
		set $subdomain "";
	}

	# 除www外的实现跳转
	if ($subdomain != "")
	{
		# 注意加上$scheme,如果是rootop.org/pages/xxx.html,则会认为是在域名后面加了个目录地址。
		return 301 $scheme://rootop.org/pages/$subdomain.html;
	}
}

如果想反过来实现也可以

# html页面跳转子域名
if ($uri ~* ".*/pages/(.*)\.html")
{
	return 301 $scheme://$1.rootop.org;
}