FastCGI与PHP

时间:2024-08-22 12:06:20

什么是CGI

CGI全称"通用网关接口"(Common Gateway Interface),用于HTTP服务器与其它机器上的程序服务通信交流的一种工具,CGI程序须运行在网络服务器上。

传统CGI接口方式的主要缺点是性能较差,因为每次HTTP服务器遇到动态程序时都需要重启解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发访问几乎是不可用的,因此就诞生了FastCGI。另外传统的CGI接口方式安全性也很差。

什么是FastCGI

FastCGI是一个可伸缩地、高速地在HTTP服务器和动态脚本语言间通信的接口(FastCGI接口在Linux下是socket(可以是文件socket,也可以是ip socket)),主要优点是把动态语言和HTTP服务器分离开来。多数流行的HTTP服务器都支持FastCGI,包括Apache、Nginx和lightpd。

同时,FastCGI也被许多脚本语言所支持,比较流行的脚本语言之一为PHP。FastCGI接口方式采用C/S架构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程执行,然后将得到的结构返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。

FastCGI的重要特点:

1、FastCGI是HTTP服务器和动态脚本语言间通信的接口或者工具。

2、FastCGI优点是把动态语言解析和HTTP服务器分离开来。

3、Nginx、Apache、Lighttpd以及多数动态语言都支持FastCGI。

4、FastCGI接口方式采用C/S架构,分为客户端(HTTP服务器)和服务端(动态语言解析服务器)。

5、PHP动态语言服务端可以启动多个FastCGI的守护进程。

6、HTTP服务器通过FastCGI客户端和动态语言FastCGI服务端通信。

Nginx FastCGI的运行原理

