手工配置 Nginx 反向代理 Apache 的全过程

现在很流行这种 LANMP 的组合,因为 Nginx 具有强力的静态文件、并发处理和反向代理能力,而 Apache 具有高安全性的 PHP 解析模块。于是今天自己手工配置了一遍这两个组合。

注意:本文载于小杜博客,因此要求读者在引用、转载、演绎或以其他形式使用本文内容时,必须遵守CC-by-sa协议(在页面顶部或底部均能看到协议大意及全文),按照协议要求对本文来源进行链接、使用和共享。

环境:主机上安装VirtualBox 4.1.2 For Windows,虚拟机为全新安装的Ubuntu Server 11.04(安装了自带的LAMP服务器,Apache 2.2.17 + PHP 5.3.5 + MySQL 5.1.54),软件包全部使用自带(不手动编译),更新源为网易163源。

虚拟机网络与主机桥接,DHCP获取到IP为192.168.1.5。

1. 安装Nginx,很简单,一行命令。Nginx版本为0.8.54。

# sudo apt-get update && sudo apt-get install nginx

2. 为Apache创建两个网站test1.du9l.com、test2.du9l.com(已经在主机上用Hosts解析到192.168.1.5),使其侦听于127.0.0.1:80,并启用网站。(以下只演示test1的配置,test2只需复制过去修改一下即可)

# sudo nano /etc/apache2/sites-available/test1

<VirtualHost 127.0.0.1:80> # 侦听的端口
ServerAdmin test1@localhost
ServerName test1.du9l.com # 绑定的域名
 
DocumentRoot /var/www/test1 # 先创建好这个目录
 
<Directory />
AllowOverride All
</Directory>
 
#ErrorLog ${APACHE_LOG_DIR}/test1.err
#LogLevel warn
#CustomLog ${APACHE_LOG_DIR}/test1.log combined # 这三行是Apache访问和错误日志 请看附录(3)
</VirtualHost>

# sudo a2ensite test1

3. 为Nginx创建同样的网站,侦听于公网IP和端口80(这里是192.168.1.5:80),并启用网站。这里把所有跟反向代理和PHP有关的配置都写入xiaodu.conf,便于重复利用。还是只演示test1,如果还有其他网站,只添加新的文件,无需修改xiaodu.conf。

# sudo nano /etc/nginx/xiaodu.conf

location / {
try_files $uri $uri/ @apache;
}
 
