Apache和PHP结合、Apache默认虚拟主机

摘要:1、apache和php结合 配置httpd支持php目录概要 httpd主配置文件/usr/local/apache2.4/conf/httpd.conf vim /usr/local/apache2.4/conf/httpd.conf //修改以下4个地方 ServerName Require all denied AddType application/x-httpd-php .ph....

1、apache和php结合

002UASMrzy7605pjKJv15&690.jpg

配置httpd支持php目录概要 httpd主配置文件/usr/local/apache2.4/conf/httpd.conf vim/usr/local/apache2.4/conf/httpd.conf//修改以下4个地方 ServerName Requirealldenied AddTypeapplication/x-httpd-php.php DirectoryIndexindex.htmlindex.php/usr/local/apache2.4/bin/apachectl-t//测试语法/usr/local/apache2.4/bin/apachectlstart//启动服务netstat-lntpcurllocalhostvim/usr/local/apache2.4/htodcs/test.php//增加如下内容

<?phpecho123;?>

curllocalhost/test.php 编辑httpd的配置文件 在安装好Apache、mysql、httpd,但是还未结合在一起,虽然apche调用了php作为它的模块,但是还不知道是否能解析php,所以现在还是需要编辑Apache的配置文件 httpd主配置文件,在/usr/local/apache2.4/conf/httpd.conf下 编辑四个地方 定义ServerName,去除#号 在/usr/local/apache2.4/bin/apachectlrestart乍一看是报错信息,其实只是一个警告信息,并不是错误,若想不看到这个提示,可以在/usr/local/apache2.4/conf/httpd.conf取消掉 方法:在/usr/local/apache2.4/conf/httpd.conf中搜索/ServerName,然后将#ServerNamewww.example.com:80前的#去除掉,保存退出即可 把Requirealldenied改成 若是不更改,那么访问会是403 第一处:取消警告信息 在运行/usr/local/apache2.4/bin/apachectlstart会跳出警告信息

[root@hf-01~]#vim/usr/local/apache2.4/conf/httpd.conf//ctrtl+z退出下 [1]+已停止vim/usr/local/apache2.4/conf/httpd.conf [root@hf-01~]#/usr/local/apache2.4/bin/apachectlrestart//会看到警告信息 AH00557:httpd:apr_sockaddr_info_get()failedforhanfeng AH00558:httpd:Couldnotreliablydeterminetheserver\'sfullyqualifieddomainname,using127.0.0.1.Setthe\'ServerName\'directivegloballytosuppressthismessage [root@hf-01~]#fg//回到刚暂停的任务中——>vim/usr/local/apache2.4/conf/httpd.conf 在文件中搜索/ServerName 然后将#ServerNamewww.example.com:80前的#去除掉保存退出即可 在去除#号之后,运行apache,会提示79行错误 原因:是因为在最后调用了两个PHP,加载了两个PHP,导致冲突 解决方法:只需要注释掉一个PHP即可

[root@hf-01~]#/usr/local/apache2.4/bin/apachectlrestart httpdnotrunning,tryingtostart /usr/local/apache2.4/bin/apachectl:行79:2348段错误$HTTPD-k$ARGV [root@hf-01~]# 在注释掉一个PHP,就会发现不提示警告信息了

[root@hf-01~]#/usr/local/apache2.4/bin/apachectlstart [root@hf-01~]# 查看httpd进程

[root@hf-01~]#psaux|grephttpd root24530.00.82540728820?Ss23:520:00/usr/local/apache2.4/bin/httpd-kstart daemon24540.00.85409008972?Sl23:520:00/usr/local/apache2.4/bin/httpd-kstart daemon24550.00.85409008972?Sl23:520:00/usr/local/apache2.4/bin/httpd-kstart daemon24560.00.85409008972?Sl23:520:00/usr/local/apache2.4/bin/httpd-kstart root25410.00.0112676980pts/0R+23:540:00grep--color=autohttpd [root@hf-01~]# 因为在打开了ServerName,就不在提示警告信息了 第二处:更改Requirealldenied 首先,我们可以用浏览器访问自己虚拟机的IP,会发现无法访问 则会提示检查代理服务器和防火墙 在遇到这种问题,排查方法 先查看IP是否是通的,用物理机去ping虚拟机的IP

 