Nginx不支持对外部动态程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket(可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper,这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接收到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程。

FastCGI与PHP

FastCGI的主要优点是把动态语言和HTTP服务器分离开来,是Nginx专一处理静态请求和向后转发动态请求,而PHP/PHP-FPM服务器专一解析PHP动态请求。

检查安装PHP所需lib库

php程序在开发及运行时会调用一些zlib、gb 函数库,因此需要安装下面的库。

  1. [root@lnmp tools]# yum install zlib-devel libxml2-devel libjpeg-devel libiconv-devel freetype-devel libpng-devel gd-devel curl-devel libxslt-devel -y

安装yum无法安装的libiconv库

  1. [root@lnmp tools]# wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
  2. [root@lnmp tools]# tar zxf libiconv-1.14.tar.gz
  3. [root@lnmp tools]# cd libiconv-1.14
  4. [root@lnmp libiconv-1.14]# ./configure --prefix=/usr/local/libiconv
  5. [root@lnmp libiconv-1.14]# make && make install

安装libmcrypt库

  1. [root@lnmp tools]# wget http://sourceforge.net/projects/mcrypt/files/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz
  2. [root@lnmp libmcrypt-2.5.8]# ./configure
  3. [root@lnmp libmcrypt-2.5.8]# make && make install

快速安装方法:

安装epel源

  1. [root@lnmp ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo

安装PHP依赖包

  1. [root@lnmp ~]# yum -y install libxml2-devel gd-devel libcurl-devel libxslt-devel libmcrypt-devel mhash mcrypt

安装libicov

同上。

安装libmcrypt

  1. [root@lnmp yum.repos.d]# yum install libmcrypt-devel -y
  2. [root@lnmp yum.repos.d]# rpm -qa libmcrypt-devel
  3. libmcrypt-devel-2.5.8-9.el6.x86_64

安装mhash加密扩展库

Mhash是基于离散数学原理的不可逆向的php加密方式扩展库,其在默认情况下不开启。mhash可以用于创建校验数值、消息摘要、消息认证码,以及无需原文的关键信息保持(如密码)等。

  1. [root@lnmp ~]# yum install mhash mhash-devel -y
  2. [root@lnmp ~]# rpm -qa mhash mhash-devel
  3. mhash-devel-0.9.9.9-3.el6.x86_64
  4. mhash-0.9.9.9-3.el6.x86_64

安装mcrypt加密扩展库

PHP程序员在编写代码程序时,除了要保证代码的高性能之外,还有一点是非常重要的,那就是程序的安全性保障。PHP除了自带的几种加密函数外,还有功能更全面的PHP加密扩展库mcrypt和mhash。

  1. [root@lnmp ~]# yum install mcrypt -y
  2. [root@lnmp ~]# rpm -qa mcrypt
  3. mcrypt-2.6.8-10.el6.x86_64

安装PHP

lnmp服务器

  1. [root@lnmp tools]# tar xf php-5.3.28.tar.gz
  2. [root@lnmp tools]# ls -ld php-5.3.28
  3. drwxr-xr-x 13 nginx games 4096 Dec 11 2013 php-5.3.28
  4. [root@lnmp tools]# cd php-5.3.28

编译安装

  1. ###################输入以下内容
  2. ./configure \
  3. --prefix=/application/php5.3.28 \
  4. --with-mysql=/application/mysql \ #使用php自带mysql参数:--with-mysql=mysqlnd
  5. --with-iconv-dir=/usr/local/libiconv \
  6. --with-freetype-dir \
  7. --with-jpeg-dir \
  8. --with-png-dir \
  9. --with-zlib \
  10. --with-libxml-dir=/usr \
  11. --enable-xml \
  12. --disable-rpath \
  13. --enable-safe-mode \
  14. --enable-bcmath \
  15. --enable-shmop \
  16. --enable-sysvsem \
  17. --enable-inline-optimization \
  18. --with-curl \
  19. --with-curlwrappers \
  20. --enable-mbregex \
  21. --enable-fpm \
  22. --enable-mbstring \
  23. --with-mcrypt \
  24. --with-gd \
  25. --enable-gd-native-ttf \
  26. --with-openssl \
  27. --with-mhash \
  28. --enable-pcntl \
  29. --enable-sockets \
  30. --with-xmlrpc \
  31. --enable-zip \
  32. --enable-soap \
  33. --enable-short-tags \
  34. --enable-zend-multibyte \
  35. --enable-static \
  36. --with-xsl \
  37. --with-fpm-user=nginx \
  38. --with-fpm-group=nginx \
  39. --enable-ftp
  40. ####################编译结果
  41. creating main/internal_functions.c
  42. creating main/internal_functions_cli.c
  43. +--------------------------------------------------------------------+
  44. | License: |
  45. | This software is subject to the PHP License, available in
    this |
  46. | distribution in the file LICENSE. By continuing this installation |
  47. | process, you are bound by the terms of this license agreement. |
  48. | If you do not agree with the terms of this license, you must abort |
  49. | the installation process at this point. |
  50. +--------------------------------------------------------------------+
  51. Thank you for
    using PHP.
  52. [root@lnmp php-5.3.28]# echo $?

 

  1. [root@lnmp php-5.3.28]# make
  2. /usr/bin/ld: cannot find -lltdl
  3. collect2: ld returned 1 exit status
  4. make: *** [sapi/fpm/php-fpm] Error 1
  5. [root@lnmp php-5.3.28]# echo $?
  6. 2

cannot find –lltdl解决办法,需要安装libltdl。

  1. [root@lnmp tools]# cd libmcrypt-2.5.8/libltdl/
  2. [root@lnmp libltdl]# ./configure -enable-ltdl-install
  3. [root@lnmp libltdl]# make && make install

重新回到PHP的安装目录下进行查询编译PHP。

  1. [root@lnmp php-5.3.28]# make
  2. clicommand.inc
  3. pharcommand.inc
  4. directorytreeiterator.inc
  5. invertedregexiterator.inc
  6. phar.inc
  7. Build complete.
  8. Don't forget to run 'make test'.
  9. [root@lnmp php-5.3.28]# echo $?
  10. [root@lnmp php-5.3.28]# make install

创建软连接

  1. /home/oldboy/tools/php-5.3.28/build/shtool install -c ext/phar/phar.phar /application/php5.3.28/bin
  2. ln -s -f /application/php5.3.28/bin/phar.phar /application/php5.3.28/bin/phar
  3. Installing PDO headers: /application/php5.3.28/include/php/ext/pdo/
  4. [root@lnmp php-5.3.28]# echo $?
  5. [root@lnmp php-5.3.28]# ln -s /application/php5.3.28/ /application/php

mysql服务器

  1. [root@mysql tools]# tar xf php-5.5.38.tar.gz
  2. [root@mysql tools]# ls -ld php-5.5.38
  3. drwxr-xr-x 14 1000 1000 4096 Jul 20 2016 php-5.5.38
  4. [root@mysql tools]# cd php-5.5.38

编译安装

  1. #############输入以下内容
  2. ./configure \
  3. --prefix=/application/php5.5.38 \
  4. --with-mysql=mysqlnd \
  5. --with-iconv-dir=/usr/local/libiconv \
  6. --with-freetype-dir \
  7. --with-jpeg-dir \
  8. --with-png-dir \
  9. --with-zlib \
  10. --with-libxml-dir=/usr \
  11. --enable-xml \
  12. --disable-rpath \
  13. --enable-bcmath \
  14. --enable-shmop \
  15. --enable-sysvsem \
  16. --enable-inline-optimization \
  17. --with-curl \
  18. --enable-mbregex \
  19. --enable-fpm \
  20. --enable-mbstring \
  21. --with-mcrypt \
  22. --with-gd \
  23. --enable-gd-native-ttf \
  24. --with-openssl \
  25. --with-mhash \
  26. --enable-pcntl \
  27. --enable-sockets \
  28. --with-xmlrpc \
  29. --enable-soap \
  30. --enable-short-tags \
  31. --enable-static \
  32. --with-xsl \
  33. --with-fpm-user=nginx \
  34. --with-fpm-group=nginx \
  35. --enable-ftp
  36. ############编译结果
  37. Thank you for
    using PHP.
  38. config.status: creating php5.spec
  39. config.status: executing default commands
  40. [root@mysql php-5.5.38]# echo $?

 

  1. [root@mysql php-5.5.38]# make
  2. invertedregexiterator.inc
  3. clicommand.inc
  4. directorytreeiterator.inc
  5. directorygraphiterator.inc
  6. pharcommand.inc
  7. phar.inc
  8. Build complete.
  9. Don't forget to run 'make test'.
  10. [root@mysql php-5.5.38]# echo $?
  11. [root@mysql php-5.5.38]# make install
  12. ln -s -f phar.phar /application/php5.5.38/bin/phar
  13. Installing PDO headers: /application/php5.5.38/include/php/ext/pdo/
  14. [root@mysql php-5.5.38]# echo $?

创建软连接

  1. [root@mysql php-5.5.38]# ln -s /application/php5.5.38/ /application/php
  2. [root@mysql php-5.5.38]# ls -ld /application/php
  3. lrwxrwxrwx 1 root root 23 Feb 26 16:08 /application/php -> /application/php5.5.38/

配置PHP引擎配置文件php.ini

  1. [root@lnmp php-5.3.28]# cp php.ini-production /application/php/lib/php.ini

配置PHP服务(FastCGI模式)配置文件php-fpm.conf

  1. [root@lnmp php-5.3.28]# cd /application/php/etc/
  2. [root@lnmp etc]# ls
  3. pear.conf php-fpm.conf.default
  4. [root@lnmp etc]# cp php-fpm.conf.default php-fpm.conf
  5. [root@lnmp etc]# ls
  6. pear.conf php-fpm.conf php-fpm.conf.default

指定pid路径:pid = /app/logs/php-fpm.pid

进程管理的错误日志路径:error_log = /app/logs/php-fpm.log

错误日志级别:log_level = error

主进程文件描述符:rlimit_files = 32768

模型:events.mechanism = epoll

用户和组:

listen.owner = nginx

listen.group = nginx

最大进程数:pm.max_children = 1024

开始启动进程数:pm.start_servers = 16

最小空闲进程数:pm.min_spare_servers = 5

最大空闲进程数:pm.max_spare_servers = 20

超时时间:pm.process_idle_timeout = 15s;

每个进程最大请求:pm.max_requests = 2048

慢查询:slowlog = /app/logs/$pool.log.slow

超时时间:request_slowlog_timeout = 10

邮箱地址:php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f xxxxxxx@xxx.com

启动PHP

  1. [root@lnmp etc]# /application/php/sbin/php-fpm
  2. [root@lnmp etc]# ps -ef|grep php-fpm
  3. root 1695 1 0 17:32 ? 00:00:00 php-fpm: master process (/application/php5.3.28/etc/php-fpm.conf)
  4. nginx 1696 1695 0 17:32 ? 00:00:00 php-fpm: pool www
  5. nginx 1697 1695 0 17:32 ? 00:00:00 php-fpm: pool www
  6. nginx 1698 1695 0 17:32 ? 00:00:00 php-fpm: pool www
  7. nginx 1699 1695 0 17:32 ? 00:00:00 php-fpm: pool www
  8. nginx 1700 1695 0 17:32 ? 00:00:00 php-fpm: pool www
  9. nginx 1701 1695 0 17:32 ? 00:00:00 php-fpm: pool www
  10. nginx 1702 1695 0 17:32 ? 00:00:00 php-fpm: pool www
  11. nginx 1703 1695 0 17:32 ? 00:00:00 php-fpm: pool www
  12. nginx 1704 1695 0 17:32 ? 00:00:00 php-fpm: pool www
  13. nginx 1705 1695 0 17:32 ? 00:00:00 php-fpm: pool www
  14. nginx 1706 1695 0 17:32 ? 00:00:00 php-fpm: pool www
  15. nginx 1707 1695 0 17:32 ? 00:00:00 php-fpm: pool www
  16. nginx 1708 1695 0 17:32 ? 00:00:00 php-fpm: pool www
  17. nginx 1709 1695 0 17:32 ? 00:00:00 php-fpm: pool www
  18. nginx 1710 1695 0 17:32 ? 00:00:00 php-fpm: pool www
  19. nginx 1711 1695 0 17:32 ? 00:00:00 php-fpm: pool www
  20. root 1713 1360 0 17:33 pts/0 00:00:00 grep php-fpm
  21. [root@lnmp etc]# ps -ef|grep php-fpm|wc -l
  22. 18

查看端口

  1. [root@lnmp etc]# netstat -lntup|grep php-fpm
  2. tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 1695/php-fpm
  3. [root@lnmp etc]# ss -lntup|grep php-fpm
  4. tcp LISTEN 0 128 127.0.0.1:9000 *:* users:(("php-fpm",1695,7),("php-fpm",1696,0),("php-fpm",1697,0),("php-fpm",1698,0),("php-fpm",1699,0),("php-fpm",1700,0),("php-fpm",1701,0),("php-fpm",1702,0),("php-fpm",1703,0),("php-fpm",1704,0),("php-fpm",1705,0),("php-fpm",1706,0),("php-fpm",1707,0),("php-fpm",1708,0),("php-fpm",1709,0),("php-fpm",1710,0),("php-fpm",1711,0))

配置PHP与Nginx

  1. [root@lnmp ~]# cd /application/nginx/conf/extra/
  2. [root@lnmp extra]# cat blog.conf
  3. server {
  4.   listen 80;
  5.   server_name blog.etiantian.org;
  6.   root html/blog;
  7.   location / {
  8.     index index.html index.htm;
  9.   }
  10.   location ~ .*\.(php|php5)?$ {
  11.     fastcgi_pass 127.0.0.1:9000;
  12.     fastcgi_index index.php;
  13.     include fastcgi.conf;
  14.   }
  15. }
  16. [root@lnmp extra]# ../../sbin/nginx -t
  17. nginx: the configuration file /application/nginx-1.6.1/conf/nginx.conf syntax is ok
  18. nginx: configuration file /application/nginx-1.6.1/conf/nginx.conf test is successful
  19. [root@lnmp extra]# ../../sbin/nginx -s reload
  20. [root@lnmp extra]# cd /application/nginx/html/blog/
  21. [root@lnmp blog]# cat phpinfo.php
  22. <?php
  23. phpinfo();
  24. ?>

浏览器访问

FastCGI与PHP

配置PHP与MySQL

  1. [root@lnmp blog]# pwd
  2. /application/nginx/html/blog
  3. [root@lnmp blog]# cat test_mysql.php
  4. <?php
  5. //$link_id=mysql_connect('主机名','用户','密码');
  6.   $link_id=mysql_connect('localhost','root','system');
  7. //$link_id=mysql_connect('localhost','test','');
  8.   if($link_id){
  9.     echo "mysql successful by oldboy!";
  10.   }else{
  11.     echo mysql_error();
  12.   }
  13. //php单行注释
  14. /*php多行注释*、
  15. ?>

FastCGI与PHP

  1. [root@lnmp blog]# rm -f phpinfo.php test_mysql.php

部署一个BLOG程序服务

https://cn.wordpress.org/

FastCGI与PHP

WordPress是一套利用PHP语言和MySQL数据库开发的开源免费的Blog(博客、网站)程序,用户可以在支持PHP环境和MySQL数据库的服务器上建立Blog站点。

WordPress是一个功能非常强大的博客系统,插件众多,易于扩展功能。安装和使用都非常方便。目前WordPress已经成为主流的Blog搭建平台,很多发布平台也是根据WordPress二次开发的。

  1. [root@lnmp blog]# pwd
  2. /application/nginx/html/blog
  3. [root@lnmp blog]# wget https://cn.wordpress.org/wordpress-4.7.2-zh_CN.tar.gz

创建一个专用的数据库WordPress用于存放blog数据。

  1. [root@lnmp blog]# mysql -uroot -psystem
  2. mysql> create database wordpress;
  3. Query OK, 1 row affected (0.00 sec)
  4. mysql> show databases;
  5. +--------------------+
  6. | Database |
  7. +--------------------+
  8. | information_schema |
  9. | mysql |
  10. | performance_schema |
  11. | wordpress |
  12. +--------------------+
  13. 4 rows in
    set (0.07 sec)

创建一个管理的数据库WordPress的用户wordpress。

  1. mysql> grant all on wordpress.* to wordpress@'localhost' identified by 'system';
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> flush privileges;
  4. Query OK, 0 rows affected (0.01 sec)
  5. mysql> select user,host from mysql.user where user='wordpress';
  6. +-----------+-----------+
  7. | user | host |
  8. +-----------+-----------+
  9. | wordpress | localhost |
  10. +-----------+-----------+
  11. 1 row in
    set (0.00 sec)

部署WordPress

  1. [root@lnmp blog]# tar xf wordpress-4.7.2-zh_CN.tar.gz
  2. [root@lnmp blog]# mv wordpress/* .
  3. [root@lnmp blog]# rm -fr wordpress
  4. [root@lnmp blog]# cd ../
  5. [root@lnmp html]# ll -ld blog/
  6. drwxr-xr-x 5 root root 4096 Feb 27 10:10 blog/
  7. [root@lnmp html]# find ./blog/ -type f|xargs chmod 644
  8. [root@lnmp html]# find ./blog/ -type d|xargs chmod 755

权限设置

默认目录权限:dir 755 root root

默认文件权限:file 644 root root

用户目录权限:dir nginx nginx 755

用户文件权限:file nginx nginx 644

  1. [root@lnmp html]# chown -R root.root blog/
  2. [root@lnmp html]# find ./blog/ -type f|xargs chmod 644
  3. [root@lnmp html]# find ./blog/ -type d|xargs chmod 755
  4. [root@lnmp html]# mkdir blog/wp-content/uploads
  5. [root@lnmp html]# chown -R nginx.nginx blog/wp-content/uploads/

FastCGI与PHP

浏览器访问http://blog.etiantian.org/index.php

FastCGI与PHP

FastCGI与PHP

FastCGI与PHP

根据提示创建wp-config.php,然后点击"进行安装"。

FastCGI与PHP

数据库中查看安装结果

  1. [root@lnmp blog]# mysql -uroot -psystem
  2. Welcome to the MySQL monitor. Commands end with ; or \g.
  3. mysql> use wordpress
  4. Database changed
  5. mysql> show tables;
  6. Empty set (0.01 sec)
  7. mysql> show tables;
  8. +-----------------------+
  9. | Tables_in_wordpress |
  10. +-----------------------+
  11. | ol_commentmeta |
  12. | ol_comments |
  13. | ol_links |
  14. | ol_options |
  15. | ol_postmeta |
  16. | ol_posts |
  17. | ol_term_relationships |
  18. | ol_term_taxonomy |
  19. | ol_termmeta |
  20. | ol_terms |
  21. | ol_usermeta |
  22. | ol_users |
  23. +-----------------------+
  24. 12 rows in
    set (0.00 sec)
  25. mysql> select * from ol_users;
  26. +----+------------+------------------------------------+---------------+---------------+----------+---------------------+---------------------+-------------+--------------+
  27. | ID | user_login | user_pass | user_nicename | user_email | user_url | user_registered | user_activation_key | user_status | display_name |
  28. +----+------------+------------------------------------+---------------+---------------+----------+---------------------+---------------------+-------------+--------------+
  29. | 1 | root | $P$BbYLtgyYZ9xItWMJXp4rYB/ggABd9t/ | root | admin@163.com | | 2017-02-27 03:37:27 | | 0 | root |
  30. +----+------------+------------------------------------+---------------+---------------+----------+---------------------+---------------------+-------------+--------------+
  31. 1 row in
    set (0.00 sec)

FastCGI与PHP