11.14/11.15 Apache和PHP结合
11.16/11.17 Apache默认虚拟主机
①设置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上都会去访问默认虚拟主机