若IP是通的,再去判断80端口是否是通的——>用物理机去ping80端口

 

因为windows并没有打开telnet客户端,所以会提示并没有这个命令 打开telnet客户端——>注意:不要打开Telnet服务端,否则会监听23端口,不安全 打开物理机的控制面板 然后选择程序 再选择打开或关闭Windows功能 选择Telnet客户端,并打开

 

因为在linux虚拟机上,并没有打开80端口 在虚拟机上,使用iptables-nvL命令,会查看到80端口并没有打开

[root@hf-01~]#iptables-nvL ChainINPUT(policyACCEPT0packets,0bytes) pktsbytestargetprotoptinoutsourcedestination 34732935ACCEPTall--**0.0.0.0/00.0.0.0/0ctstateRELATED,ESTABLISHED 00ACCEPTall--lo*0.0.0.0/00.0.0.0/0 26626673INPUT_directall--**0.0.0.0/00.0.0.0/0 26626673INPUT_ZONES_SOURCEall--**0.0.0.0/00.0.0.0/0 26626673INPUT_ZONESall--**0.0.0.0/00.0.0.0/0 00ACCEPTicmp--**0.0.0.0/00.0.0.0/0 26226469REJECTall--**0.0.0.0/00.0.0.0/0reject-withicmp-host-prohibited 等等,只截取了一部分,会发现80端口并没有打开 若想要windows机器去访问它,还需要加上一个操作 单独一条命令,临时加上80端口——>iptables-IINPUT-ptcp--dport80-jACCEPT

[root@hf-01~]#iptables-IINPUT-ptcp--dport80-jACCEPT [root@hf-01~]# 这时再用物理机去访问虚拟机IP,则会显示Itworks!

 

之前不能正常访问,就是由于防火墙的规则,没有加上80端口,不能正常访问 这时打开windows来查看80端口,这样的界面表示80端口通了

 

在物理机中按ctrl+]退出来,然后在按quit字符退出

 

这时删除之前加的那条规则,再来物理机查看虚拟机的80端口,会发现不通了

[root@hf-01~]#iptables-DINPUT-ptcp--dport80-jACCEPT [root@hf-01~]#

 

这时在把规则添加上,会发现又可以正常访问了 有时浏览器去访问虚拟机的IP,会显示403Forbidden错误界面 这是因为在/usr/local/apache2.4/conf/httpd.conf配置文件中,有一个Requirealldenied 然后搜索/denied, 打开/usr/local/apache2.4/conf/httpd.conf配置文件

[root@hf-01~]#vim/usr/local/apache2.4/conf/httpd.conf 然后搜索/denied,会看到 <Directory/> AllowOverridenone Requirealldenied </Directory> 把denied改成granted 之前可以在浏览器正常访问虚拟机ip,是因为

[root@hf-01~]#vim/usr/local/apache2.4/conf/httpd.conf 是因为DocumentRoot指定了Directory,即如下: DocumentRoot"/usr/local/apache2.4/htdocs" <Directory"/usr/local/apache2.4/htdocs"> 还有后面的 Requireallgranted 若是将这里的Requireallgranted改成Requirealldenied,那肯定无法浏览 在更改完配置文件,需要重新加载配置 /usr/local/apache2.4/bin/apachectl-t//检查你修改的配置文件是否存在错误 -t参数,会检查你修改的配置文件是否存在语法错误 若语法不对,则会报错

[root@hf-01~]#/usr/local/apache2.4/bin/apachectl-t SyntaxOK [root@hf-01~]# 重新加载配置文件 graceful只会重新加载配置文件,而不会重启你的服务 就是说即使你的配置文件有问题,它最多加载不成功,而不会把你的进程杀掉

