一、nginx
(1)配置文件中需要注意的一些点*************************************************************
sendfile on; //开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负
载 应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载
keepalive_timeout 65; //长连接超时时间
//解析php文件的配置
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000; //使用TCP的连接方式
fastcgi_index index.php;
#fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; //脚本文件请求的路径,在fastcgi.conf文件中也有,这里可以不写
include fastcgi_params;
include fastcgi.conf;
}
具体参考: http://www.ha97.com/5194.html
(2)fastcgi与cgi的区别*************************************************************************************
CGI: CGI(公共网关接口)是外部应用程序(CGI程序)与Web服务器之间的接口标准,传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发访问时,几乎是不可用的。另外传统的CGI接口方式安全性也很差,现在已经很少被使用了。
FASTCGI: FastCGI是从CGI发展改进而来的,是http服务器(nginx、apache)和动态脚本语言(php)之间的通信接口,接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。
(3)nginx+fastcgi运行原理********************************************************************************
Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket(这个socket可以是文件socket,也可以是ipsocket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接收到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端。
对于fastcgi的socket,它可以是一个socket文件,也可以是TCP的ip连接,那么这两种方式的区别在于:
Tcp是使用TCP端口连接127.0.0.1:9000
Socket是使用unix domain socket连接套接字/dev/shm/php-cgi.sock
在服务器压力不大的情况下,tcp和socket差别不大,但在压力比较满的时候,用套接字方式,效果比较好。
总结如下:
fastCGI是nginx和php之间的一个通信接口,该接口实际处理过程通过启动php-fpm进程来解析php脚本,即php-fpm相当于一个动态应用服务器,从而实现nginx动态解析php。因此,如果nginx服务器需要支持php解析,需要在nginx.conf中增加php的配置:将php脚本转发到fastCGI进程监听的IP地址和端口(php-fpm.conf中指定)。同时,php安装的时候,需要开启支持fastCGI选项,并且编译安装php-fpm补丁/扩展,同时,需要启动php-fpm进程,才可以解析nginx通过fastCGI转发过来的php脚本。【fastcgi进程管理器---》php-fpm】
(4)为什么要给nginx设置www用户组**********************************************
nginx接收到请求之后,如果是静态文件的话就自己处理,如果是php文件就转发给fastcgi管理进程,然后选择cgi子进程进行处理,然后返回给nginx。
在这个过程中就牵涉到两个用户,一个是nginx运行的用户,一个是php-fpm运行的用户。如果访问的是一个静态文件的话,则只需要nginx运行的用户对文件具有读权限或者读写权限。
而如果访问的是一个php文件的话,则首先需要nginx运行的用户对文件有读取权限,读取到文件后发现是一个php文件,则转发给php-fpm,此时则需要php-fpm用户对文件具有有读权限或者读写权限。
将nginx、php以及mysql的权限分给不同的用户组可以更灵活地控制里面的文件,同时也能通过分配权限的方式去访问其他组的文件,这样做安全性比较高。
(5)pcre、zlib、openssl的用处******************************************************************************************
pcre:perl语言兼容正则表达式,是一个用C语言编写的正则表达式函数库,用来做Nginx的HTTP Rewrite 模块,通过rewrite规则,
可实现规范的URL,或者动态的URL地址需要伪装成静态的HTML,便于搜索引擎抓到
zlib:压缩和解压模块
openssl:openssl是为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。
二、php
(1)php.ini、php-fpm.conf中的配置***********************************************************
php.ini主要是文件上传file_uploads、动态扩展、mysql的设置、session的设置,其他就是一些日志和扩展等;
php.ini配置文件详解:http://www.cnblogs.com/hbl/archive/2008/02/15/1069367.html
php-fpm.conf重要参数:http://www.cmhello.com/php-fpm.html
(2)linux下php连接mysql的方法********************************************************************
1)先安装mysql ,后安装php,在php编译的时候用 --with-mysql=mysql的路径 --with-mysqli=mysqli的路径 的方式
2)先安装php,后安装mysql,安完之后,通过php源码包中的phpize文件(一个专门挂接php扩展的工具)生成mysql.so,
具体步骤:http://www.cnblogs.com/wangtao_20/archive/2011/03/07/1973621.html
(3)安装php时的扩展包*********************************************************************************
Libiconv:字符集转换库 libpng:图片处理库 libjpeg:图像压缩库 gd:开源的图像处理的库程序 freetype:开源的、可扩展、可定制且可移植的字体引擎
libxml:是个C语言的XML程式库,能简单方便的提供对XML文件的各种操作,并且支持XPATH查询,及部分的支持XSLT转换等功能
libxslt: libevent:用C语言编写的、轻量级的开源高性能网络库,能实现高性能并发 libmcrypt:加密算法扩展库 Mcrypt:加密算法扩展库
Mhash:基于离散数学原理的不可逆向的php加密方式扩展库
如果是开发一些小网站,有一些扩展包其实不是必要的,比如libevent等,可以选择不添加(4)php.ini.production和php.ini.development的区别
php.ini-development和php.ini-production是系统推荐的php.ini设置参数,前者是为开发环境推荐的,允许调试、少占资源的原则,后者是为实际上线后的产品环境推荐的,禁止报错、提高性能的原则。
三、mysql
(1)my.cnf配置文件
主要是连接、存储、文件路径、日志等内容,具体配置详解:http://www.jb51.net/article/48082.htm
(2)php连接数据库的形式:mysql、mysqli、pdo
PHP-MySQL: 是 PHP 操作 MySQL 资料库最原始的 Extension
PHP-MySQLi :的 i 代表 Improvement ,提更了相对进阶的功能,就 Extension 而言,本身也增加了安全性.
PDO:是PHP5.1之后才支持的,他为访问数据库采用了一致性的接口,有非常多的操作却是MySQL扩展库所不具备的:
1). PDO真正的以底层实现的统一接口数库操作接口
2). PDO支持更高级的DB特性操作,如:存储过程的调度等,mysql原生库是不支持的.
3). PDO是PHP官方的PECL库,兼容性稳定性必然要高于MySQL Extension,可以直接使用 pecl upgrade pdo 命令升级
(3)mysql引擎
在缺省情况下,MYSQL支持三个引擎:ISAM、MYISAM和HEAP。另外两种类型INNODB和BERKLEY(BDB)
各引擎介绍以及对比:http://www.cnblogs.com/sopc-mc/archive/2011/11/01/2232212.html
(4)Mysql,Nosql,MongoDB
Mysql优缺点:http://blog.chinaunix.net/uid-10064369-id-2971159.html
Nosql优缺点:http://www.studyofnet.com/news/365.html
MongoDB优缺点:http://www.dataguru.cn/thread-248165-1-1.html