死磕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. 1、依赖
  2. yum -y install cmake gcc-c++ make bison-devel ncurses-devel
  3. 增加用户
  4. useradd mysql
  5. 2、解压安装 安装包自行下载
  6. tar -zxf mysql-5.5.18.tar.gz
  7. cd mysql-5.5.18
  8. cmake \
  9. -DCMAKE_INSTALL_PREFIX=/home/nick/mysql \
  10. -DMYSQL_UNIX_ADDR=/home/nick/mysql/mysql.sock \
  11. -DDEFAULT_CHARSET=utf8 \
  12. -DDEFAULT_COLLATION=utf8_general_ci \
  13. -DWITH_EXTRA_CHARSETS:STRING=utf8,gbk \
  14. -DWITH_MYISAM_STORAGE_ENGINE=1 \
  15. -DWITH_INNOBASE_STORAGE_ENGINE=1 \
  16. -DWITH_READLINE=1 \
  17. -DENABLED_LOCAL_INFILE=1 \
  18. -DMYSQL_DATADIR=/home/nick/mysql/data
  19. make && make install
  20. cd /home/nick/mysql && mkdir etc tmp var log
  21. 3、重命名系统自带的my.cnf
  22. mv /etc/my.cnf /etc/my.cnf.bak
  23. 4、配置文件 复制到/home/nick/mysql/etc/my.cnf里面
  24. [client]
  25. port = 3306
  26. socket = /home/nick/mysql/mysql.sock
  27. default-character-set = utf8mb4
  28. [mysqld]
  29. port = 3306
  30. socket = /home/nick/mysql/mysql.sock
  31. basedir = /home/nick/mysql
  32. datadir = /home/nick/mysql/data
  33. pid-file = /home/nick/mysql/log/mysql.pid
  34. user = mysql
  35. bind-address = 0.0.0.0
  36. server-id = 1
  37. init-connect = 'SET NAMES utf8mb4'
  38. character-set-server = utf8mb4
  39. #skip-name-resolve
  40. #skip-networking
  41. back_log = 300
  42. max_connections = 100
  43. max_connect_errors = 6000
  44. open_files_limit = 65535
  45. table_open_cache = 128
  46. max_allowed_packet = 1M
  47. binlog_cache_size = 1M
  48. max_heap_table_size = 2M
  49. tmp_table_size = 4M
  50. read_buffer_size = 1M
  51. read_rnd_buffer_size = 2M
  52. sort_buffer_size = 2M
  53. join_buffer_size = 2M
  54. key_buffer_size = 1M
  55. thread_cache_size = 8
  56. query_cache_type = 1
  57. query_cache_size = 2M
  58. query_cache_limit = 1M
  59. ft_min_word_len = 4
  60. log_bin = mysql-bin
  61. binlog_format = mixed
  62. expire_logs_days = 30
  63. log_error = /home/nick/mysql/log/mysql-error.log
  64. slow_query_log = 1
  65. long_query_time = 1
  66. slow_query_log_file = /home/nick/mysql/log/mysql-slow.log
  67. performance_schema = 0
  68. explicit_defaults_for_timestamp
  69. #lower_case_table_names = 1
  70. skip-external-locking
  71. default_storage_engine = InnoDB
  72. #default-storage-engine = MyISAM
  73. innodb_file_per_table = 1
  74. innodb_open_files = 500
  75. innodb_buffer_pool_size = 16M
  76. innodb_write_io_threads = 4
  77. innodb_read_io_threads = 4
  78. innodb_thread_concurrency = 0
  79. innodb_purge_threads = 1
  80. innodb_flush_log_at_trx_commit = 2
  81. innodb_log_buffer_size = 1M
  82. innodb_log_file_size = 8M
  83. innodb_log_files_in_group = 3
  84. innodb_max_dirty_pages_pct = 90
  85. innodb_lock_wait_timeout = 120
  86. bulk_insert_buffer_size = 8M
  87. myisam_sort_buffer_size = 8M
  88. myisam_max_sort_file_size = 1G
  89. myisam_repair_threads = 1
  90. interactive_timeout = 28800
  91. wait_timeout = 28800
  92. [mysqldump]
  93. quick
  94. max_allowed_packet = 8M
  95. 5、初始化数据库
  96. /home/nick/mysql/scripts/mysql_install_db
  97. 6、启动数据库
  98. home/qfpay/mysql/bin/mysqld_safe &
  99. 7supervisr的启动方式
  100. [program:mysql]
  101. command= /home/nick/mysql/bin/mysqld --defaults-file=/home/nick/mysql/etc/my.cnf
  102. directory=/home/nick/mysql
  103. user=nick

