zoukankan      html  css  js  c++  java
  • nginx 3.nginx+fastcgi

    死磕nginx 3.nginx+fastcgi

    互联网服务器有个非常典型的架构lamp(linux+apache+mysql+php),由于其开源和强大的兼容性而风靡一时,不过随着nginx的横空出世,lamp逐渐被lnmp替代,即Linux+nginx+mysql+php

    fastcgi:fastcgi是语言无关的,可伸缩架构的CGI开放扩展,其主要的行为将CGI解释器进程保持在内存中并因此获得较高的性能,众所周知,CGI的反复加载时CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程金鼎管理调度,则可提供良好的性能、伸缩性、Fail-Over特性等。


    1、FastCGI的工作原理

    1. FastCGI进程管理器自身初始化,启动多个CGI解释器进程(多个php-cgi进程)并等待来自webserver的请求,在本文中,采用PHP-FPM进程管理器启动多个php-cgi FastCGI进程,启动php-cgi FastCGI进程时,可以配置TCP和UNIX套接字两种方式启动
    2. 当客户端请求到达web服务器(nginx)时,web服务器将采用TCP协议或者UNIX套接字方式转到FastCGI主进程,FastCGI主进程选择并连接到一个CGI解释器(子进程),web服务器将CGI环境变量和标准输入发送到FastCGI子进程php-cgi
    3. FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回到web服务器(nginx),当FastCGI子进程关闭连接时,请求便告知处理完成,。FastCGI子进程接着等待来自FastCGI管理器的下一个连接,而在一般普通的CGI模式中,php-cgi在此时便退出了。

    所以你可以想象普通的CGI模式有多慢,每一个web请求PHP都必须重新解析php.ini、重新载入全部扩展并重新初始化全部数据结构。使用FastCGI,所有的这些都只在进程启动时发生一次,一个额外的好处是,持续数据库连接可以工作。

    php FastCGI的优点

    • PHP脚本运行速度更快,PHP解释程序被载入内存而不用每次都需要从存储器中读取,此举极大提升了依靠脚本运行站点的性能。
    • 需要使用的系统资源更少,由于服务器不用每次都需要载入PHP解释程序,你可以将站点传输速度提升而不必增加CPU负担。
    • 不需要对现有代码进行任何改变

    部署lnmp环境示例

    组件版本

    linux:centos6.5

    php:5.5

    nginx:1.8

    mysql:5.5.18

    nginx的安装

    可以参考nginx的第一篇文章

    mysql的安装

    1、依赖
    yum -y install cmake gcc-c++ make bison-devel ncurses-devel
    增加用户
    useradd mysql
    2、解压安装 安装包自行下载
    tar -zxf mysql-5.5.18.tar.gz
    cd mysql-5.5.18
    cmake 
    -DCMAKE_INSTALL_PREFIX=/home/nick/mysql 
    -DMYSQL_UNIX_ADDR=/home/nick/mysql/mysql.sock 
    -DDEFAULT_CHARSET=utf8 
    -DDEFAULT_COLLATION=utf8_general_ci 
    -DWITH_EXTRA_CHARSETS:STRING=utf8,gbk 
    -DWITH_MYISAM_STORAGE_ENGINE=1 
    -DWITH_INNOBASE_STORAGE_ENGINE=1 
    -DWITH_READLINE=1 
    -DENABLED_LOCAL_INFILE=1 
    -DMYSQL_DATADIR=/home/nick/mysql/data
    make && make install
    
    cd /home/nick/mysql && mkdir etc tmp var log
    
    3、重命名系统自带的my.cnf
    mv /etc/my.cnf /etc/my.cnf.bak
    
    4、配置文件 复制到/home/nick/mysql/etc/my.cnf里面
    
    [client]
    port = 3306
    socket = /home/nick/mysql/mysql.sock
    default-character-set = utf8mb4
    
    [mysqld]
    port = 3306
    socket = /home/nick/mysql/mysql.sock
    
    basedir = /home/nick/mysql
    datadir = /home/nick/mysql/data
    pid-file = /home/nick/mysql/log/mysql.pid
    user = mysql
    bind-address = 0.0.0.0
    server-id = 1
    
    init-connect = 'SET NAMES utf8mb4'
    character-set-server = utf8mb4
    
    #skip-name-resolve
    #skip-networking
    back_log = 300
    
    max_connections = 100
    max_connect_errors = 6000
    open_files_limit = 65535
    table_open_cache = 128
    max_allowed_packet = 1M
    binlog_cache_size = 1M
    max_heap_table_size = 2M
    tmp_table_size = 4M
    
    read_buffer_size = 1M
    read_rnd_buffer_size = 2M
    sort_buffer_size = 2M
    join_buffer_size = 2M
    key_buffer_size = 1M
    
    thread_cache_size = 8
    
    query_cache_type = 1
    query_cache_size = 2M
    query_cache_limit = 1M
    
    ft_min_word_len = 4
    
    log_bin = mysql-bin
    binlog_format = mixed
    expire_logs_days = 30
    
    log_error = /home/nick/mysql/log/mysql-error.log
    slow_query_log = 1
    long_query_time = 1
    slow_query_log_file = /home/nick/mysql/log/mysql-slow.log
    
    performance_schema = 0
    explicit_defaults_for_timestamp
    
    #lower_case_table_names = 1
    
    skip-external-locking
    
    default_storage_engine = InnoDB
    #default-storage-engine = MyISAM
    innodb_file_per_table = 1
    innodb_open_files = 500
    innodb_buffer_pool_size = 16M
    innodb_write_io_threads = 4
    innodb_read_io_threads = 4
    innodb_thread_concurrency = 0
    innodb_purge_threads = 1
    innodb_flush_log_at_trx_commit = 2
    innodb_log_buffer_size = 1M
    innodb_log_file_size = 8M
    innodb_log_files_in_group = 3
    innodb_max_dirty_pages_pct = 90
    innodb_lock_wait_timeout = 120
    
    bulk_insert_buffer_size = 8M
    myisam_sort_buffer_size = 8M
    myisam_max_sort_file_size = 1G
    myisam_repair_threads = 1
    
    interactive_timeout = 28800
    wait_timeout = 28800
    
    [mysqldump]
    quick
    max_allowed_packet = 8M
    
    5、初始化数据库
    /home/nick/mysql/scripts/mysql_install_db
    
    6、启动数据库
    home/qfpay/mysql/bin/mysqld_safe &
    
    7、supervisr的启动方式
    [program:mysql]
    command= /home/nick/mysql/bin/mysqld --defaults-file=/home/nick/mysql/etc/my.cnf
    directory=/home/nick/mysql
    user=nick
    

    PHP的安装

     下载程序
     wget wget http://cn2.php.net/get/php-5.5.33.tar.gz
     先装第三方源
     yum install epel-release 
     安装依赖
     yum install -y gd gd-devel  libmcrypt libmcrypt-devel libtool-ltdl libtool-ltdl-devel libxml2 libxml2-devel curl curl-devel t1lib t1lib-devel openssl openssl-devel
     解压安装
     /configure  
     --disable-debug 
     --prefix=/usr/local/php5.5 
     --enable-shmop 
     --with-gd 
     --with-jpeg-dir 
     --with-png-dir 
     --with-libxml-dir 
     --with-t1lib 
     --with-zlib 
     --with-mcrypt  
     --with-mysqli=mysqlnd 
     --with-mysql=mysqlnd 
     --with-pdo-mysql=mysqlnd 
     --enable-sockets 
     --with-iconv 
     --enable-mbstring 
     --enable-mbregex 
     --enable-ftp 
     --enable-gd-native-ttf 
     --with-curl 
     --enable-fpm 
     --enable-pcntl 
     --enable-sysvmsg 
     --enable-sysvsem 
     --enable-sysvshm 
     --enable-zip 
     --with-freetype-dir 
     --enable-exif 
     --with-openssl 
     --with-pear 
     
     make && make install 
     
     拷贝php.ini:
     cp php.ini-development /usr/local/php/lib/php.ini
     
     #php-fpm 的简单配置
     
     ;this configuration is for PHP 5.5 for heavy loaded servers
    
    [global]
    error_log = syslog
    log_level = error
    rlimit_files = 655360
    rlimit_core = 0
    
    [php-nick219]
    user = nobody
    group = nobody
    #使用tcp
    listen = 127.0.0.1:9000
    #使用sock
    #listen = fpm.sock
    #listen.allowed_clients = 127.0.0.1
    #listen.mode = 666
    
    pm = dynamic
    pm.max_children = 1000
    pm.start_servers = 20                ;20
    pm.min_spare_servers = 10        ;10
    pm.max_spare_servers = 30        ;30
    pm.max_requests = 500
    ; system max load (request number) = max_children * max_requests = 500,000
    
    pm.status_path = /fpm_status
    ping.path = /status
    ping.response = ok
    
    slowlog = /data/phplogs/phpfpm_slow.log
    request_slowlog_timeout = 3s
    listen.backlog = 4096
    
    request_terminate_timeout = 5m
    
    rlimit_files = 655360
    rlimit_core = 0
    
    security.limit_extensions = .php .html
    
    php_admin_value['date.timezone'] = 'Asia/Shanghai'
    
    ;include rigger ENV files
    include=env.conf
    
    ;add conf overrides from yaml
    

    nginx配置

    一个简单的配置,直接从server[...]开始
    
    server
    {
        listen 80;
        server_name nick219.com;
        index index.html index.htm index.php;
        root /home/nick/www/nick219;
        
        location ~ .*.(php|php5)?$
        {
            #fastcgi_pass unix:/tmp/php-cgi.sock;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php
            fastcgi_intercept_errors on;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi.conf
        }  
        #下面可以配置日志,缓存或者其它位置    
    }
    

    nginx+fastcgi的配置结束

  • 相关阅读:
    CKA&CKAD考试
    进程线程和协程
    HTTP协议
    Centos操作系统启动流程
    高并发下的Linux内核参数优化
    DDoS防护系统建设的一些思路
    DDoS防护实现概述
    Nginx故障排查思路
    git常用指令集
    DNS实现粗粒度容灾
  • 原文地址:https://www.cnblogs.com/colder219/p/5605468.html
Copyright © 2011-2022 走看看