5月28日任务

11.14/11.15 Apache和PHP结合
11.16/11.17 Apache默认虚拟主机


如下图所示:在重启apache服务时,有警告,设置ServerName即可

①设置ServerName:/ServerName找到相应参数,去掉#号重启apache服务


报错如下图:


找到79行把注释#加上


依然报错


重启apache服务:service apache stop, service apache start

实际上是因为开了两个PHP(PHP5,PHP7)造成的冲突,注释掉其中一个,start apache发现一切正常


在windows界面输入IP访问 192.168.242.128出现以下错误


先试一试windows dos界面下能否ping通该IP,能的话再检查80端口是否打开,出现如下提示(原因在于windows的telnet客户端没有开启)


控制面板→程序→程序和功能找到telnet客户端,打勾


正常情况下会出现一个返回结果,ping不通,因为在Linux虚拟机上并没有打开80端口

iptables -nvL查看 并没有放行80端口;执行临时命令:iptables  -I INPUT -p tcp --dport 80 -j ACCEPT (也可-s指定来源IP)



访问成功


显示成功

ctl+]退出


把linux虚拟机上的iptables规则删除显示如下,表示连接不成功,加上规则后又会显示上图所示成功




有时候会显示403 forbidden

原因:

②Require all denied改成 granted


之所以刚刚能访问是因为下面的文件夹下有Require all granted,如果改成Require all denied,保存配置文件,并检查配置文件的语法有无错误 /usr/local/apache2.4/bin/apachectl -t (很关键,如果重启服务发现失败,就相当于down机了,所以检查语法这一步很关键),再重新加载配置文件 /usr/local/apache2.4/bin/apachectl graceful(即使配置文件有问题,最多是加载不成功,而不会杀掉进程),windows无法访问192.168.242.128这台linux虚拟主机





两处Require all granted都要修改,上面Directory的granted是为了防止打开虚拟主机配置文件时显示403,正常状态码为200

③AddType application/x-httpd-php .php (不增加该行php无法解析)


④增加索引页:DirectoryIndex index.html index.php


再执行 -t 检查语法,graceful重新加载配置文件

测试apache是否能解析php

先编辑一个文件: vi /usr/local/apache2.4/htdocs/1.php (其中phpinfo是一个函数,可以把php相关信息打印出来)


访问192.168.242.128/1.php 出现如下页面说明解析成功 (增加一个文件无需重启php)


如果注释掉③中的AddType,再访问会显示php源代码,代表apache解析php失败

 


apache解析php排错分析:

①是否加载php模块 /usr/local/apache2.4/bin/apachectl -M


②如果没有加载再看有没有改模块文件:ls /usr/local/apache2.4/modules/libphp5.so


如果有模块文件但是不显示就到apache配置文件中查看libphp5.so模块是否加载


③检查配置文件中是否加了AddType行(要有空格,-t可检查语法错误)


④加index.php可以不输入真正的地址,默认通过索引页跳转到index.php (如前面的it works!页面,因为访问的是 /usr/local/apache2.4/htdocs/下的index.html)

加载PHP7模块试试,ctrl+r快捷键可以快速搜索历史命令



同样可以,只是版本号改变,和 /usr/local/php7/bin/php -i  |less看到的类似,只是图形界面和文本文件的区别

Apache默认虚拟主机

默认虚拟主机概念:httpd服务下跑多个网站(域名),如服务器可以访问百度和谷歌,同时在一台服务器上运行,用的是同一个httpd服务,每一个域名对应一个虚拟主机。

apache配置文件/usr/local/apache2.4/htdocs/能访问1.php,index.html的原因:

/usr/local/apache2.4/conf/httpd.conf 中有DocumentRoot参数 "/usr/local/apache2.4/htdocs"定义网站的根目录


域名:文件中定义的ServerName,可以用任何一个域名访问它


任何一个域名解析到这台机器,都可以访问的虚拟主机就是默认虚拟主机


Windows下hosts配置(和linux 上/etc/hosts类似)

路径为:C:\Windows\System32\drivers\etc\hotsts

打开方式:记事本


添加一行IP和域名并保存


dos界面打开

ping www.abc.com或者 www.123.com跳转到IP 192.168.242.128


如果注释掉会访问一个公网IP(实际应用:在DNS没有生效的情况下临时访问)






此处ServerName并没有专门定义一个域名或IP,而上述实验中两个域名都可以访问IP 192.168.242.128(并没有在httpd配置文件中定义过)


引申:任何一个域名只要指向该IP都可以访问该站点,该站点叫默认虚拟主机

为了方便管理,一台机器可以跑多个域名,但不希望所有的域名都指向同一个IP,需要打开虚拟主机配置文件

打开虚拟主机配置文件(二级配置文件): /extra


找到#Virutal hosts这行,去掉注释符#(即前面的htdocs, 目录,DocumentRoot,ServerName都不用了,因为一个配置文件中只能定义一个ServerName,不符合需求)


vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf 可以定义多个ServerName


每一个virtual host代表一个主机,一个主机就是一个网站,如果不打开则任何域名只能访问到一个主机

ServerAdmin:定义管理员邮箱(可删除)


定义网站:(核心参数两个:①根目录 ②域名)

①DocumentRoot:定义网站根目录

②ServerName (只能设置一个)

③ServerAlias (可设置多个)

④ErrorLog

⑤CustomLog

⑥创建对应目录

⑦编辑对应文件 (如 index.php)

⑧ 检查有无语法错误,重启apache  /usr/local/apache2.4/bin/apachectl -t / graceful


添加验证行 ServerAlias www.example.com 和之前httpd.conf中定义的域名一样




后面的?>可不带



常识:如果让虚拟主机配置生效,之前的ServerName www.example.com会失效


测试虚拟主机,新命令curl

如果不绑定hosts, ping www.abc.com并没有访问本机IP而是外网IP

解决方法①vi /etc/hosts

             ②curl -x 



abc.com是虚拟主机配置文件中的第一个虚拟主机,即默认虚拟主机,所谓默认主机就是无论访问什么域名,只要解析到这个IP上都会访问该网站,都会访问这个网站对应的虚拟主机配置


111.com是第二个虚拟主机,虽然在httpd下同样也配置了www.example.com但是生效的是虚拟主机的配置

不能加www.111.com因为,第一个为默认虚拟主机,如果加上后系统会访问第一个默认虚拟主机,任何域名只要指向某IP(先会搜索所有配置段,发现访问的域名没有在配置中出现,只要配置文件中没有定义ServerName)就会走第一个默认虚拟主机配置


结论:①在主配置文件中,打开虚拟主机配置文件,一旦打开(去掉#),主配置文件中的ServerName配置失效,虚拟主机配置文件生效

          ②虚拟主机中有若干个virtual host,每一个virtual host 都有对应的ServerName 和 DocumentRoot,都代表一个站点,都是一个虚拟主机;其中默认虚拟主机比较特殊,即无论任何域名解析到IP上都会去访问默认虚拟主机



猜你喜欢

转载自blog.csdn.net/fuel91/article/details/80488901