[root@hf-01~]#/usr/local/apache2.4/bin/apachectlgraceful [root@hf-01~]# 在配置文件中的,两处位置都应该改成granted,这是为了防止你在打开虚拟主机配置文件的时候,显示403Forbidden(403是它的状态码,正常情况下,状态码都是200) 第三处:因为要支持php,所以要增加一行php相关的配置 如果不增加这一行,那么php就无法解析

[root@hf-01~]#vim/usr/local/apache2.4/conf/httpd.conf 搜索/AddType,然后 AddTypeapplication/x-compress.Z AddTypeapplication/x-gzip.gz.tgz 在这两行下面,增加php一行 AddTypeapplication/x-httpd-php.php 第四部分,增加一个索引页 索引页作用:在打开一个网站,为什么不输入index.php就可以直接访问呢

[root@hf-01~]#vim/usr/local/apache2.4/conf/httpd.conf 搜索/Index,找到 <IfModuledir_module> DirectoryIndexindex.html </IfModule> 在index.html后加index.php 显示为 <IfModuledir_module> DirectoryIndexindex.htmlindex.php </IfModule> 然后检查配置文件是否有错误

[root@hf-01~]#/usr/local/apache2.4/bin/apachectl-t SyntaxOK [root@hf-01~]# 然后重新加载配置文件

[root@hf-01~]#/usr/local/apache2.4/bin/apachectlgraceful [root@hf-01~]# 检查Apache是否支持解析php5 验证 写一个测试php脚本 在访问的时候,访问的是htdocs下的文件 phpinfo,可以把php的相关信息打印出来

[root@hf-01~]#vi/usr/local/apache2.4/htdocs/1.php 在文件中写入 <?php phpinfo(); ?> 然后保存退出 然后在浏览器访问虚拟机ip地址并添加页面地址(IP/index.php),然后会看到显示出内容——>增加一个文件是不需要重启php的

http://192.168.74.129/1.php

 

当看到php正常显示,如上图,那说明php支持支持解析

如果php不支持解析(以上四步骤错误一处),那么刷新页面显示出来的则是源代码(就是1.php文件中的代码)

如果遇到php无法解析,则去检查Apache的配置文件

第一项,查看是否加载php5模块,使用/usr/local/apache2.4/bin/apachectl-M命令 如果没有加载这个模块,查看这个模块是否存在。使用ls/usr/local/apache2.4/modules/libphp5.so查看文件是否存在,若是文件都没有,那么肯定不会加载这个模块

[root@hf-01~]#/usr/local/apache2.4/bin/apachectl-M LoadedModules: core_module(static) so_module(static) http_module(static) mpm_event_module(static) authn_file_module(shared) authn_core_module(shared) authz_host_module(shared) authz_groupfile_module(shared) authz_user_module(shared) authz_core_module(shared) access_compat_module(shared) auth_basic_module(shared) reqtimeout_module(shared) filter_module(shared) mime_module(shared) log_config_module(shared) env_module(shared) headers_module(shared) setenvif_module(shared) version_module(shared) unixd_module(shared) status_module(shared) autoindex_module(shared) dir_module(shared) alias_module(shared) php5_module(shared) [root@hf-01~]#ls/usr/local/apache2.4/modules/libphp5.so /usr/local/apache2.4/modules/libphp5.so 第二项,如果有文件,则没有显示php模块,那么就要去看apache的配置文件中有没有加载libphp5这一行配置,在文件中搜索/libphp5,如果没有这一行配置,那么肯定也是无法解析的

[root@hf-01~]#vim/usr/local/apache2.4/conf/httpd.conf 在文件中搜索/libphp5,看是否加载了这一行配置 LoadModulephp5_modulemodules/libphp5.so 第三项,检查配置文件中是否加载了AddTypeapplication/x-httpd-php.php这一行 在.php前面有一行空格,需要注意下!不能遗忘!!!——>使用/usr/local/apache2.4/bin/apachectl-t可以检查出配置写错了

