nginx 这个轻量级、高性能的 web server 主要可以干两件事情:

1、直接作为http server(需要Fastcgi配合);
2、作为反代服务器(进一步可以实现均衡负载)。

这里主要利用一下反功能来方便一下日常生活。选择Gravatar当例子是因为尼玛我发现了我这的移动把Gravatar整站都墙了,还有hostloc也是移动访问困难。

#update2016.01.11:反代Google想偷懒可以使用我的一键包

一、Nginx反代超详细教程:Nginx安装和基本操作

1、可以使用一键包安装,最火的应该是军哥的一键包了吧(http://lnmp.org),不过如果使用一键包都不包下面的两个第三方模块,想添加第三方模块可以参照下面的教程编译一个nginx替换,至于原来的nginx参数可以通过命令nginx -V查看。

2、我选择手动安装,毕竟我只需要nginx,而且也用不到军哥为了方便而顺带编译进去的模块。
我的VPS没有绑定V6的IP地址,V6模块我也省了,还有1.9.5以下不支持http2,不要加入--with-ngx_http_v2_module这个参数,没有这个模块会导致configure失败。

wget http://nginx.org/download/nginx-1.8.0.tar.gz #可以根据你的喜好选择版本号
git clone https://github.com/yaoweibin/ngx_http_substitutions_filter_module
git clone https://github.com/FRiCKLE/ngx_cache_purge
tar xzf nginx-1.8.0.tar.gz
cd nginx-1.8.0
./configure --prefix=/usr/local/nginx \ #nginx安装位置
--conf-path=/usr/local/nginx/conf/nginx.conf \ #nginx配置文件路径
--user=www --group=www \
--error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log \ #日志路径
--pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock \
--with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi \
--add-module=/root/ngx_http_substitutions_filter_module \ #文本替换模块
--add-module=/root/ngx_cache_purge #缓存模块
make && make install

3、如果在执行以上命令遇到./configure: error: the HTTP rewrite module requires the PCRE library.错误提示。

wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.37.tar.gz
tar xzf prce-8.37.tar.gz
cd prce-8.37
./configure
make&&make install

其实编译的时候各种奇葩情况都有,不懂就百度。不过好像百度比较辣鸡!辣鸡!辣鸡!
4、增加用户和用户组(好像不增加也没什么问题)。

/usr/sbin/groupadd -f www
/usr/sbin/useradd -g www www
5、修改Nginx配置文件(可省略),需要注意的是从源安装的Nginx的配置文件在/etc/nginx 在nginx.conf的http层加入以下内容:
proxy_connect_timeout    5;
proxy_read_timeout       60;
proxy_send_timeout       5;
proxy_buffer_size        16k;
proxy_buffers            4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_temp_path   /home/cache/temp;
#临时文件目录
proxy_cache_path  /home/cache/path levels=1:2 keys_zone=cache_one:5m inactive=7d max_size=1g;
#5m为内存占用,1g为最大硬盘占用,cache_one为缓存区名字,如果修改则下文的配置亦要相应修改。
include vhost/*.conf; #导入conf目录中vhost目录里的所有以conf为后缀的文件,这样我们可以把虚拟主机的配置文件分散到单独文件中,方便修改

对了,别忘了新建目录,否则启动nginx的时候会提示目录不存在

mkdir /home/cache/path -p
mkdir /home/cache/temp
chmod 777 -R /home/cache

6、此时可以运行nginx了。

/usr/local/nginx/sbin/nginx

7、每次修改完都要先检测一下配置文件有没有错。

/usr/local/nginx/sbin/nginx -t

8、热重载(不中断服务)。

/usr/local/nginx/sbin/nginx -s reload

二、Nginx反代超详细教程:Nginx基本反向代理

1、nginx.conf里边有这么一句include conf.d/*.conf,但是一键包用多了,我习惯放在vhost里边,我基本会修改成include vhost/*.conf
2、直接到vhost目录新建一个conf文件,下面是一个基本反代的配置文件例子。

server{
    listen 80;
    server_name g.32.pm;#server_name是你绑定的域名
    location /avatar { #绑定到 uri,例如我这里是 //g.32.pm/avatar 反代https://secure.gravatar.com/avatar
        proxy_pass https://secure.gravatar.com/avatar; #你需要反代的网站
    }
}

3、反代Gravatar头像照抄上面就可以了。
nginx反代gravatar
4、反代Google有点特殊的,proxy_pass改成google还不行,还要设置Header,不过有个问题:用的人多了就有可能会被Google判断为机器人从而出现验证码,这时候可以使用upstream解决。往http层加入upstream代码。至于如何寻找Google的IP,问Google去吧。

upstream google.com {
    server 223.255.227.156:80 max_fails=3;
    server 223.255.227.157:80 max_fails=3;
    server 223.255.227.158:80 max_fails=3;
    server 223.255.227.159:80 max_fails=3;
}
server {
    listen 80;
    server_name g.32.pm;
    location / {
        proxy_pass http://www.google.com;
        proxy_set_header Host www.google.com;
        proxy_set_header User-Agent $http_user_agent;
        proxy_set_header Referer http://www.google.com;
    }
}

反代Google,Google镜像
5、至于最后一个例子就是标题提到的全球主机交流论坛(hostloc),也是和上面的一样。

三、Nginx反代超详细教程:反向代理优化

1、大多数人Gravatar都不会经常修改,但是上面的配置是每次访问都要通过VPS访问一次Gravatar源站,这样效率就明显不足了,这时候就体现了缓存的作用了。

先往HTTP层加入Cache设定:参考这里

server{
    listen 80;
    server_name g.32.pm;
    location / {
        proxy_pass https://secure.gravatar.com/;
        #告诉后端你的真实IP
        proxy_cache cache_one;#cache空间名字
        proxy_cache_valid  200 304 3d;
        proxy_cache_key $host$uri$is_args$args;
        expires 10d;
        #网上照抄的缓存设定
    }
}

2、经常登录各种DZ论坛的肯定都知道DZ登录会提示你登录IP的变化情况,如果你是直接照着上面的基本配置反代的话,无论谁通过你的反代访问hostloc,都会提示IP变成了你的VPS的IP,那怎么告诉后端服务器你的IP呢,nginx恰好有这么个参数传递IP的。建议反代都加上(需要服务器支持,没观察过 LOC)。

server{
    listen 80;
    server_name 不能告诉你;
    location / {
        proxy_pass http://www.hostloc.com/;
        proxy_set_header X-Real-IP       $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #告诉后端你的真实IP
    }
}

3、加入SSL功能,SSL加密通信可以减少非法反代(例如Google镜像)被墙的可能性(想啥呢,该被墙还是会被墙)。

server {
    listen 443;
    server_name g.32.pm;

    if ($host = 'www.g.32.pm') {
        rewrite ^/(.*)$ https://g.32.pm$1 permanent;
        #统一www域名到不带www域名
    }
    ssl_certificate /root/ssl/crt.crt;
    ssl_certificate_key /root/ssl/crt.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-RC4-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:RC4-SHA:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!DSS:!PKS;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 5m;
    #网上照抄的SSL参数

    location / {
        proxy_redirect off;
        proxy_pass https://www.google.com/;
        proxy_set_header Host www.google.com;
        proxy_set_header User-Agent $http_user_agent;
        proxy_set_header Referer http://www.google.com;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
    }
}

4、使用subs_filter优化请求。
这是后你访问你的Google镜像还会存在直接访问google.com请求,你可以使用F12中网络部分或者Fiddle查看,这里不阐述了,教程百度都有。
如果你时按照上面的教程做的话,那么subs_filter模块肯定装好了,直接翻回去看。
往location层加入filter语句即可

server {
    location / {
        proxy_set_header Accept-Encoding "";#关闭Gzip是subs_filter能正常工作
        proxy_pass https://www.google.com/;
        subs_filter www.google.com g.32.pm;
    }
}

subs_filter详细用法在这里:https://github.com/yaoweibin/ngx_http_substitutions_filter_module