Nginx 性能优化
proxy缓存的使用
缓存配置
缓存也就是将js、css、image等静态文件从tomcat缓存到nginx指定的缓存目录下,
既可以减轻tomcat负担,也可以加快访问速度,但这样缓存及时清理成为了一个问题,
所以需要ngx_cache_purge
这个模块来在过期时间未到之前,手动清理缓存。
http { ... // $upstream_cache_status记录缓存命中率 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"' '"$upstream_cache_status"'; proxy_temp_path /usr/local/nginx-1.6/proxy_temp; proxy_cache_path /usr/local/nginx-1.6/proxy_cache levels=1:2 keys_zone=cache_one:100m inactive=2d max_size=2g; server { listen 80; server_name ittest.example.com; root html; index index.html index.htm index.jsp; location ~ .*\.(gif|jpg|png|html|css|js|ico|swf|pdf)(.*) { proxy_pass http://backend; 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_cache cache_one; add_header Nginx-Cache $upstream_cache_status; proxy_cache_valid 200 304 301 302 8h; proxy_cache_valid 404 1m; proxy_cache_valid any 2d; proxy_cache_key $host$uri$is_args$args; expires 30d; } location ~ /purge(/.*) { #设置只允许指定的IP或IP段才可以清除URL缓存。 allow 127.0.0.1; allow 172.29.73.0/24; deny all; proxy_cache_purge cache_one $host$1$is_args$args; error_page 405 =200 /purge$1; } } }
-
proxy_temp_path
: 缓存临时目录。后端的响应并不直接返回客户端, 而是先写到一个临时文件中,然后被rename一下当做缓存放在proxy_cache_path
。 0.8.9版本以后允许temp和cache两个目录在不同文件系统上(分区), 然而为了减少性能损失还是建议把它们设成一个文件系统上。 -
proxy_cache_path ...
: 设置缓存目录,目录里的文件名是cache_key
的MD5值。 -
levels=1:2 keys_zone=cache_one:50m
:表示采用2级目录结构, Web缓存区名称为cache_one
,内存缓存空间大小为100MB,这个缓冲zone可以被多次使用。 文件系统上看到的缓存文件名类似于:/usr/local/nginx-1.6/proxy_cache/c/29/b7f54b2df7773722d382f4809d65029c
。 -
inactive=2d max_size=2g
:表示2天没有被访问的内容自动清除,硬盘最大缓存空间为2GB, 超过这个大学将清除最近最少使用的数据。 -
proxy_cache
:引用前面定义的缓存区cache_one
-
proxy_cache_key
:定义cache_key
-
proxy_cache_valid
:为不同的响应状态码设置不同的缓存时间, 比如200、302等正常结果可以缓存的时间长点,而404、500等缓存时间设置短一些, 这个时间到了文件就会过期,而不论是否刚被访问过。 -
expires
:在响应头里设置Expires:
或Cache-Control:max-age
, 返回给客户端的浏览器缓存失效时间。
于缓存的失效期限上面有三个选项:X-Accel-Expires
、inactive
、proxy_cache_valid
、
expires
,它们之间是有优先级的,按上面的顺序如果在header里设置
X-Accel-Expires
则它的优先级最高,否则inactive
优先级最高。
更多资料请参考:http://www.ttlsa.com/nginx/nginx-cache-priority/
清除缓存
上述配置的proxy_cache_purge
指令用于方便的清除缓存,
但必须按照第三方的ngx_cache_purge
模块才能使用,项目地址:
https://github.com/FRiCKLE/ngx_cache_purge/ 。
使用ngx_cache_purge
模块清除缓存有2种办法(直接删除缓存目录下的文件也算一种办法):
echo发送PURGE指令
proxy_cache_purge PURGE from 127.0.0.1
表示只允许在来自本地的清除指令:
$ echo -e 'PURGE / HTTP/1.0\r\n' | nc 127.0.0.1 80
GET方式请求URL
即使用配置文件中的location ~ /purge(/.*)
,
浏览器访问http://ittest.example.com/purge/your/may/path
来清除缓存,或者:
echo -e 'GET /purge/ HTTP/1.0\r\n' | nc ittest.example.com 80
低配置VPS上的性能优化
增加系统swap文件
有的VPS不提供swap分区,只能用swap文件。
把/var/swapfile
作为交换文件:
cd /var dd if=/dev/zero of=swapfile bs=1024 count=262144 /sbin/mkswap swapfile /sbin/swapon swapfile
fstab里增加:
/var/swapfile swap swap defaults 0 0
优化nginx.conf
user www www; #Nginx每个进程需要10M到20M内存,为了节约内存这里只开一个 worker_processes 1; error_log /data1/logs/nginx_error.log crit; pid /usr/local/webserver/nginx/nginx.pid; #Specifies the value for maximum file descriptors that can be opened by this process. worker_rlimit_nofile 51200; events { use epoll; worker_connections 51200; } http { include mime.types; default_type application/octet-stream; #charset gb2312; server_names_hash_bucket_size 128; client_header_buffer_size 32k; large_client_header_buffers 4 32k; sendfile on; tcp_nopush on; keepalive_timeout 60; tcp_nodelay on; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; # 网页与css js xml 等启动gzip gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on; server { listen 80; server_name www.yourdomain.com; index index.html index.htm index.php; root /data0/htdocs/blog; location ~ .*\.(php|php5)?$ { # 用Unix Socket代替TCP,虽然这样高并发下不稳定,但速度更快 fastcgi_pass unix:/tmp/php-cgi.sock; #fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fcgi.conf; } # 图片本地缓存15天 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 15d; } # js css 本地缓存1天 location ~ .*\.(js|css)?$ { expires 1d; } log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for'; access_log /data1/logs/access.log access; } }
MySQL配置优化
InnoDB消耗资源太大,配置低的话换MyISAM。
配置文件优化:
[client] port = 3306 socket = /tmp/mysql.sock [mysqld] user = mysql port = 3306 socket = /tmp/mysql.sock basedir = /usr/local/webserver/mysql datadir = /usr/local/webserver/mysql/data open_files_limit = 600 back_log = 20 max_connections = 100 max_connect_errors = 200 table_cache = 60 external-locking = FALSE max_allowed_packet = 16M sort_buffer_size = 128K join_buffer_size = 128K thread_cache_size = 10 thread_concurrency = 8 query_cache_size = 0M query_cache_limit = 2M query_cache_min_res_unit = 2k default_table_type = MyISAM thread_stack = 192K transaction_isolation = READ-UNCOMMITTED tmp_table_size = 512K max_heap_table_size = 32M /usr/local/webserver/mysql/data/slow.log /usr/local/webserver/mysql/data/error.log long_query_time = 1 log_long_format server-id = 1 #log-bin = /usr/local/mysql/data/binlog binlog_cache_size = 2M max_binlog_cache_size = 4M max_binlog_size = 512M expire_logs_days = 7 key_buffer_size = 4M read_buffer_size = 1M read_rnd_buffer_size = 2M bulk_insert_buffer_size = 2M myisam_sort_buffer_size = 4M myisam_max_sort_file_size = 10G myisam_max_extra_sort_file_size = 10G myisam_repair_threads = 1 myisam_recover [mysqldump] quick max_allowed_packet = 16M