VPS 优化攻略(二): Nginx、MySQL 和 PHP-FPM 优化

/

VPS 优化攻略(二): Nginx、MySQL 和 PHP-FPM 优化

前面提及了 VPS 优化最基础的部分 - 选择合适的 Linux 发行版,在安装好系统后,接下来就要部署 web 服务环境了,选择什么 web 服务器软件是 VPS 最好的选择呢?我建议 NginxLighttpd,两者都是轻量级的 web 服务器软件,和 Apache 相比占用资源更少,但是并发性能更好。这里以 Nginx 为例。

安装 Nginx + PHP + MySQL

1、编辑 sources.list,添加源

vi /etc/apt/sources.list
##  以 Debian Wheezy 为例
deb http://ftp.us.debian.org/debian/ wheezy main
deb-src http://ftp.us.debian.org/debian/ wheezy main

deb http://security.debian.org/ wheezy/updates main
deb-src http://security.debian.org/ wheezy/updates main

deb http://ftp.us.debian.org/debian/ wheezy-updates main
deb-src http://ftp.us.debian.org/debian/ wheezy-updates main

deb http://packages.dotdeb.org wheezy all
deb-src http://packages.dotdeb.org wheezy all

2、下载并导入证书

curl -O http://www.dotdeb.org/dotdeb.gpg
cat dotdeb.gpg | sudo apt-key add -

3、同步 package 索引清单

apt-get update

4、安装 Nginx + PHP + MySQL

Nginx 下 PHP 的运行模式为 FastCGI,PHP-FPM 全称为 PHP FastCGI Process Manager,意为 PHP 进程管理器,相比 PHP 自带的进程管理,提供了很多优秀的特性,比如平滑启动。

apt-get install mysql-server mysql-client php5-cgi php5-cli php5-curl php5-mcrypt php5-gd php5-mysql php5-fpm nginx

MySQL 优化

vi /etc/mysql/my.cnf
[mysqld]
##  针对小站点优化
key_buffer_size = 4M
max_allowed_packet = 1M
table_open_cache = 32
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 64K

##  启用 query 缓存
query_cache_type = 1
query_cache_limit = 256K
query_cache_size = 4M

##  MySQL 5.5默认的存储引擎为 innodb,虽然性能得到了提升,但是耗费内存也增大了不少
##  一般的站点采用 MyISAM 足矣
default-storage-engine = MyISAM
skip-innodb

如果您的站点很多页面的 query 操作的结果在一段时间都是固定的,那么启用 query 缓存可以很大程度上改善性能。

参考:Tuning Server Parameters

Nginx 优化

1、编辑 Nginx 全局设置文件

vi /etc/nginx/nginx.conf
worker_processes auto;
worker_rlimit_nofile 8192;
events {
        worker_connections 800;
        multi_accept on;
        use epoll;
}
http {
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;

        client_body_timeout   20;
        client_header_timeout 20;
        keepalive_timeout 20;
        send_timeout          20;
        reset_timedout_connection on;
        types_hash_max_size 2048;

        server_tokens off;
        client_max_body_size 20m;
        server_names_hash_bucket_size 128;

        open_file_cache max=1000 inactive=20s;
        open_file_cache_valid    30s;
        open_file_cache_min_uses 2;
        open_file_cache_errors   on;

        ## 开启 Gzip 压缩
        gzip on;
        gzip_disable "MSIE [1-6]\.";
        gzip_vary on;
        gzip_min_length  1100;
        gzip_proxied     expired no-cache no-store private auth;
        gzip_comp_level 6;
        gzip_buffers 4 32k;
        gzip_http_version 1.1;
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml application/x-font-ttf font/opentype;
}

2、编辑站点设置文件

vi /etc/nginx/sites-available/jmlog
server {
        server_name jmlog.com;
        ## 重定向 jmlog.com 到 www.jmlog.com
        return 301 $scheme://www.jmlog.com$request_uri;
}

server {
        server_name www.jmlog.com;
        root /var/www/jmlog.com;
        index index.php;

        location = /favicon.ico {
                log_not_found off;
                access_log off;
        }

        location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
        }

        location ~ /\. {
                deny all;
                access_log off;
                log_not_found off;
        }

        location / {
                try_files $uri $uri/ /index.php;
        }

        location ~ \.php$ {
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }

        location ~* \.(png|jpg|jpeg|gif|ico)$ {
		## 设置图片的过期时间为30天
                expires 30d;
                access_log  off;
                log_not_found off;
        }

        location ~* \.(css|js)(\?ver=.*)?$ {
		## 设置 css、js 的过期时间为6小时
                expires 6h;
                log_not_found off;
        }
}

3、建立软链接,使站点设置文件生效

ln -s /etc/nginx/sites-available/jmlog /etc/nginx/sites-enable/jmlog

PHP-FPM 优化

下列参数针对 512M vps 设定,一个 PHP5-FPM 进程占用内存约为20-35M,除去系统必须的内存占用,最大子进程数目可以自己计算。

vi /etc/php5/fpm/pool.d/www.conf
listen = /var/run/php5-fpm.sock
pm = dynamic
;最大子进程数目
pm.max_children = 12
;初始创建的子进程数目
pm.start_servers = 5
;闲置的最小子进程数目
pm.min_spare_servers = 3
;闲置的最大子进程数目
pm.max_spare_servers = 7

Comments