为什么你应该总是使用Nginx与微缓存


为什么你应该总是使用Nginx与微型缓存

每个人都知道尽可能多地从您的网络服务器推出。 在我作为托管工程师的日常职业中,这意味着我经常得到同样的问题,“哇,很酷的网站,但它能应付大量的流量吗?

“正常”的情况

在Apache下使用mod_php运行的“正常”网站应该能够轻松推出20个请求,但是如果您每秒收到50个请求(对于某些网站,如政党网站等,不奇怪)呢? 在我看来,答案是放弃Apache,因为现在,Apache只是不再削减它了。

是! Nginx!

来了Nginx! 那么你所做的就是在Nginx上设置你的网站,并运行一个快速的loadtest(例如,一个1000个并发用户的1000个请求),你看到你不会比Apache更多,但是如何呢? 这真的很简单,这是因为Nginx没有内置的PHP模块,所以你需要一个fastcgi处理器来处理php页面(我建议使用php-fpm,因为它比spawn-cgi好)。 那么现在你应该怎么用? 使用microcaching!

什么是Microcaching?

什么是微型缓存? 那么理论就是你在短时间内缓存你的文件等(例如1秒)。 这是什么意思是当用户请求缓存它的页面,所以下一个请求的任何其他将来自缓存,并且100个用户在5秒内请求只有20个用户中的1将不得不建立整个页面(并与Nginx和一个很好的结构化网站这没有任何问题)。

我不相信!

你最好相信它! 让我举个例子,看看你现在在这个网站上。 假设我们对200个并发用户的1000个请求进行了负载测试。 如果你在Apache下运行这个网站,你将得到10-40个请求,最多! 而且您的网络服务器将受到一些严重的负载,您将被迫扩展您的环境。 在没有microcaching的php-fpm下,Nginx是一样的(可能有更多的请求,但你的服务器会运行很多php-fpm进程来处理请求)。 使用微型缓存,您将获得高达300-450次的请求!

好的,给我吧!

Microcaching实际上很容易设置,下面是一个可以为使用PHP制作的任何网站运行的示例配置(在这种情况下,它是特定于Wordpress的)。 看一看:

#
# your website
#
server {
    listen       80;
    server_name  <your hostnames>;
    access_log  <your access log>  main;
    error_log <your error log>;
    root   <your root folder>;
    location / {
        index  index.php index.html index.htm;
    }
    if (!-e $request_filename) {
        rewrite ^(.+)$ /index.php?q=$1 last;
    }
    location ~ \.php$ {
        # Setup var defaults
        set $no_cache "";
        # If non GET/HEAD, don't cache & mark user as uncacheable for 1 second via cookie
        if ($request_method !~ ^(GET|HEAD)$) {
            set $no_cache "1";
        }
        # Drop no cache cookie if need be
        # (for some reason, add_header fails if included in prior if-block)
        if ($no_cache = "1") {
            add_header Set-Cookie "_mcnc=1; Max-Age=2; Path=/";
            add_header X-Microcachable "0";
        }
        # Bypass cache if no-cache cookie is set
        if ($http_cookie ~* "_mcnc") {
                    set $no_cache "1";
        }
        # Bypass cache if flag is set
        fastcgi_no_cache $no_cache;
        fastcgi_cache_bypass $no_cache;
        fastcgi_cache microcache;
        fastcgi_cache_key $server_name|$request_uri;
        fastcgi_cache_valid 404 30m;
        fastcgi_cache_valid 200 10s;
        fastcgi_max_temp_file_size 1M;
        fastcgi_cache_use_stale updating;
        fastcgi_pass localhost:9000;
        fastcgi_pass_header Set-Cookie;
        fastcgi_pass_header Cookie;
        fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_param  PATH_INFO          $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED    $document_root$fastcgi_path_info;
        #fastcgi_intercept_errors on;
        include fastcgi_params;
    }
}

您还应该在nginx.conf中放置缓存格式和缓存区域,将这些行添加到您的http {}块:

fastcgi_cache_path /var/cache/nginx2 levels=1:2 keys_zone=microcache:5m max_size=1000m;
log_format cache '$remote_addr - $remote_user [$time_local] "$request" '
'$status $upstream_cache_status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

尝试一下!

我鼓励大家自己尝试,看看表现有所改善! 我知道这是从Apache到Nginx(配置方式)的一个重大转变,但是你会很快得到它的挂起!

查看http://livebyt.es更多的文章即将推出!

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