PHP的安装

  1. 下载程序
  2. wget wget http://cn2.php.net/get/php-5.5.33.tar.gz
  3. 先装第三方源
  4. yum install epel-release
  5. 安装依赖
  6. 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
  7. 解压安装
  8. /configure \
  9. --disable-debug \
  10. --prefix=/usr/local/php5.5 \
  11. --enable-shmop \
  12. --with-gd \
  13. --with-jpeg-dir \
  14. --with-png-dir \
  15. --with-libxml-dir \
  16. --with-t1lib \
  17. --with-zlib \
  18. --with-mcrypt \
  19. --with-mysqli=mysqlnd \
  20. --with-mysql=mysqlnd \
  21. --with-pdo-mysql=mysqlnd \
  22. --enable-sockets \
  23. --with-iconv \
  24. --enable-mbstring \
  25. --enable-mbregex \
  26. --enable-ftp \
  27. --enable-gd-native-ttf \
  28. --with-curl \
  29. --enable-fpm \
  30. --enable-pcntl \
  31. --enable-sysvmsg \
  32. --enable-sysvsem \
  33. --enable-sysvshm \
  34. --enable-zip \
  35. --with-freetype-dir \
  36. --enable-exif \
  37. --with-openssl \
  38. --with-pear \
  39. make && make install
  40. 拷贝php.ini:
  41. cp php.ini-development /usr/local/php/lib/php.ini
  42. #php-fpm 的简单配置
  43. ;this configuration is for PHP 5.5 for heavy loaded servers
  44. [global]
  45. error_log = syslog
  46. log_level = error
  47. rlimit_files = 655360
  48. rlimit_core = 0
  49. [php-nick219]
  50. user = nobody
  51. group = nobody
  52. #使用tcp
  53. listen = 127.0.0.1:9000
  54. #使用sock
  55. #listen = fpm.sock
  56. #listen.allowed_clients = 127.0.0.1
  57. #listen.mode = 666
  58. pm = dynamic
  59. pm.max_children = 1000
  60. pm.start_servers = 20 ;20
  61. pm.min_spare_servers = 10 ;10
  62. pm.max_spare_servers = 30 ;30
  63. pm.max_requests = 500
  64. ; system max load (request number) = max_children * max_requests = 500,000
  65. pm.status_path = /fpm_status
  66. ping.path = /status
  67. ping.response = ok
  68. slowlog = /data/phplogs/phpfpm_slow.log
  69. request_slowlog_timeout = 3s
  70. listen.backlog = 4096
  71. request_terminate_timeout = 5m
  72. rlimit_files = 655360
  73. rlimit_core = 0
  74. security.limit_extensions = .php .html
  75. php_admin_value['date.timezone'] = 'Asia/Shanghai'
  76. ;include rigger ENV files
  77. include=env.conf
  78. ;add conf overrides from yaml

nginx配置

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

nginx+fastcgi的配置结束

