学校 | 华东师范大学 |
专业 | 计算机科学与技术 |
课程 | 服务器维护与网站建设 |
教师 | 金健 |
年份 | 2019年春 |
这是一篇非常非常非常详(啰)细(嗦)的教程
如果不是因为这是选修课的作业,我才懒得写这么详细还配截图……你可以去我博客上看看我以前写的教程,都只有核心步骤
本文首发于jxtxzzw的个人博客(https://www.jxtxzzw.com)
CentOS 系统安装 LNMP 环境并搭建个人博客请查看我的教程 https://www.jxtxzzw.com/archives/4218
使用 VPN 连接到校园网
打开 Windows 远程桌面,输入 IP 地址、用户名和密码
然后可能会遇到证书验证,点击 是 就可以了
打开以后是很复古的界面,以及一个服务器控制台
下载 XAMPP
由于学校提供的虚拟机是 Window Server 2008,为了照顾兼容性,需要使用较老版本
鄙视……都已经 2019 年了还在玩 10 年前的玩意
老师说是为了强调补丁的重要性……
(其实我觉得是学校没钱了……以及,服务器性能支持不了 40 台 Win Server 2016?那为什么不用 CentOS 呢……强烈鄙视用 Win Server 做服务器
我的观点很简单:每个系统做自己该做的事情,工作娱乐看电影打游戏就用 Windows,鄙视平时用 Linux 装 * 的人,而服务器就用 Linux,鄙视用 Win Server 的人
广告时间:欢迎访问我的个人博客:https://www.jxtxzzw.com、我的个人主页:https://www.jxtxzzw.com/resume,我用 CentOS 不也用的很好,哼!
点击下载按钮的 Click here for other versions 选择更多版本
找到 XAMPP for Windows,点击 More Downloads
找到 XAMPP Windows,点击进入,然后 找到 5.6.40 版本的 Win 32 的版本,因为服务器是 32 位的,还需要预装 VC 11,所以直接下载包括以上所有必要信息的 installer 版本
耐心等待下载完成
不行
等待下载的时候我要再吐槽一下
竟然用 Apache
哼!我 NGINX 哪里不好了,你要用 Apache
NGINX 还可以做负载均衡呢
我还可以开很多虚拟主机做反向代理呢
Apache 要运行多个服务就要开很多个端口,在 URL 后面跟着端口号好看么好看么,www.cst.ecnu.edu.cn:81 太丑陋了,我 NGINX 就很优雅
And,NGINX 可以 upstream 到 Docker 的端口,请求还是走 80 端口 + SSL,你 Apache 行么,垃圾……
什么?Apache 也有好的地方?我不听,就是不听,哼!
下载完成以后上传到服务器,直接在客户机右键复制,到远程桌面粘贴即可,当然也可以直接在服务器上下载……我是为了一边写教程方便截图一边操作,所以在客户机下载的
上传完成以后双击运行
如果给出提示说,因为 UAC 的启用可能会导致安装没有写入权限,那么这个时候可以关闭 UAC
这服务器性能也太垃圾了吧
不过我好像安装的时候没有遇到这个问题,那么不关闭也问题不大,UAC 开着毕竟多了一层保护
然后只需要勾选我们需要的组件
安装目录选择了 C:\website\xampp
下面给出老师给出的目录规划,我可能会按照自己的习惯调整,不过安装到哪个目录倒是无所谓
耐心等待安装完毕
安装完成后打开控制面板,选择英语
或者也可以在安装目录下的 xampp-control.exe
打开
这时左侧都是打了红叉叉的,表示服务没有在运行,我们点击 Start 开启 Apache 和 MySQL 的服务
然后检查是不是模块的底色变成绿色,绿色表示已经启用
有可能会弹出防火墙,点击允许
默认情况下的端口,Apache 应该用的是 80 和 443,MySQL 用的是 3306
在浏览器输入 http://localhost
,应该就可以看到 XAMPP 的欢迎界面了
有可能浏览器会说不安全,这个以后再说,现在只是验证环境是否正常
如果是给出了安全性配置,可以一个一个点击添加,把这里的网址全部添加到白名单,也可以直接在服务控制台关闭 IESEC (不推荐)
吐槽
慢……出……了……新……的……下……限
然后点击 PHPInfo
,或者 http://localhost/dashboard/phpinfo.php
查看 PHP 也正常了
访问 http://localhost/phpmyadmin
能够进入 PHPMyAdmin,说明 MySQL 也正常
接下来测试配置文件,在命令提示符输入 cd C:\website\xampp\apache\bin
,然后输入 httpd -t
,看到测试通过,说明语法正确
接下来进行作业尝试
在 conf\
目录下复制 httpd.conf
为 myconf81.conf
和 myconf8.conf
安装不同的 Apache 服务器
由于端口号必须不同,所以打开 myconf81.conf
,修改其中的 Listen
端口号 80 为 81,保存退出
httpd.exe -k install -f .\conf\myconf81.conf -n myconf81
对于 82 也是一样的修改和安装过程
这里的 -n NAME
是一个名字,我就用了 myconf81
、myconf82
如此就算安装成功
如果已经安装成功,再次运行就会显示
然后利用 httpd.exe
验证上述 2 个配置文件是否存在语法错误
显然也是没有错误的
修改上述 2 个文件,使其中 1 个存在错误
可做 2 个尝试
可以把 DocumentRoot
后面的目录修改为 "C:/website/jxtxzzw"
,即一个不存在的目录
或者可以尝试一些语法错误,例如 Listen 82
修改为 Listening 82
然后尝试进行验证
期望的运行结果显然应该是被发现语法错误
分别是
和
也可以修改成其他的错误,然后再次验证
打开 apache\conf\httpd.conf
,加载 mod_dir
模块
确保这一行前面的 #
被删除
然后检查索引文件的优先级,越前面的优先级越高,反斜杠表示接续下一行
也可以解封自动索引
当用户访问目录,找不到索引文件的时候,列出目录下的相关文件
吐槽
在生产环境,强烈不推荐开着这个东西
应该直接给出 403 Forbidden
否则直接暴露真实目录结构会很危险
或者还有一种优雅的方式是直接重定向到首页
LoadModule autoindex_module modules/mod_autoindex.so
确保前面的 #
被删除了
吐槽
默认竟然是开着的
垃圾 Apache
吹爆 NGINX
下面开始作业部分
首先找到默认的根目录
默认是 DocumentRoot "C:/website/xampp/htdocs"
,那么可以直接在这个目录下面简历 mylove.htm
文件,然后尝试访问 http://localhost/mylove.htm
然后要求不指定目录下具体的文件就能访问
这意味着要把 mylove.htm
设置为默认索引,而且优先级可能要最高
在进行这一步之前,我们先把网站根目录转移到别的地方,以方便后面的管理
我在 C:\website\
下面建立了 wwwroot
目录,存放各大网站的根目录
一如我自己服务器上的文件结构
wwwroot
是各虚拟主机的根目录,wwwcert
是 SSL 证书,wwwlogs
是日志文件
由于现在没有域名什么的,所以丢在了 .\default
文件夹下面
那么在 Win Server 上需要做什么呢
修改以下两个地方
把刚才的 mylove.htm
复制到 C:\website\wwwroot\default\
下,然后重启 httpd
服务
浏览 http://localhost
应该可以看到了索引列表
接下来回到作业
设置默认索引
在配置文件中添加 mylove.htm
为最高优先级
重启 httpd
然后刷新页面,若文件存在,自动打开该文件,于是可以看到 mylove.htm
被自动加载
若文件不存在,则列出根目录下其他文件列表
这个不需要设置默认就是这个配置
为了测试,可以把这个文件删了,然后新建一些其他的文件/文件夹
关键的问题在于,文件不存在,则提示无权访问
也就是说 ,如果都没有在默认的索引文件中,那么,直接给出 403 Forbidden
在配置文件的这一行
删掉 Indexes
按照老师的说法,具体的操作是
不过有可能这样会导致修改以后重启 httpd
的时候出现问题
所以干脆删掉好了
反正 +Indexes
和 Indexes
是一个意思,而 -Indexes
和不写也是一样的
这时,配置文件变成了 Options FollowSymLinks Includes ExecCGI
,保存配置文件,然后重启 httpd
刷新浏览器,发现已经显示 403 Forbidden 了
这时候还不能掉以轻心
把 mylove.htm
复制回去,看看到底是只有默认索引不存在的时候禁止访问,还是所有情况都被禁止了
发现仍能够自动打开 mylove
页面
说明一切正常
作业完成
别名
前提是加载 mod_alias
模块
默认是加载的
下面开始作业部分
第 1 步是将 /website/data/web/webroot
作为根目录,同样的,修改 DocumentRoot
为 C:\website\data\web\webroot
在 website/data/web/mytest
中新建文件 test.htm
<p>这是一个别名的测试</p> <p>欢迎访问我的个人网站</p> <a href="https://www.jxtxzzw.com"> https://www.jxtxzzw.com </a>
当访问 http://localhost/yourtest/test.htm
时,实际访问 /website/data/web/mytest/test.htm
Alias 的设置的第一个参数是以 DocumentRoot
为根目录的 webpath
,而第二个参数并不是以根目录为基础的,而是完整的系统路径(FULL/FILESYSTEM/PATH
)
因此,修改方式为,在 <IfModule alias_module>
下面增加一行
Alias /yourtest C:\website\data\web\mytest
重启 httpd
,刷新,输入 http://localhost/yourtest/test.htm
,发生了令人意外的事情
禁止访问?
原因是在于,webroot
以外的目录被默认禁止了
这个设置是在这里写的
不推荐 Allow 整个 /
,所以,我们需要单独配置这个 mytest
目录的访问权限
<Directory "C:\website\data\web\mytest"> Options FollowSymLinks Includes ExecCGI AllowOverride All Require all granted </Directory>
重启服务,刷新,发现成功
端口和根目录相关的作业如下端口
号为 80 的已经好了,默认根目录就是上面设置的
下面就是要开一个 81 端口
首先复制 myconf81.conf
并打开
- 修改
Listen 81
- 修改
ServerName localhost:81
- 修改
DocumentRoot "C:/website/data/web/webroot1/" <Directory "C:/website/data/web/webroot1/">
然后进入 bin
目录,用 httpd -f
命令启动 81 端口的配置文件
c:\website\xampp\apache\bin>httpd -f .\conf\myconf81.conf
这时候可能会出错,说 443 端口被重复使用了
由于测试不需要 SSL,所以可以先禁用这个
在配置文件中
# Secure (SSL/TLS) connections Include conf/extra/httpd-ssl.conf
注释掉 Include conf/extra/httpd-ssl.conf
这一行
这时候输入 http://localhost:81
,就可以进入 81 端口对应的 wwwroot1
目录,可以看到目录下是空的,然后也可以看到 Apache 服务显示的 Server at localhost Port 81
在两个目录中新建一些文件用来测试
<p>这个文件叫做mylove.htm,是索引中优先级最高的,这个服务器运行在80端口</p> <p>欢迎访问我的个人网站</p> <a href="https://www.jxtxzzw.com"> https://www.jxtxzzw.com </a>
一切正常
目录访问权限
和1位搭档合作,你的操作客户端IP地址为ip1,搭档的是ip2
设置服务器的文档根目录(/):允许ip1访问,不允许ip2访问
设置服务器文档子目录(/mytest/):不允许ip1访问,允许ip2访问
提示:从服务器本机外的客户端访问,要注意服务器上的防火墙设置
由于我做这个作业的时候,还没有其他任何同学的进度比我快
所以没办法了
只能自己做,找不到可以合作的搭档
只能把自己的客户机,即我自己的电脑,作为 IP2,而服务器本身是作为IP1
首先,在客户机打开浏览器,输入我的服务器的IP地址,http://172.23.131.27
,发现可以访问
语法是这样的
在 <Directory "C:\website\data\web\webroot">
这个目录下
<RequireAll> Require all granted Require not ip MY_IP_2 </RequireAll>
这意思是,默认允许所有的 IP 访问,其中禁止 MY_IP_2 访问
这里有一个大坑
首先,我是查了自己本机的 IP
然后,我写了
<RequireAll> Require all granted Require not ip 222.66.117.91 </RequireAll>
却发现,不管是在服务器访问 http://localhost
还是在自己电脑访问 http://172.23.131.27
仍然可以访问
那么这个时候尝试禁用本机的 IP 呢?
例如
<RequireAll> Require all granted Require not ip 127.0.0.1 </RequireAll>
这是不是就是意味着从服务器访问 localhost
不能访问了?
因为禁用了 127.0.0.1
啊,也就是,本机的回环地址被禁用了
好像应该是这样一回事情
但是事实上,还是可以访问的,页面还是能打开
有点奇怪是不是?
那干脆再把 Require not ip 172.23.131.27
也禁用了吧
然而,还是可以访问
为什么不管怎么修改,在服务器访问 http://localhost
还是在自己电脑访问 http://172.23.131.27
仍然可以访问呢?
有点诡异是不是?
查一下访问日志
惊喜地发现,原来,根本不是用 127.0.0.1
回环地址的,也不是用 172.23.131.27
这个IP访问的
他用的是 IPv6 的 ::1
好的,那么大胆地修改成 not ip ::1
重启服务以后
终于不能访问了
那么,估计我的电脑也不是用 222 开头的那个 IP 去访问的
究其原因,可能是挂了 VPN 的缘故
222 是挂上 VPN 以后 WAN 的 IP,而 172 是LAN 的 IP
访问内网,用的肯定是 LAN 的 IP,所以应该禁用的是这个
在日志信息中可以看到,我其实是用 172.20.144.193
这个 LAN 口 IP 访问的,而不是 222.66.117.91
这个 IP 访问的
<RequireAll> Require all granted Require not ip 172.20.144.193 </RequireAll>
终于正常了
这个坑不可谓不大
但是我估计,如果是直接找了组队的队友,都是从服务器访问的,可能用的都是内网的 IPv4,就都没有问题了
或者不是挂 VPN 而是直接连校园网,那么估计也是用的内网 IP
我没有再尝试
但是如果校园网下,或者都是服务器,但是访问却没有经过 IPv4,那么可能就需要查 log,看看到底用的是什么奇怪的 IP(也许是 IPv6)访问的
这个问题解决了以后
设置服务器文档子目录(/mytest/):不允许ip1访问,允许ip2访问
这个作业也就简单了
不允许 IP1 访问,也就是不允许本机访问,从上面的分析可知,禁用 127.0.0.1
或者禁用 172.23.131.27
都是没用的,需要禁用 ::1
而允许 IP2 访问,granted
就可以了
<Directory "C:\website\data\web\webroot\mytest"> <RequireAll> Require all granted Require not ip ::1 </RequireAll> </Directory>
对于 IP1,也就是本机的 IP,localhost
可以访问,而 localhost/mytest
不能访问
对于 IP2,也就是客户机的 IP,自然可以访问 localhost/mytest
映射用户目录和日志控制比较简单,只需要按照提示解封相关模块,并且设置日志的存放目录、命名格式和循环条件即可,而且没有作业,从略