Nginx反代超详细教程:加速网站Google、Gravatar和Hostloc
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以下的版本不要加入--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、增加用户和用户组(好像不增加也没什么问题,估计安装nginx的时候会按照配置参数添加的吧)。
/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头像照抄上面就可以了。
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; } }
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的。建议反代都加上。
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
最后
我急得有人问我你知道哪几个App Server程序,当时我回答了Tomcat和Nginx,但是别人告诉我Nginx最多算个代理服务器,现在接触多了,算是懂了
via。https://blog.iplayloli.com/nginx-reserve-proxy-google-gravatar.html#cache_setting