nginx 3.nginx+fastcgi的更多相关文章

  1. nginx下面部署fast-cgi和C++【原】

    1.cgi文件的代码 #include "fcgi_stdio.h" #include <stdlib.h> #include <stdio.h> int ...

  2. nginx上用fastcgi配置python环境

    费了2天的功夫,翻阅了无数的中文.英文资料,终于搞定.写下此文留待以后翻阅用      本文环境,centOS 5.4 ,Nignx-0.8.49, Python 2.6.5   ========== ...

  3. linux后台server开发环境的部署配置和验证(nginx+apache+php-fpm+FASTCGI(C/C++))

    linux后台server开发环境部署配置 引言 背景 随着互联网业务的不断增多.开发环境变得越来越复杂,为了便于统一server端的开发部署环境,特制定本配置文档. 使用软件 CentOS 6.3( ...

  4. Nginx使用教程(六):使用Nginx缓存之FastCGI缓存

    启用FastCGI缓存 <br\>编辑必须启用缓存的虚拟主机配置文件. nano /etc/nginx/sites-enabled/vhost 将以下行添加到server{}指令之外的文件 ...

  5. Nginx配置文件nginx.conf中文详解(转)

    ######Nginx配置文件nginx.conf中文详解##### #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_ ...

  6. Nginx research, nginx module development

    catalog . 初探nginx架构 . handler模块 . Nginx编译.安装.配置 . Hello World模块开发 1. 初探nginx架构 nginx在启动后,在unix系统中会以d ...

  7. Nginx配置文件nginx.conf中文详解【转】

    PS:Nginx使用有两三年了,现在经常碰到有新用户问一些很基本的问题,我也没时间一一回答,今天下午花了点时间,结合自己的使用经验,把Nginx的主要配置参数说明分享一下,也参考了一些网络的内容,这篇 ...

  8. linux下Nginx配置文件(nginx.conf)配置设置详解(windows用phpstudy集成)

    linux备份nginx.conf文件举例: cp /usr/local/nginx/nginx.conf /usr/local/nginx/nginx.conf-20171111(日期) 在进程列表 ...

  9. 【nginx】nginx配置文件结构,内置变量及参数调优

    Nginx的配置文件是一个纯文本文件,它一般位于Nginx安装目录的conf目录下,整个配置文件是以block的形式组织的.每个block一般以一个大括号“{”来表示.block 可以分为几个层次,整 ...

随机推荐

  1. C++ Primer 5th 第11章 关联容器

    练习11.1:描述map 和 vector 的不同. map是关联容器,vector是顺序容器,关联容器与值无关,vector则与值密切相关 练习11.2:分别给出最适合使用 list.vector. ...

  2. underscorejs-groupBy学习

    2.18 groupBy 2.18.1 语法 _.groupBy(list, iteratee, [context]) 2.18.2 说明 把list分为多个集合,iterator为分组的依据,返回值 ...

  3. Thinkphp 验证码、文件上传

    一.验证码 验证码参数 例题:登录时验证下验证码 LoginController.class.php <?php namespace Home\Controller; use Think\Con ...

  4. Python按行读取文件

    1:readline() file = open("sample.txt") while 1: line = file.readline() if not line: break ...

  5. git的使用说明详解

    http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375840202368c7 ...

  6. 转:使用XHProf优化PHP程序

    原文来自于:http://blog.sina.com.cn/s/blog_665fc8980100l8dq.html XHProf 是 FaceBook 开发的一个函数级别的 PHP 分层分析器. 数 ...

  7. 【HDOJ】1619 Unidirectional TSP

    题目本身一点儿都不难,但是就是被字典序搞死了.写的挺麻烦,但是过了,逆向做好做一点儿. /* 1619 */ #include <cstdio> #include <cstring& ...

  8. 【HDOJ】 七百题留念

  9. BZOJ 1034 [ZJOI2008]泡泡堂BNB

    1034: [ZJOI2008]泡泡堂BNB Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1757  Solved: 928[Submit][Sta ...

  10. HDOJ 1017 A Mathematical Curiosity

    Problem Description Given two integers n and m, count the number of pairs of integers (a,b) such tha ...