9月 20

nginx1.9 etag修改

  之前用nginx和第三方etag模块,配置如下。

FileETag on;
etag_format “%X%X”;

  nginx1.3.3后原生就支持etag,默认开启。通过学习进行如下修改。

  RFC2616(ftp://ftp.rfc-editor.org/in-notes/rfc2616.txt)对HTTP协议的规定,如果第一次请求资源正常,返回状态码200,第二次请求会在请求头里增加If-Modified-Since,如果If-Modified-Since是最后修改时间点,表示该资源没被修改,则http返回状态代码304,在相响应头中增加Last-Modified。这样该资源就不会被重复下载。nginx1.9.4配置修改如下。

location ~ .*\.(gif|jpg|jpeg|png|bmp|ico|rar|css|js|zip|xml|txt|flv|swf|mid|doc|cur|xls|pdf|txt|)$
{
etag on;
expires 1h;
}
此部分内容应该是与权限无关的资源部分。如果是使用安全链接,保证session安全,请求链接会有随机数或算法变化,每次的链接都不同。此部分还会消耗CPU,就达不到节约带宽的目的了。

3月 15

nginx+tomcat 使用https

操作系统上安装openssl。通过“nginx -V”查看是否有with-nginx-ssl模块安装。如果正常继续向下。
在ngixn的conf下执行以下命令生成证书。
#openssl genrsa -out www.simonzhang.net.key 1024
#openssl req -new -key www.simonzhang.net.key -out www.simonzhang.net.csr
执行完后会填写相关信息。我生成的密码为空,后面一路回车。
#openssl x509 -days 3650 -req -in www.simonzhang.net.csr -signkey www.simonzhang.net.key -out www.simonzhang.net.crt

nginx配置
之前的配置
server {
listen 80;
server_name www.simonzhang.net;
修改为
server {
listen 443;
server_name www.simonzhang.net;
ssl on;
ssl_certificate www.simonzhang.net.crt;
ssl_certificate_key www.simonzhang.net.key;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;

nginx测试后重新导入配置生效。

10月 16

用Nginx为uwsgi后端图片服务器做缓存服务

  很早处理的问题,现在拿出来做个记录。
  需求:后端图片服务处理各种格式、尺寸的图片。使用python处理,系统为Django+uwsgi(其实直接用tornado更好,也更方便)。前端需要做缓存,直接使用nginx。当前问题nginx和uwsgi连接后就不能使用cache服务了,nginx的proxy cache服务是在upstream的流转发过程中实现。所以要做个内部转发。nginx部分配置如下:

日志部分,添加缓存记录方将来统计击中率,参数为upstream_cache_status。
日志的中表示说明
MISS 未命中,请求被传送到后端
HIT 缓存命中
EXPIRED 缓存已经过期请求被传送到后端
UPDATING 正在更新缓存,将使用旧的应答
STALE 后端将得到过期的应答

log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” “$http_x_forwarded_for” “$request_time” ‘
‘”$upstream_cache_status”‘;

转发的主要部分

upstream  local_img {
   server localhost:81;
   }
server{
       listen       81;
       server_name 127.0.0.1;
       location / {
                uwsgi_pass   127.0.0.1:9000;
                client_max_body_size   10m;
                include       uwsgi_params;
                access_log  off;
                autoindex off;
                }
    }

server {
       listen       80;
       server_name imgtest.simonzhang.net ;
       location / {
                #proxy cache stat
                proxy_redirect          off;
                proxy_set_header        Host            $host;
                proxy_set_header        X-Real-IP       $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_connect_timeout   15;
                proxy_send_timeout      45;
                proxy_read_timeout      45;
                proxy_buffer_size       128k;
                proxy_buffers           4 128k;
                proxy_busy_buffers_size 128k;
                proxy_temp_file_write_size 128k;
                proxy_cache cache_one;
                # 成功浏览过的图片5天过期
                proxy_cache_valid 200 5d;
                proxy_cache_valid 404 304 1m;
                proxy_cache_key $host$uri$is_args$args;
                #add_header X-Cache $upstream_cache_status;
                proxy_pass http://local_img;
                #proxy cache end
                }
    }

  重启nginx服务后查看日志,日志中已经有了HIT的日志,日志显示使用处理耗时0.000ms。收工。

11月 26

php服务器CPU负载过高故障解决

  今天接到问题,服务器跑一段时间总是cpu使用量突然增大,然后就不能连接了。突然增大情况无规律。通过查看平时服务器运行正常,CPU、内存和IO用量都不高,日志报警大致信息如下:
[WARNING] fpm_stdio_child_said(), line 167: child 30951 (pool default) said into stderr:….. [ERROR] fpm_unix_init_child(), line 168:

setrlimit(RLIMIT_NOFILE) failed: Invalid argument (22)”

  通过安装和初步处理人员沟通了解到。现在已经按照日志在网上搜索,按照网上的解决方案进行处理。处理如下

1、提升服务器的文件句柄打开打开
/etc/security/limits.conf : (增加)
* soft nofile 51200
* hard nofile 51200
# vi /etc/security/limits.conf 加上
* soft nofile 51200
* hard nofile 51200
2、提升nginx的进程文件打开数
nginx.conf : worker_rlimit_nofile 51200;
3、修改php-fpm.conf文件,主要需要修改2处。
命令 ulimit -n 查看限制的打开文件数,php-fpm.conf 中的选项rlimit_files 确保和此数值一致。
10240
51200
4、
# vi /etc/sysctl.conf
底部添加
fs.file-max=51200

  “max_requests”为什么是10240,不知道所以然。

  因为其他资源已经占满,或者存在内存泄露等问题,再大量请求时,系统单个任务压力过大导致服务器不稳定。所以经将配置改为“1024”减少最大值重启数量。

  优化并不是单纯的将参数调大,如果这样能解决,那发布版本时直接都改为最大就好了。也不能按照网上的解决方案照搬方法。所以在解决过程中,要参考学习,也要搞清原理,按照当前环境适当调整。通过调整,服务器已经稳定运行3个月,没有再次出现问题。

11月 09

用nginx的cache 对本地静态文件做缓存

需要对静态文件做缓存,但是静态文件也是在本地,由同一个nginx来解析。
使用if不能嵌套,所以只能使用本地的IP跳转一下,我的cache使用的nginx命名cache_one配置如下。如果本地跳转有问题可以再hosts表中修改一下指向。

   #######################pic
   upstream  local_img {
            server localhost:81;
       }
    server{
        listen       81;
        server_name 127.0.0.1;
        location / {
                root /image/;
                client_max_body_size   10m;
                access_log off;
                autoindex off;
                }
    }
   server {
        listen       80;
        server_name img.test.com;
        proxy_cache cache_one;
        location / {
                proxy_redirect off;
                proxy_cache_valid 200 304 12h;
                proxy_cache_valid 301 302 1m;
                proxy_cache_key $host$uri$is_args$args;
                add_header X-Cache $upstream_cache_status;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $remote_addr;
                proxy_pass http://local_img;
                access_log off;
                }
    }