yjiang's cake

nginx开启dpdy协议支持

SPDY

spdy 优势

  1. 多路复用,请求优化
  2. HTTP头压缩
  3. 强制SSL协议传输

说白了,spdy的作用就是:对用户提升网站传输速度,增加安全性.对服务器降低连接数,减少资源消耗.

nginx开启spdy支持

spdy条件

  1. nginx 1.5.9 + (虽然从1.4.x就开始支持spdy了,但是早期版本功能并不完善,对此,nginx在spdy模块页有说明)
  2. openssl 1.0.1 +
  3. nginx 开启ssl模块

nginx 从1.5.10开始已经支持SPDY协议. 可以用命令 nginx -V 来查看自己的配置是否已经启用了 spdy 支持;自己看了一下,使用 aptitude install nginx安装的已经启用了 spdy. 即便不支持也没事,可以重新编译, 编译时增加 --with-http_spdy_module 参数来启用.

spdy-nginx

nginx 配置

可以参照 nginx官网对spdy模块的说明 来配置即可

server {
    listen 443 ssl spdy;

    ssl_certificate server.crt;
    ssl_certificate_key server.key;
    ...
}

修改完配置以后重启nginx使配置生效.

查看配置结果

安装chrome插件SPDY indicator 或者访问 <chrome://net-internals/#spdy> 来查看是否生效,如图

spdy-chrome

使用户默认访问SSL

server{
    listen 80;
    server_name yjiang.tk;

    rewrite ^(.*)$  https://$host$1 permanent;  
}

nginx监控工具 -- ngxtop

又一款小巧实用的python小程序 -- ngxtop

安装简单,用来实时监控nginx请求状态很不错

pip install ngxtop
ngxtop -l [nginx log file]

运行截图

ngxtop

实际使用中发现,在访问量非常大的时候,随着日志文件快速增长,会导致大量占用cpu,所以并不适合长时间使用

nginx做的正向代理报502错误

因为公司服务器是联通线路,而公司内部用的是电信的线路,导致了访问公司网站跟测试服务器时的各种残.于是用nginx在VPS上搭建了一个http代理用来加速.

今天忽然任何网站都提示502 Bad Gateway,难道代理挂掉了?SSH连到vps上看了下,端口正常,nginx运行正常,重启服务依旧502.

于是关掉代理google一番....

oh,shit,我大股沟又被墙了,挂上SSH代理继续google.

VPS的代理当时是这么配的,当看到一文章中解说nginx配置http代理时, resolver 8.8.8.8 本地如果dns不相同可能会导致502错误. 转而想到google今天被墙,是不是因为这个导致8.8.8.8的DNS失效了?

赶紧把resolver改成V2EX 提供的NDS](http://dns.v2ex.com/),重启nginx再测试,果然问题解决了.

哎~奈何我大天朝这防火长城不定期抽风搞的谷歌半死不活,苦了我等屌丝啊.

nginx正向代理(http代理)

在virtualhost中增加如下

server {
    listen  3128;
    location / {
        resolver 8.8.8.8;                   #DNS
        proxy_pass http://$http_host$request_uri;
    }
    #access_log /var/log/nginx/http_proxy.log;
}

然后重启nginx服务即可.

记:VPS折腾笔记6 - varnish

以前很多东西都是管理员给弄好,自己只要埋头写代码就好了,效率之类的完全不去考虑.

当问起这个事儿,管理员说:最后在外层拿varnish包一层缓存就好了.

varnish?

缓存?

完全云里雾里.

近来闲的无聊,抽空把varnish大概了解了一遍, 原来就是前端的文件缓存工具.

这种东西,感觉一定要折腾一下才有继续深入的动力,且想到VPS上这个wordpress博客,居然扛不住50的并发,相当的窝火啊(马大牛说可能是插件原因).就拿你开刀了.

因为nginx已经占用了80端口,而且包老板的网站也都在上面,其中有个dz论坛,这东西好像并不适合做文件缓存,这样就不能整体把nginx端口改为非80端口.所以就有了下面这个方案:

varnish+nginx

我想应该有更好的解决办法,知道的话还请不吝赐教,谢谢!

开始实施

1.安装varnish的方法官方写的很详细,直接链接过来.

2.安装完后修改 /etc/varnish/default.vcl.

backend default {
    .host = "yjiang.tk";
    .port = "8080";
}
sub vcl_recv {
    if (!(req.url ~ "wp-(login|admin)")) {
        unset req.http.cookie;
    }
}
sub vcl_deliver {   #输出命中状态到http_header
    set resp.http.x-hits = obj.hits ;
    if (obj.hits > 0) {
        set resp.http.X-Cache = "hit cache";
    }
    else {
        set resp.http.X-Cache = "miss cache";
    }
}
sub vcl_fetch {
    set beresp.grace = 60m;
    if (!(req.url ~ "wp-(login|admin)")) {
        unset beresp.http.set-cookie;
    }
}

3.简单写个脚本来重启varnish以及修改到默认的端口.

#!/bin/sh

if [ -z $1 ]
then
    echo "defalut port 8080 used"
    port=8080
else
    port=$1
fi

pkill varnish

varnishd -f /etc/varnish/default.vcl \
         -s file,/tmp/varnish_cache.data,128M \
         -a 0.0.0.0:$port

netstat -ntlp | grep varnish

4.nginx虚拟主机文件修改,把原来的80端口改为8080,并新增个一个反向代理到80端口.

   server {
    listen  80;
    server_name yjiang.tk;            #绑定域名
    location / {
        proxy_pass http://127.0.0.1:88;
        include /etc/nginx/proxy_params;
    }
}

server {
    listen  8080;
    server_name yjiang.tk;            #绑定域名 
    root /var/www/cake;                     #网站根目录
    index index.htm index.html index.php;   #默认文件
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        #fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
        include /etc/nginx/fastcgi_params;  #fastcig_params参数文件地址
    } 
    access_log  /var/log/nginx/access_cake.log;
    error_log  /var/log/nginx/error_cake.log;
}

5.执行重启varnish的脚本并重启nginx,OK.


测试一下效果

QQ图片20130606122509

webbench测一下,500并发量的情况下,CPU占用15.6%,感觉良好.

iftop_201430606

刷新下网站,依旧打不开,用 iftop 一看,带宽占满了.这个瓶颈就只能靠万能的RMB了...


问题

  • 当给nginx设置一个非80端口并访问此域名时,总会跳到IP默认站点.(已解决:如何设置nginx的IP默认站点

  • 如果nginx不设置一个默认站点,依旧会访问到一个虚拟主机,没搞明白哪里设置出问题了.

  • varnish配置文件还只有个后端,其他规则需要继续折腾.

Copyright © 2016 yjiang's cake

返回顶部