Apache和PHP结合####httpd与PHP的结合方式:#####CGI:CGI(common gateway interface)通常翻译为共同网关接口,是HTTP服务器与机器上的其他程序进行
Apache和PHP结合
####httpd与PHP的结合方式:
#####CGI:
CGI(common gateway interface)通常翻译为共同网关接口,是HTTP服务器与机器上的其他程序进行通信的一个接口,让Web服务器必要时启动额外的程序处理动态内容。CGI是一种协议,它定义了Webserver与CGI程序的通信方式。Webserver接受客户端的HTTP请求,然后建立进程执行CGI程序,客户端的请求被传递给CGI程序,CGI执行后结果再返回Webserver。 CGI的出现让WEB从静态变为为动态,随着Web的越来越普及,很多的网站的都需要有动态的页面,以便与浏览者互交。随着网络技术的发展,CGI方式的缺点也越来越突出。每次客户端请求都需要建立和销毁进程。因为HTTP要生成一个动态页面,系统]就必须启动一个新的进程以运行CGI程序,不断地fork是一项很消耗时间和资源的工作。
#####FastCGI:
众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中 并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail-Over特性等等。
FastCGI是一个常驻型的CGI,可以一直执行,只要激活后,不会每次都花时间去fork一次,而且还支持分布式运算(使得php程序解释执行可以单独交给php服务器),即可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。
1、Web Server 启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module);2、FastCGI进程管理器自身初始化,启动多个CGI解释器进程 (在任务管理器中可见多个php-cgi.exe)并等待来自Web Server的连接。3、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi.exe。4、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在 WebServer中)的下一个连接。 在正常的CGI模式中,php-cgi.exe在此便退出了。
#####Module:
把php编译为apache的模块,就要考虑apache的MPM的工作模式。
首先我们要了解什么是MPM:
MPM:Multi Path Modules (多道处理模块)用于定义apache在响应多个用户请求时所工作的模型。有三种MPM模式:
prefork(一个请求一个进程响应)
worker(一个请求用一个线程响应,启动多个进程每个进程生成多个线程)
event(一个进程处理多个请求)
以模块安装的php没有独立的进程,是作为apache的模块和apache一起启动的。
以上三种MPM模式,worker模式会比prefork模式占据更少的内存,高并发下的表现更好。而且使用多进程和多线程混合模式,即使有一个线程挂了,也只影响和该线程同进程的其他线程,不会影响到其他的进程。但是如果有特别多的线程都使用keep-alive的长连接方式,则线程会一直被占据直到超时才释放,导致在高并发场景下无可用线程。而event模式使用了一个专门的线程来处理这些keep-alive类线程,较好的解决了这个问题。
####比较:
以CGI方式运行PHP,由于CGI是非常驻内存集,每次Webserver接受客户端的HTTP请求,然后建立进程执行CGI程序,客户端的请求被传递给CGI程序,CGI执行后结果再返回Webserver。 每次浏览页面都要重复上面的动作,会有非常大的消耗。
以mod_php模式运行PHP,意味着php是作为apache的一个模块来启动的,因此只有在apache启动的时候会加载扩展模块,在apache运行期间是不会再去读取和加载扩展模块的。显然使用mod_php的方式运行PHP效率比CGI方式更高。
而mod_php与fastcgi相比,俩者都有进程池的概念,但是,fastcgi将服务器端动、静态请求更好的分离。php进程除了问题不会将web服务器也当掉。
最后再对几个名词进行解释:
php的解释器是php-cgi。php-cgi只是个CGI程序,只能解析请求,返回结果,不会进程管理,而php-fastcgi是php-cgi的升级版。php-fpm的功能就是能够调度php解释进程实现进程管理。
11.16/11.17 Apache默认虚拟主机
####windows设置hosts
hosts文件路径:C:/Windows/System32/drivers/etc/hosts在该文件中可添加DNS解析
httpd的默认虚拟主机
一台服务器可以设置多个域名,而每一个域名就对应一个虚拟主机。当域名解析到该服务器时,都可以访问的虚拟主机就是默认虚拟主机。
httpd的主配置文件中定义只有一个虚拟主机,所以默认虚拟主机为:
ServerName www.example.com:80只定义了“ServerName www.example.com:80”一个域名,该域名即为Apache的默认主机,此时通过任何一个绑定该虚拟机IP的域名进行访问都会跳转到该主机。
管理多个虚拟主机
修改httpd主配置文件
修改配置文件/usr/local/apache2.4/conf/httpd.conf,找到“Include conf/extra/httpd-vhosts.conf”,将该配置语句取消注释
检查,重载配置文件
[root@allen1 ~]# /usr/local/apache2.4/bin/apachectl -tSyntax OK[root@allen1 ~]# /usr/local/apache2.4/bin/apachectl graceful重新加载配置文件后,之前定义的默认虚拟主机将失效。
虚拟主机配置文件
(1)虚拟主机配置文件位置:/usr/local/apache2.4/conf/extra/httpd-vhosts.conf
(2)查看虚拟主机:该配置文件下每组“< VirtualHost *:80 >”代表一个主机(即:一个域名网站)3、添加自定义虚拟主机
(1)修改配置虚拟主机配置文件
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf<VirtualHost *:80> #虚拟主机根目录 DocumentRoot "/data/wwwroot/abc.com" #虚拟主机域名 ServerName abc.com #别名,可写多个域名 ServerAlias www.abc.com www.123.com #错误日志存放路径 ErrorLog "logs/abc.com-error_log" #访问日志存放路径 CustomLog "abc.com-access_log" common</VirtualHost><VirtualHost *:80> #虚拟主机根目录 DocumentRoot "/data/wwwroot/111.com" #虚拟主机域名 ServerName 111.com #别名,可写多个域名 ServerAlias www.example.com #错误日志存放路径 ErrorLog "logs/111.com-error_log" #访问日志存放路径 CustomLog "111.com-access_log" common</VirtualHost>定义网站的核心参数即为:DocumentRoot(网站根目录)、ServerName(域名)。注意: 虚拟主机生效后,原Apache配置文件中的默认虚拟主机(www.example.com ~ 192.168.8.133)就会失效(在此用www.example.com ~ 111.com进行验证)。
(2)创建虚拟主机根目录
[root@allen1 ~]# mkdir -p /data/wwwroot/abc.com[root@allen1 ~]# mkdir -p /data/wwwroot/111.com
(3)添加测试文件
abc.com测试文件vim /data/wwwroot/abc.com/index.php<?phpecho "welcome to aaa.com"?>111.com测试文件vim /data/wwwroot/111.com/index.php<?phpecho "welcome to 111.com"?>
(4)检查,重载配置文件
[root@allen1 ~]# /usr/local/apache2.4/bin/apachectl -tSyntax OK[root@allen1 ~]# /usr/local/apache2.4/bin/apachectl graceful
4、测试
由于服务器并没有指定host,所以使用curl进行测试时需要使用-x指定代理ip和端口
[root@allen1 ~]# curl -x 192.168.205.137:80 abc.comwelcome to aaa.com[root@allen1 ~]# curl -x 192.168.205.137:80 111.comwelcome to 111.com[root@allen1 ~]# curl -x 192.168.205.137:80 abcde.comwelcome to aaa.com[root@allen1 ~]# curl -x 192.168.205.137:80 www.example.comwelcome to 111.com此时的默认虚拟主机为aaa.com,只要是访问该服务器的IP都会解析到该域名而且之前httpd.conf中定义的虚拟主机已经失效```[apache所有的主机都指向第一个](http://www.aminglinux.com/bbs/thread-491-1-1.html)