Rootop 服务器运维与web架构

2019-12-26
发表者 Venus
nginx内置变量已关闭评论

nginx内置变量

$arg_PARAMETER #这个变量包含GET请求中,如果有变量PARAMETER时的值。

$args #这个变量等于请求行中(GET请求)的参数,例如foo=123&bar=blahblah;

$binary_remote_addr #二进制的客户地址。

$body_bytes_sent #响应时送出的body字节数数量。即使连接中断,这个数据也是精确的。

$content_length #请求头中的Content-length字段。

$content_type #请求头中的Content-Type字段。

$cookie_COOKIE #cookie COOKIE变量的值

$document_root #当前请求在root指令中指定的值。

$document_uri #与$uri相同。

$host #请求主机头字段,否则为服务器名称。

$hostname #Set to the machine’s hostname as returned by gethostname

$http_HEADER

$is_args #如果有$args参数,这个变量等于”?”,否则等于””,空值。

$http_user_agent #客户端agent信息

$http_cookie #客户端cookie信息

$limit_rate #这个变量可以限制连接速率。

$query_string #与$args相同。

$request_body_file #客户端请求主体信息的临时文件名。

$request_method #客户端请求的动作,通常为GET或POST。

$remote_addr #客户端的IP地址。

$remote_port #客户端的端口。

$remote_user #已经经过Auth Basic Module验证的用户名。

$request_completion #如果请求结束,设置为OK. 当请求未结束或如果该请求不是请求链串的最后一个时,为空(Empty)。

$request_method #GET或POST

$request_filename #当前请求的文件路径,由root或alias指令与URI请求生成。

$request_uri #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。不能修改。

$scheme #HTTP方法(如http,https)。

$server_protocol #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

$server_addr #服务器地址,在完成一次系统调用后可以确定这个值。

$server_name #服务器名称。

$server_port #请求到达服务器的端口号。

$uri #不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。

2019-12-26
发表者 Venus
nginx下载防盗链模块之ngx_http_secure_link_module安全下载已关闭评论

nginx下载防盗链模块之ngx_http_secure_link_module安全下载

nginx模块之ngx_http_secure_link_module安全下载

此模块可以对下载链接,比如/download/nginx.tar.gz 进行身份认证,一般用于只允许站内用户下载,节省带宽。
当在页面中用户点击”下载”按钮或者点击下载链接时,链接中带着身份认证及失效时间参数。
请求进入nginx后,nginx会使用secure_link模块对认证信息及失效时间进行校验后进行下载操作或者拒绝。

参考官方文档:http://nginx.org/en/docs/http/ngx_http_secure_link_module.html

server
{
	listen 80;
	server_name localhost server_default;
	root /usr/local/nginx/html;

	location /download/
	{
		secure_link $arg_md5,$arg_expires;
		secure_link_md5 "111111$uri$secure_link_expires";

		if ($secure_link = "")
		{
			return 401; # 这里返回401状态码,跟basic auth 一样
		}

		if ($secure_link = "0")
		{
			return 410; # 返回资源被删除状态码
		}
	}
}

nginx配置参数解释:

secure_link 从请求uri中获取指定的参数,下面两个即为获取的参数。
$arg_md5 #代表从nginx内置变量 $arg_PARAMETER (GET方法中) 获取参数值,比如 /index.php?md5=xxx,则$arg_md5等于xxx
$arg_expires # 同上

secure_link_md5 根据自定义密码+请求的uri+过期时间的时间戳 算出md5值
将此值与请求中的md5参数对比是否一致,如果不一致,则 $secure_link 变量为空字符串
如果两个值一致,则检查过期时间,如果过期了,则 $secure_link 变量为0,否则为1。

php参考生成下载链接:

<?php
// 自定义密码,跟nginx里一致
$secret = "111111";
// 文件uri
$uri = "/download/nginx.tar.gz";
// 失效时间,这里为300秒,可以设置一天。
$expire = time() + 300;
$md5 = md5($secret.$uri.$expire,true);
$md5 = base64_encode($md5);
// 把+替换为-,把/替换为_
$md5 = strtr($md5, '+/', '-_');
// 把=替换为空
$md5 = str_replace('=', '', $md5);
$url = "https://www.rootop.org:10000/download/nginx.tar.gz?md5={$md5}&expires={$expire}";
echo $url;

然后用此$url去访问。

shell生成下载链接:

root@rootop:~# echo -n '111111/download/nginx.tar.gz1577360554' | openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =

ps:这里时间戳不是实时获取,也没加超时时间。

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