[root@hf-01~]#vim/usr/local/apache2.4/conf/httpd.conf 在文件搜索/AddType中关于php这一行配置是否存在 AddTypeapplication/x-httpd-php.php 第四项,检查是否加了index.php 在访问一个网站的时候,比如访问www.baidu.com的时候,并不用是www.baidu.com/index.php访问,会发现,两个访问出的页面是相同的,就是因为这里有索引页(或者叫做index页),它默认能跳转到这个页面下去,包括直接输入虚拟机ip的时候,也会访问到Itworks!这是访问到的是index.html,就是因为我们定义了一个index

[root@hf-01~]#ls/usr/local/apache2.4/htdocs/ 1.phpindex.html [root@hf-01~]# 检查Apache是否支持解析php7 在配置文件中,注释掉php5,打开php7

[root@hf-01~]#vim/usr/local/apache2.4/conf/httpd.conf 在文件中搜索/libphp7,然后注释掉php5打开php7 #LoadModulephp5_modulemodules/libphp5.so LoadModulephp7_modulemodules/libphp7.so 快捷键ctrl+r,可以快速执行命令历史中所用过的一些命令 在快捷键ctrl+r之后,然后输入命令的一些字母,就会显示出你使用过的命令 然后检查配置文件是否存在语法错误,并重新加载配置文件

[root@hf-01~]#/usr/local/apache2.4/bin/apachectl-t SyntaxOK [root@hf-01~]#/usr/local/apache2.4/bin/apachectlgraceful [root@hf-01~]# 会看到更换了php7之后,用物理机访问虚拟机的ip,也会正常显示

 

在浏览器打开看到的phpinfo,和/usr/local/php7/bin/php-i|less看到的结果基本是一致的,只不过一个是文本形式,一个是图形化,图形化看起来更加直观,清晰明了

[root@hf-01~]#/usr/local/php7/bin/php-i|less phpinfo() PHPVersion=>7.1.6 System=>Linuxhf-013.10.0-123.el7.x86_64#1SMPMonJun3012:09:22UTC2014x86_64 BuildDate=>Dec18201722:25:37 ConfigureCommand=>\'./configure\'\'--prefix=/usr/local/php7\'\'--with-apxs2=/usr/local/apache2.4/bin/apxs\'\'--with-config-file-path=/usr/local/php7/etc\'\'--with-pdo-mysql=/usr/local/mysql\'\'--with-mysqli=/usr/local/mysql/bin/mysql_config\'\'--with-libxml-dir\'\'--with-gd\'\'--with-jpeg-dir\'\'--with-png-dir\'\'--with-freetype-dir\'\'--with-iconv-dir\'\'--with-zlib-dir\'\'--with-bz2\'\'--with-openssl\'\'--with-mcrypt\'\'--enable-soap\'\'--enable-gd-native-ttf\'\'--enable-mbstring\'\'--enable-sockets\'\'--enable-exif\' ServerAPI=>CommandLineInterface VirtualDirectorySupport=>enabled ConfigurationFile(php.ini)Path=>/usr/local/php7/etc LoadedConfigurationFile=>(none) Scanthisdirforadditional.inifiles=>(none) Additional.inifilesparsed=>(none) PHPAPI=>20160303 PHPExtension=>20160303 ZendExtension=>320160303 ZendExtensionBuild=>API320160303,TS 等等等,只截取了一部分 Apache配置文件 为什么可以在htdocs下面中可以访问到index.html、1.php 这是因为在/usr/local/apache2.4/conf/httpd.conf配置文件中的DocumentRoot参数,定义了网站的根目录在哪里,域名就是定义的ServerName

[root@hf-01~]#vim/usr/local/apache2.4/conf/httpd.conf 在文件中搜索/htdocs,其中DocumentRoot定义了文件根目录在哪里 DocumentRoot"/usr/local/apache2.4/htdocs" <Directory"/usr/local/apache2.4/htdocs"> 搜索/ServerName,域名就是定义的ServerName,只不过这个ServerName,,可以使用任何一个域名去访问它,比如可以使用IP可以访问,使用example.com可以访问,用www也可以去访问它 ServerNamewww.example.com:80