专业、低价、可靠、稳定、高性价比美国VPS/Xen服务器,RAID10硬盘、千M带宽,数据安全、速度有保证,支付宝付款自动开通,多种Linux/ Windows系统任选。
作者:欧诺VPS
发布时间:March 6, 2013
分类:Nginx,PHP,网络安全
Nginx下开多个虚拟机网站防跨站是首要的任务,PHP5.3之前的版本不支持open_basedir,只能通过控制PHP-cgi进程及目录用户权限进行限制,防止跨站访问。
先了解一下网站正常运行所用到的用户、目录权限:
Nginx进程运行用户:接收用户请求,处理静态文件,如果是PHP则转给PHP-CGI处理,网站目录拥有读权限。
PHP-cgi进程用户:处理
PHP文件,网站目录拥有读权限,个别目录需要写入权限。
让每个网站使用单独的PHP-CGI进程,创建PHP-FPM配置文件,修改以下:
1
2
3
4
5
| <value name="pid_file">/usr/local/php/logs/php-fpm.pid</value>
<value name="error_log">/usr/local/php/logs/php-fpm.log</value>
<value name="listen_address">/tmp/www.onovps.com.sock</value>
<value name="user">www.onovp.com</value> #PHP-CGI运行用户组
<value name="group">www.onovps.com</value> |
启动PHP-CGI进程:
1
| /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/www.onovps.com.conf |
设置网站目录权限,设Nginx运行用户为www:
1
2
3
| chown -R www.onovps.com:www /home/wwwroot/www.onovps.com
chmod -R 550 /home/wwwroot/www.onovps.com
chmod 701 /home/wwwroot/ |
再修改Nginx网站配置文件,解析PHP所使用的PHP-CGI进程:
1
2
3
4
5
6
| location ~ .*\.(php|php5)?$
{
fastcgi_pass unix:/tmp/www.onovps.com.sock;
fastcgi_index index.php;
include fcgi.conf;
} |
php-cgi进程简单管理脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| #! /bin/sh
# chkconfig: 2345 55 25
#http://www.onovps.com
cgi=/usr/local/php/bin/php-cgi
case "$1" in
start)
for conf in `ls /usr/local/php/etc/*.conf`
do
$cgi --fpm --fpm-config $conf
done
;;
stop)
for pid in `ls /usr/local/php/logs/*.pid`
do
kill -TERM `cat $pid`
done
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac |
专业、低价、可靠、稳定、高性价比美国VPS/Xen服务器,RAID10硬盘、千M带宽,数据安全、速度有保证,支付宝付款自动开通,多种Linux/ Windows系统任选。
作者:欧诺VPS
发布时间:August 7, 2012
分类:Nginx,OpenSSL
证书申请参考:StartSSL免费服务器SSL证书申请,使用自签名证书参考:Nginx配置自签名SSL证书。
下载StartSSL根证书并与申请到的StartSSL证书合并到一个文件:
1
2
3
4
| #http://blog.onovps.com
wget http://www.startssl.com/certs/ca.pem
wget http://www.startssl.com/certs/sub.class1.server.ca.pem
cat server.csr sub.class1.server.ca.pem ca.pem > blog.onovps.com.pem |
服务器私钥如果有设置密码要清除掉,不然启动
Nginx要输入
SSL密码。
1
| openssl rsa -in server.key -out blog.onovps.com.key |
更改
SSL证书权限:
1
| chmod 400 blog.onovps.com.* |
修改Nginx配置文件加载SSL证书:
1
2
3
| ssl on;
ssl_certificate /path/blog.onovps.com.pem;
ssl_certificate_key /path/blog.onovps.com.key; |
修改fcgi配置文件传递HTTPS参数,不然当前网页为HTTPS,下一链接主回到HTTP页面了。
1
| fastcgi_param HTTPS on; |
如果网站只允许使用HTTPS连接可添加Header头通知客户端转向HTTPS连接:
1
| add_header Strict-Transport-Security max-age=31536000; |
重启Nginx加载:
1
| /etc/init.d/nginx restart |
访问http://blog.onovps.com查看SSL证书:
专业、低价、可靠、稳定、高性价比美国VPS/Xen服务器,RAID10硬盘、千M带宽,数据安全、速度有保证,支付宝付款自动开通,多种Linux/ Windows系统任选。
作者:欧诺VPS
发布时间:July 1, 2012
分类:Nginx
Nginx可配合GeoIP模块定位IP所在物理位置并做相应处理,支持多个条件匹配:
1
2
3
4
5
6
7
8
9
10
| #http://blog.onovps.com
$geoip_country_code #国家代码2位,如CN
$geoip_country_code3 #国家代码3位,如CHN
$geoip_country_name #国家完整名称,如China
$geoip_region #所在地区
$geoip_city #所在城市,如BeiJing
$geoip_postal_code #邮政编码
$geoip_city_continent_code #所在洲,如AS
$geoip_latitude #纬度
$geoip_longitude #经度 |
编译安装
Nginx并添加
GeoIP模块:
1
2
3
4
5
6
7
8
| yum install geoip-devel #安装GeoIP解析库
wget http://nginx.org/download/nginx-1.0.15.tar.gz
tar zxvf nginx-1.0.15.tar.gz
cd nginx-1.0.15
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module \
--with-http_ssl_module --with-http_gzip_static_module --with-ipv6 --with-http_geoip_module
make
make install |
下载GeoIP城市国家数据库:
1
2
3
4
5
6
7
| #http://blog.onovps.com
mkdir -p /usr/local/nginx/geoip
cd /usr/local/nginx/geoip
wget http://www.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
gunzip GeoIP.dat.gz
gunzip GeoLiteCity.dat.gz |
编辑
Nginx配置文件加载GeoIP数据库:
1
2
3
4
5
| http
[...]
geoip_country /usr/local/nginx/geoip/GeoIP.dat; #国家数据库
geoip_city /usr/local/nginx/geoip/GeoLiteCity.dat; #城市数据库
[...] |
如需
Nginx传递变量给PHP,编辑fastcgi_params添加:
1
2
3
4
5
6
7
8
9
| fastcgi_param GEOIP_CITY_COUNTRY_CODE $geoip_city_country_code;
fastcgi_param GEOIP_CITY_COUNTRY_CODE3 $geoip_city_country_code3;
fastcgi_param GEOIP_CITY_COUNTRY_NAME $geoip_city_country_name;
fastcgi_param GEOIP_REGION $geoip_region;
fastcgi_param GEOIP_CITY $geoip_city;
fastcgi_param GEOIP_POSTAL_CODE $geoip_postal_code;
fastcgi_param GEOIP_CITY_CONTINENT_CODE $geoip_city_continent_code;
fastcgi_param GEOIP_LATITUDE $geoip_latitude;
fastcgi_param GEOIP_LONGITUDE $geoip_longitude; |
应用示例,Nginx判断如果访问者IP所在国家为美国或中国,返回404错误
1
2
3
4
5
6
| server
[...]
if ($geoip_country_code ~* (US|CN)) {
#return 404;
}
[...] |
新建
PHP程序测试GeoIP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| <html>
<head>
<title>IP地址检测,我的IP地址是多少?</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<?php
if (getenv(HTTP_X_FORWARDED_FOR)) {
$pipaddress = getenv(HTTP_X_FORWARDED_FOR);
$ipaddress = getenv(REMOTE_ADDR);
echo "<br>您的代理IP地址是: ".$pipaddress. " (via $ipaddress) " ;
} else {
$ipaddress = getenv(REMOTE_ADDR);
echo "<br>您的IP地址是 : $ipaddress";
}
$geoip_city_country_code = getenv(GEOIP_CITY_COUNTRY_CODE);
$geoip_city_country_code3 = getenv(GEOIP_CITY_COUNTRY_CODE3);
$geoip_city_country_name = getenv(GEOIP_CITY_COUNTRY_NAME);
$geoip_region = getenv(GEOIP_REGION);
$geoip_city = getenv(GEOIP_CITY);
$geoip_postal_code = getenv(GEOIP_POSTAL_CODE);
$geoip_city_continent_code = getenv(GEOIP_CITY_CONTINENT_CODE);
$geoip_latitude = getenv(GEOIP_LATITUDE);
$geoip_longitude = getenv(GEOIP_LONGITUDE);
echo "<br>国家 : $geoip_city_country_name ( $geoip_city_country_code3 , $geoip_city_country_code ) ";
echo "<br>地区 : $geoip_region";
echo "<br>城市 : $geoip_city ";
echo "<br>邮政编码 : $geoip_postal_code";
echo "<br>所在洲 : $geoip_city_continent_code";
echo "<br>纬度 : $geoip_latitude ";
echo "<br>经度 : $geoip_longitude ";
?>
</body>
</html> |
专业、低价、可靠、稳定、高性价比美国VPS/Xen服务器,RAID10硬盘、千M带宽,数据安全、速度有保证,支付宝付款自动开通,多种Linux/ Windows系统任选。
作者:欧诺VPS
发布时间:July 1, 2012
分类:Nginx,PHP
Nginx配置Fastcgi解析PHP时会调用fastcgi_params配置文件来传递服务器变量,默认内容如下:
1
2
3
4
5
| #参数设定 #传递为PHP变量名 #Nginx自有变量,可自定义
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length; |
可以修改配置文件设定自定义变量传递到php-cgi端:
1
| fastcgi_param onovps "Hello onovps"; |
新建php文件通过$_SERVER[""]变量测试:
1
2
3
| <?
echo $_SERVER["onovps"];
?> |
1
2
| curl www.onovps.com/onovps.php
Hello onovps |
专业、低价、可靠、稳定、高性价比美国VPS/Xen服务器,RAID10硬盘、千M带宽,数据安全、速度有保证,支付宝付款自动开通,多种Linux/ Windows系统任选。
作者:欧诺VPS
发布时间:June 27, 2012
分类:Nginx
HTTP协议发送请求时会附加accept_language,通过它可知道浏览器所支持的语言,一般也为操作系统默认的语言。
列举一些accept_language标识:
1
2
3
4
5
| zh 中文
zh-cn 大陆
zh-tw 台湾
zh-hk 香港
en 英文 |
配置
Nginx允许中文用户访问,拒绝其它语言用户访问。
1
2
3
4
| if ( $http_accept_language ~* ^[^zh])
{
return 404; #非中文用户访问网站返回404
} |
用
Curl测试:
1
2
3
4
5
6
| curl -I -H "Accept-Language:en" www.onovps.com
HTTP/1.1 404 Not Found
Date: Wed, 20 Jun 2012 18:38:33 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive |