欧诺VPS博客

专业、低价、可靠、稳定、高性价比美国VPS/Xen服务器,RAID10硬盘、千M带宽,数据安全、速度有保证,支付宝付款自动开通,多种Linux/ Windows系统任选。

Nginx下多网站单独php-fpm进程目录权限防跨站

作者:欧诺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系统任选。

Nginx配置StartSSL免费SSL证书

作者:欧诺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证书:
查看blog.onovps.com证书.png

专业、低价、可靠、稳定、高性价比美国VPS/Xen服务器,RAID10硬盘、千M带宽,数据安全、速度有保证,支付宝付款自动开通,多种Linux/ Windows系统任选。

Nginx模块GeoIP匹配处理IP所在国家、城市

作者:欧诺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系统任选。

Nginx与PHP变量传递fastcgi_params

作者:欧诺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系统任选。

Nginx判断accept_language禁止英文浏览器/操作系统访问

作者:欧诺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
欧诺VPS博客»可靠、稳定、高性价比VPS 文章归档 ,本博客由欧诺VPS强力驱动。