水平扩展Nginx和PHP-FPM

  1. 选择正确的PHP版本

    1). 选择最新的稳定版本

    2). 基准测试 PHP 5.3 vs PHP 5.4

        水平扩展Nginx和PHP-FPM_第1张图片

        

    水平扩展Nginx和PHP-FPM_第2张图片

    水平扩展Nginx和PHP-FPM_第3张图片

  2. Nginx 和 PHP-FPM

    使用Nginx、php-fpm 跟 Apache 、mod_php一样可靠,且能取得更好的性能。

    1). Nginx安装

    apt-get install nginx

    2). Nginx配置

    vi /etc/nginx/nginx.conf

    user www-data;
    worker_processes 4;
    pid /run/nginx.pid;
    
    events {
    	worker_connections 768;
    	# multi_accept on;
    }
    
    http {
    
    	##
    	# Basic Settings
    	##
    
    	sendfile on;
    	tcp_nopush on;
    	tcp_nodelay on;
    	keepalive_timeout 65;
    	types_hash_max_size 2048;
    	server_tokens off;
    
    	# server_names_hash_bucket_size 64;
    	# server_name_in_redirect off;
    
    	include /etc/nginx/mime.types;
    	default_type application/octet-stream;
    
    	##
    	# SSL Settings
    	##
    
    	ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    	ssl_prefer_server_ciphers on;
    
    	##
    	# Logging Settings
    	##
    
    	access_log /var/log/nginx/access.log;
    	error_log /var/log/nginx/error.log;
    
    	##
    	# Gzip Settings
    	##
    
    	gzip on;
    	gzip_disable "msie6";
    
    	# gzip_vary on;
    	# gzip_proxied any;
    	# gzip_comp_level 6;
    	# gzip_buffers 16 8k;
    	# gzip_http_version 1.1;
    	# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    
    	##
    	# Virtual Host Configs
    	##
    
    	include /etc/nginx/conf.d/*.conf;
    	include /etc/nginx/sites-enabled/*;
    }

    vi /etc/nginx/sites-available/my_app.conf

    upstream backend {
    	server unix:/u/apps/my_app/tmp/php.sock;
    }
    
    sever {
    	listen 80 default;
    	root /u/apps/my_app/www;
    	index index.php;
    	
    	access_log /u/apps/my_app/logs/access.log;
    	error_log /u/apps/my_app/logs/error.log;
    
    	location / {
    		try_files $url $url/ /index.php;
    	}
    
    	# This location block matches anything ending in .php and sends it to
    	# our PHP-FPM socket, defined in the upstream block above.
    	location ~ \.php$ {
    		try_files $uri =404;
    		fastcgi_pass backend;
    		fastcgi_index index.php;
    		fastcgi_param SCRIPT_FILENAME /u/apps/my_app/www$fastcgi_script_name;
    		include fastcgi_params;
    	}
    
    	# This location block is used to view PHP-FPM stats
    	location ~ ^/(php_status|php_ping)$ {
    		fastcgi_pass backend;
    		fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
    		include fastcgi_params;
    		allow 127.0.0.1;
    		deny all;
    	}
    
    	# This location block is used to view nginx stats
    	location /nginx_status {
    		stub_status on;
    		access_log off;
    		allow 127.0.0.1;
    		deny all;
    	}
    }

    try_files 指令解释:

    按指定的顺序检查文件是否存在,如果存在则返回。
    try_files $uri $uri/ /index.php?q=$uri&$args

    try_files $uri $uri/ @mongrel;

    location @mongrel {

       proxy_pass http://mongrel;

    }

    中 $uri/ 代表 $uri目录, 最后一个重定向可以指定执行的文件或是命名指针,如果非命名指针,$args参数会自动丢弃,除非手动指定。

    mkdir -p /u/apps/my_app/{logs,tmp,www}  #创建应用目录

        ln -s /etc/nginx/sites-available/my_app.conf /etc/nginx/sites-enabled/my_app.conf #建立软链接以便及时开启/关闭站点

        #重启nginx

        service nginx start

        3). php-fpm安装
         apt-get install php5-fpm

        4). php-fpm配置

        vi /etc/php5/fpm/pool.d/my_app.conf    

[my_app]
listen = /u/apps/my_app/tmp/php.sock
user = www-data
group = www-data
pm = dynamic
pm.max_children = 100
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 15
pm.max_requests = 1000
pm.status_path = /php_status

request_terminate_timeout = 0
request_slowlog_timeout = 0
slowlog = /u/apps/my_app/logs/slow.log

        #重启php-fpm

        service php5-fpm start

        5). 使用unix sockets 而不是 tcp sockets

            (1). 他们略快于TCP套接字,因为他们没有任何网络协议开销,可以避免网络阻塞。

            (2). TCP套接字受服务器端口范围影响,繁忙的服务器上处理TIME_WAIT状态的进程需要占用很多端口号。

        6). 状态查看

            (1). php-fpm状态查看 curl 127.0.0.1/php_status

            (2). nginx状态查看 curl 127.0.0.1/nginx_status

        7). php-fpm动态进程管理、配置

            每个php-fpm进程在同一时间只能处理一个请求。如果你需要并发50,那么至少需要50个php-fpm进程。如果进程数不够,请求将被放到队列中,直到有了空闲进程。

            pm.max_children: 在并发最多时可以开启的最大进程数。计划公式:pm.max_children = (MAX_MEMORY - 500MB) / 20MB

            pm.start_servers:初始时的进程数。推荐为pm.max_children的10%。

            pm.min_spare_servers:最小空闲进程数。当前总进程数 = 繁忙的进程数 + 最小空闲进程数。

            pm.max_spare_servers:最大空闲进程数。

            pm.max_requests:每个进程最大处理的请求数。由于长时间运行时可能导致内存泄露,达到最大值时进程将被回收。推荐:1000

         8). 硬件选择

            快速CPU,高内存。

            因为php是单线程运行了,所以你的CPU需要更多的内核。而每个php-fpm需要一个内核来处理,这样内核越多,cpu频率越高,处理越快。

         9). 缓存操作码

            

你可能感兴趣的:(水平扩展Nginx和PHP-FPM)