location ~ .php$ { # 这里注意 只对.php结尾的传到代理 如果使用的是过时的.php/xxx传参 请自行修改
proxy_pass http://127.0.0.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
 
location @apache {
proxy_pass http://127.0.0.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
} # 凡是带有.php的,或找不到(试图Rewrite)的,都传给127.0.0.1:80的Apache。
 
location ~ /.ht {
deny all;
} # 禁止访问htaccess或htpasswd文件,Apache本身默认有这个配置了。

# sudo nano /etc/nginx/sites-available/test1

server {
listen   192.168.1.5:80;
#listen   [::]:80 default ipv6only=on; ## listen for ipv6 这里没有开IPv6,需要开的话直接去掉开头的#号,Apache里无需任何修改。
 
root /var/www/test1; # 要跟Apache里的一样
index index.html index.htm index.php; # 默认首页 这里的首页(例如index.html)存在的话不会去后台Rewrite,所以一定要想好,是否需要设置
 
server_name test1.du9l.com; # 绑定域名,与Apache里的对应
 
access_log /var/log/nginx/test1.log; # Nginx的访问日志 详见附录(3)
 
include xiaodu.conf; # 包含上面那个公共配置
}

# sudo ln -s /etc/nginx/sites-available/test1 /etc/nginx/sites-enabled/test1

4. 启动(或重启)两个服务,Apache里默认关闭的mod_rewrite也启用。

# sudo a2enmod rewrite

# sudo service apache2 restart

# sudo service nginx restart

5. 测试相关内容:

(1) 基本的静态文件、绑定域名测试:

(2) PHP后台处理测试(没有测MySQL,也没有必要。注意是Apache2Handler):

(3) Rewrite测试(重写到一个PHP文件的QueryString中,Nginx没有启用Rewrite支持):

扩展阅读:

(1) LNMP一键安装包中的LNMPA架构:包含Nginx、Apache、MySQL和PHP的源码编译脚本,并且有一个能自动创建主机的bash脚本,非常给力。 http://www.lnmp.org/lnmpa.html

(2) Nginx官方文档:HttpProxyModule HttpCoreModule http://wiki.nginx.org/。

参考文献:

(1) 《Windows下Nginx……》(来自“车燕冰的博客”) http://blog.sina.com.cn/s/blog_495697e60100v1n5.html 有删改,会写在下面的附录中。

(2) 《Ubuntu用Nginx……》(来自“新风宇宙”) http://www.cnblogs.com/php5/archive/2011/08/19/2146033.html

附录:

(1) Proxy传递的Host用于区分域名,否则会出现400错误。而参考文献1中有一行proxy_redirect off,这行是错误的,因为如果Apache传递了一个301/302跳转,Nginx必须反向地对Location进行处理,默认值default是正确的。

(2) 在参考文献2中后半段描述的问题,部分应用发现自己运行的Apache在非80端口,则会自行加上端口号。如果只将Apache侦听于内部IP端口(如集群中的192.168.或10.段,或单机时的127.段),而将Nginx侦听于外网IP的80端口(默认是全部IP,那样Apache将无法启动),就能完美的解决这个问题。

(3) 关于Apache的日志注意两点:一是会跟Nginx的日志冗余,尤其是访问日志,基本没有必要开,使用上面Nginx配置的日志即可。二是Apache日志如果非要用的话,请自己修改下日志格式,使用LogFormat或CustomLog命令即可,修改时注意要把访客IP地址设为X-Real-IP的地址。

(4) 这里介绍的只是一个基本架构,具体应用时可能有许多变化。例如可以在Nginx配置中设置将js、css等文件缓存多久,或者Apache是一个集群,需要用upstream来做负载均衡。更多优化方法请自行查看官方文档。

注意:本文载于小杜博客,因此要求读者在引用、转载、演绎或以其他形式使用本文内容时,必须遵守CC-by-sa协议(在页面顶部或底部均能看到协议大意及全文),按照协议要求对本文来源进行链接、使用和共享。

使用 uTorrent 的 ipfilter 过滤指定IP段

写这篇主要是有一个来访记录,查的就是如何使uTorrent屏蔽IPv4流量,其实方法很简单,我这里只是把官方教程解释一下。

uTorrent 官方关于 ipfilter 的教程:http://www.utorrent.com/intl/zh_cn/help/faq/misc

1. 首先打开 uTorrent 所在目录,如果不知道在哪,通常在 %appdata%utorrent (按Win+R后输入这个缩写点确定即可)。

2. 这个目录中有一个 ipfilter.dat 文件,如果没有的话创建一个,然后用记事本打开。

3. 按照以下格式输入IP段,每行一条(//后为解释,不需要输入):

x.x.x.x  //过滤单个IPv4地址
x.x.x.x-y.y.y.y  //过滤IPv4段
[a:b:c:d:e:f:g:h]  //过滤单个IPv6地址
[a:b:c:d:e:f:g:h]-[i:j:k:l:m:n:o:p]  //过滤IPv6段
[a:b:c:d::]/nn  //过滤IPv6子网

例如,过滤全部IPv4则输入: 0.0.0.0-255.255.255.255 。过滤全部 IPv6 则输入: [::]/0
注意:仅用ipfilter并不能很好的过滤 IPv4 或 IPv6,有时候还可能产生流量,建议配合防火墙使用。)

4. 保存这个文件。要使设置立即生效,可以在 uTorrent 中的“用户”页面上右键–“载入IP过滤”。

CloudFlare免费CDN正式支持IPv6

9月28日收到了CloudFlare的一封邮件,告诉我CF一周年并且开始支持Automatic IPv6 Gateway(自动IPv6网关),也就是说已经支持IPv6的CDN服务。

1. 进入CloudFlare后台:https://www.cloudflare.com

2. 如果还没使用CloudFlare的服务,请先按照 http://t.du9l.com/post/10 的方法添加好域名。添加成功后,在右侧点击Settings – CloudFlare Settings。

3. 向下找到 Automatic IPv6,后面有三种模式,按照下面介绍选择一个即可。

原英文介绍和个人理解的中文介绍附下:

Automatically enable IPv6 networking for all your orange-clouded websites. CloudFlare will listen to IPv6 even if your host or server only supports IPv4. You can toggle the orange-cloud status in your DNS editor. In safe mode, support will be limited to websites under ipv6.du9l.com.

大概就是说首先要将想要IPv6的域名设为橙色云(启用CloudFlare加速的状态),然后Off表示不用IPv6,Safe表示只添加一个ipv6.example.com这样的域名解析为IPv6,而Full表示解析为双栈(即每个域名都有A和AAAA记录)。


IPv6 CDN服务除了可以对以前不支持的AAAA记录进行CDN加速,也可以使你的纯IPv4网站拥有IPv6地址。例如解析本博客域名:

其他功能方面与之前的CDN完全相同。另外,CloudFlare的IPv6地址范围是 2400:cb00::/32,如果源主机上有相关限制一定不要忘了把这条允许了。

附录:CloudFlare使用哪些IP段来抓取网站?(来自官方知识库“What IP address ranges does CloudFlare use?”

  • 204.93.240.0/24 (204.93.240.0 – 204.93.240.255)
  • 204.93.177.0/24 (204.93.177.0 – 204.93.177.255)
  • 199.27.128.0/21 (199.27.128.0 – 199.27.135.255)
  • 173.245.48.0/20 (173.245.48.0 – 173.245.63.255)
  • 103.22.200.0/22 (103.22.200.0 – 103.22.203.255)
  • 141.101.64.0/18 (141.101.64.0 – 141.101.127.255)
  • 2400:CB00:/32 (2400:CB00:0000:0000 – 2400:CB00:FFFF:FFFF)

PT下载免流量的方法(需要防火墙支持)

这里介绍的是PT下载时可以免计下载流量的一个方法,需要你的电脑上有软件防火墙支持(Windows自带没试过,推荐Comodo),对IPv4或IPv6的PT通用。

Comodo防火墙(推荐,支持Windows操作系统各种版本):http://personalfirewall.comodo.com

这里介绍时一律以uTorrent为准(对PT协议严格遵守):http://www.utorrent.com

最近图片服务器挂了,修复后再上图。

1. 打开uTorrent,将下载的种子拖进去,不要选“开始下载”,然后点确定。

2. 选中种子,切换到“伺服”(Tracker)页面,会看到数个PT Tracker地址,形如“http://bt.neu6.edu.cn:6969/…”这样的。

3. 使用Ping或Nslookup查询服务器地址。

C:>nslookup bt.neu6.edu.cn
名称:    bt.neu6.edu.cn
Address:  2001:da8:9000::232

4. 打开Comodo防火墙,在防火墙–网络安全规则–全局规则,添加下列规则:行为–拒绝,目的地址–IPv4则输入地址,IPv6建议用/64掩码。其他默认,点击“应用”关闭规则窗口,但是不要点最后的“确定”

5. 在uTorrent中开始下载,然后等数秒,在Tracker第一次刷新完毕后,立刻在Comodo中点击“确定”。之后整个下载过程中再也不要允许访问Tracker,下载完成后,退出uTorrent,最后在Comodo中删除规则。

注意:在不计下载流量期间,上传流量也是不计的。因此一定要退出uTorrent、删除规则后,再重新打开做种。此文的主要目的在于揭示PT协议中存在的问题,而非教大家如何作弊,请勿过分使用。


好了,下面是原理,没有探索心的读者们可以止步去搞下载了。

原理是这样的:PT协议的简单流程为–第一次访问Tracker获取种子和用户,以后每次访问Tracker时,均提交上次的上传、下载量,并刷新更多用户。所以如果你屏蔽了之后的Tracker访问,Tracker会以为你停止了下载,但是其他用户提交的上传下载量都是匿名的(即他们的上传量不会标记是谁下载的),所以你就安全啦……

这个就是利用了PT协议的原理,只有Tracker知道所有用户的身份,而用户间传输是完全匿名的(他们不知道你的Passkey,只能看到你的IP)。如果你更Geek,网上有大神曾经写过利用PT协议的作弊器,可以直接批量向种子里的Tracker发送上传流量,请自行Google(这样有可能会被检测到并封号的,NexusPHP里就有非正常流量检测功能)。

Paypal付款后帐户受限制的人工解封过程

今天在网上用Paypal花1美金买了个东西,上网的时候一直开着某公用代理,付款之后发现被帐户被Paypal限制,交易也被Hold住了。下面是解决方法。

Paypal官网:https://www.paypal.com

邮箱里收到一封邮件,告诉我帐户已经被限制。自己解封的话,首先进入登入帐户,然后点“调解中心”,“启动对账户限制的审查”下面会告诉你帐户被封的情况,以及解封的步骤。我这里要求进行三步:更改帐户密码、更改密码提示问题和验证信用卡。What?!哥没有信用卡啊肿么办……于是下面介绍的是如何通过打Paypal客服电话来进行人工解封

1. 首先,打开Paypal帐户,登陆进去之后,在页面下方有一个“联系我们”。网址在此:https://www.paypal.com/c2/cgi-bin/helpscr?cmd=_help&t=escalateTab

2. 点击进入之后,左边有“给我们打电话”的选项,点击之后稍等就会出现一个六位数字“网络识别码”,以及本地Paypal的客服电话。在我这里看到的是021-28913888(不要直接拨打,先去上述网址获得识别码和正确的电话号码后再打)。

3. 打过去电话,首先按1选普通话服务,然后如果你的电话号码不是账号绑定的号码,就会问你是否有Paypal帐户,然后按1说已经有帐户,然后输入上面得到的六位识别码按井号键(#)结束。

4. 之后Paypal的人工客服会告诉你是肿么限制的,以及跟你确认你的开户姓名和一条帐户信息(我这里是问的出生日期),确定你是帐户持有人之后,就会帮你解封掉帐户,并且发送付款。