Windows服务器博客搭建实录

Windows服务器博客搭建实录

2020/12/13日 晴转阴
国家公祭日,早上还有太阳呢,中午天已经黑了,据说今晚将要迎来南京的初雪。

限制与前序工作

今天记录的是博客的搭建方式,我们的博客计划搭载在Windows服务器上。这篇文章将介绍遵守法律的博客搭建方式,不推荐通过“特殊手段”获取到公网IP后非法地搭建(事实上这种方式获取的公网IP,80、443等端口也不会被开放出来)。在开始之前,我们有一些前序工作需要准备好。

  1. 购买云服务器(腾讯云、华为云、阿里云、AWS(海外)、Azure(海外)…都提供云服务)。云服务器选择的操作系统为Windows Server 2016 数据中心版。地区选择距离近的地方,这样延迟会低一些,例如,我在南京,选择的上海的服务器。
  2. 购买域名,使用国内的服务器及从国内域名服务商处购买需要实名和备案。
  3. 域名解析,将域名解析到云服务器的公网IP地址上。
  4. HTTPS的SSL加密签名(可选)。

以上是搭建前的前序准备工作,一般较大的云服务提供商都有完备的教程文档可以参考。

环境安装

服务器环境:Windows Server 2016 数据中心版 64位系统。云服务器建议至少满足2核CPU、4G内存、3M带宽,比这个限度低可能会影响体验。

Wampserver:https://sourceforge.net/projects/wampserver/

WordPress:https://wordpress.org/download/

Wampserver强依赖于VC9(VS2008SP1)(部分功能需要使用,本篇中非必须安装)、VC10(VS2010SP1)、VC110(VS2012)、VC120(VS2013)和VC14x(VS2015-VS2019)运行库,在安装Wampserver前需要安装运行时环境发布包。下载链接可参考博客《Microsoft Visual C++ 运行时发布包下载链接》一篇。

安装Wampserver,安装完成后会在桌面添加一个Wampserver图标,双击图标运行,桌面右下角会出现一个角标,等角标的颜色变绿,说明Wampserver能正常工作,如果由红色变为橙色,没有变绿,检查是否有其他进程或服务占用了80端口(查看端口是否被占用:在CMD控制台下输入netstat -ano),右键角标退出Wampserver,关闭其他占用80端口的进程或服务后再重启Wampserver。

在浏览器内输入http://localhost/,出现Wampserver的测试网页且显示正常即表明Wampserver能正常使用。

删除Wampserver安装目录下www文件夹内的文件,将WordPress解压到www文件夹下,确保www文件夹下有WordPress的index.php文件。www文件夹是网页显示的根文件夹。

到此,我们的环境准备工作完成啦。

外网访问配置

wampserver默认不允许外网访问,那么我们通过域名绑定主机IP后,也无法直接访问服务器上的网页(访问域名会显示:Forbidden. You don’t have permission to access this resource.)。我们需要先配置允许外网访问。

依次操作:左键wampserver角标 -> Apache -> httpd-vhosts.conf,将Require local改为Require all granted即可。如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
# Virtual Hosts
#
<VirtualHost *:80>
ServerName localhost
ServerAlias localhost
DocumentRoot "${INSTALL_DIR}/www"
<Directory "${INSTALL_DIR}/www/">
Options +Indexes +Includes +FollowSymLinks +MultiViews
AllowOverride All
#Require local
Require all granted
</Directory>
</VirtualHost>

数据库配置

左键wampserver角标,点击phpMyAdmin打开数据库管理后台,默认的初始用户名为root,密码为空,我们的服务器接了公网,为了安全考虑,务必要修改一个强口令。

创建一个数据库,名称可以随意,该数据库将用来在WordPress初始化时进行配置。

博客配置

WordPress有非常友好的Web化UI配置控制面板,我们直接输入域名即可进入WordPress的配置界面,我们前面创建的数据库将在这里被使用,其他的按照WordPress的向导就能完成安装啦。

数据库的配置中有一项叫“数据表前缀”,我们可以更改前缀的名字(非默认设置)来加强博客数据库的安全性。

安装完成后,网页会自动跳到WordPress的后台控制面板上,我们可以在这里自定义我们的博客网站。

WordPress支持插件系统,通过插件我们可以拓展博客的许多功能:

  • 博客Markdown编辑:WP HyperMD (2021年9月20日:换了WP Githuber MD,显示效果比之前的更好)
  • 博客安全:WordFence
  • 博客邮件服务:WP Mail SMTP
  • 博客评论后邮件回复:Comment Reply Email Notification
  • 防垃圾评论:Akismet
  • 博客加速缓存:WP Super Cache

SSL传输加密(通过https访问)

该选项是可选项,申请一个证书,让网站内容通过SSL加密连接,可以防止网站信息明文在网络中传输,防止有意人的抓包窥视。

在申请SSL的地方下载证书文件,Wampserver的服务器是Apache,我们只需要Apache证书即可。如果我们的网站期望在有无www.的前缀下(www解析和@解析)都采用SSL加密,需要申请并安装两个证书。

在服务器主机上找到Wampserver的安装路径并进入,然后再进入bin/apache/apache[版本号]下,这里就是Apache服务的根路径下啦,在这里新建一个名为cert的文件夹,把证书文件拷到cert文件夹内。

打开Apache根路径下conf/extra/httpd-ssl.conf文件,找到<VirtualHost *:443>...</VirtualHost>块,按如下内容进行修改替换:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<VirtualHost *:443>
# 修改为申请证书时绑定的域名(需要修改)
ServerName example.com
# 网页根路径(如果不放在默认位置需要修改)
#DocumentRoot "${INSTALL_DIR}/www"
# 打开SSL引擎
SSLEngine on
# 添加SSL协议支持协议,去掉不安全的协议
SSLProtocol all -SSLv2 -SSLv3
# 修改加密套件
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
SSLHonorCipherOrder on
# 替换成申请到的证书文件(需要修改)
SSLCertificateFile cert/domain_name.crt
SSLCertificateKeyFile cert/domain_name.key
SSLCertificateChainFile cert/domain_name_chain.crt
# Logs
ErrorLog "${SRVROOT}/logs/error.log"
TransferLog "${SRVROOT}/logs/access.log"
</VirtualHost>

左键wampserver角标 -> Apache -> httpd.conf,找到LoadModule ssl_module modules/mod_ssl.soInclude conf/extra/httpd-ssl.conf两行并解注释(删掉前面的#)。

到这里,重启Wampserver服务器,发现服务器变橙色了!!!

运行Wampserver的Tools里的Check http.conf syntax发现报错:

“Syntax error on line 76 of C:/apache/conf/extra/httpd-ssl.conf:SSLSessionCache: ‘shmcb’ session cache not supported (known names: ). Maybe you need to load the appropriate socache module (mod_socache_shmcb?).”

这是由于cache_shmcb模块没有被加载导致的,在httpd.conf中搜索LoadModule socache_shmcb_module modules/mod_socache_shmcb.so,然后发现该模块默认没有被Wampserver打开,我们把它解注释,去掉#,再重启一次Wampserver的所有服务。这次应该能启动成功啦。

我们来尝试将域名前面的http换成https,使用https来进行访问,发现访问出错,出现之前一开始的Forbidden 403错误了,修复手段是在httpd.conf中搜索DocumentRoot,然后确保该配置下的项符合如下所示:

1
2
3
4
5
6
DocumentRoot "${INSTALL_DIR}/www"
<Directory "${INSTALL_DIR}/www/">
Options +Indexes +FollowSymLinks +Multiviews
AllowOverride all
Require all granted
</Directory>

不必理会注释里头写的“Don’t modify this line - Instead modify Require of VirtualHost in httpd-vhost.conf”,这个问题的原因就是httpd-vhost.conf中没有https相关的配置,没法重写配置项导致的。再次重启Wampserver服务器(重启多少遍了(::A_A::))。

到这里,我们能够通过https来加密访问啦!

接下来是可选的,配置将http访问转发为https访问,左键wampserver角标 -> Apache -> httpd-vhosts.conf,没错,这次我们又要对httpd-vhosts.conf做改动啦,上次是在做外网访问配置的时候。这次我们在Directory项中加入重写的配置,这样http的访问(80端口)会被重写引擎重写为https的访问(443端口)。主要语句是下面这三行:

1
2
3
RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.*)?$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

修改完后的httpd-vhosts.conf文件,我们再来看一看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<VirtualHost *:80>
ServerName localhost
ServerAlias localhost
DocumentRoot "${INSTALL_DIR}/www"
<Directory "${INSTALL_DIR}/www/">
RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.*)?$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
Options +Indexes +Includes +FollowSymLinks +MultiViews
AllowOverride All
#Require local
Require all granted
</Directory>
</VirtualHost>

Ok,到此我们完成了访问网页带SSL传输加密的设置。

服务器配置仅允许指定域名访问网站

该配置用于防止恶意域名绑定到我们的服务器上,同时也阻止直接通过IP地址的访问。

上一节我们做了SSL传输加密,将80端口的http链接重新修改到了443端口的https链接,因此,我们这一节的配置将在httpd-ssl.conf文件中进行修改。如果没有做SSL传输加密,访问的还是http的80端口,那么直接在httpd-vhosts.conf文件中修改就可以啦。本节主要记录做了SSL传输加密的修改方法,其实原理是相通的,弄清楚了配置原理,自然就可以灵活运用。

先来说一说原理吧,原理其实很简单,就是先配置 一个虚拟主机,这个虚拟主机以localhost作为虚拟主机服务器的名字,定向到恶意劫持的页面下,然后再配置一个我们的网站真正的虚拟主机,以我们申请购买到的域名作为虚拟主机服务器的名字,定向到我们的网站页面下。这样,当其他人将域名绑定到我们的IP上或是直接通过IP进行访问时,由于与我们配置的虚拟主机的服务器的域名不相符合,就会走到localhost的虚拟主机配置上,而localhost此时指向的是恶意劫持的页面,这样展现给浏览者的,就是“当前页面被劫持了,欢迎联系我们进行反馈哦”~~

接下来回到实现,假设我们已经做好了一个被恶意劫持后用于显示的页面。首先在我们的网站根目录下(www目录)新建一个名为err的文件夹(名称可以随意,取该名字仅是为了方便文档编写),然后将被恶意劫持后用于显示的页面放到该文件夹下。

最后修改httpd-ssl.conf文件,在我们之前修改的<VirtualHost *:443> ServerName example.com ... </VirtualHost>这一段前面,加上下面的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
<VirtualHost *:443>
ServerName localhost
DocumentRoot "${INSTALL_DIR}/www/err" # 这里用到了前面新建的err文件夹
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
SSLHonorCipherOrder on
SSLCertificateFile cert/domain_name.crt # 替换成申请到的证书文件(此处需要修改)
SSLCertificateKeyFile cert/domain_name.key # 替换成申请到的证书文件(此处需要修改)
SSLCertificateChainFile cert/domain_name_chain.crt # 替换成申请到的证书文件(此处需要修改)
ErrorLog "${SRVROOT}/logs/error.log"
TransferLog "${SRVROOT}/logs/access.log"
</VirtualHost>

重启Wampserver服务器,我们的设置就生效了,试试用IP直接登陆,被定向到被恶意劫持后显示的页面啦。

(还是提供了配置方法参考,参见“附录3:服务器配置仅允许指定域名访问网站(非https访问)”一节)

404/403页面设置

默认的404/403页面会把服务器的一些信息显示出来,不安全且对访问者不够友好,我们可以自己写一个404/403页面,然后将错误的访问引导到这个页面来显示。

htaccess文件是Apache服务器中的一个配置文件,负责网页的一些配置:通过htaccess文件,我们可以实现网页重定向、自定义错误页面、改变文件扩展名、允许或阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

WordPress安装完后的根目录下默认会带该文件,直接打开追加编辑就可以,如果不带该文件,我们也可以自己来创建。

由于htaccess文件的全名是.htaccess,不能直接创建,我们用CMD来创建它。Win+R打开运行,然后输入cmd进入命令行窗口,cd到我们的网页的根目录下(默认就是Wampserver的安装目录的www目录下),输入:

1
echo >.htaccess

创建该文件,然后删除文件内的数据(安装WordPress带入的htaccess文件,不需要删除文件内的数据)。

我们打开文件,追加写入404/403的页面位置:

1
2
ErrorDocument 404 /404.html
ErrorDocument 403 /403.html

重启Wampserver服务后就能生效啦。

robots.txt文件配置

robots.txt文件用于限制搜索引擎的爬取蜘蛛对于网站的爬取行为,我们希望搜索引擎的最小检索间隔是60秒,不去检索网站根路径下的bin、err和css、js文件夹内的文件,那么robots.txt可以如下设置:

1
2
3
4
5
6
User-agent: *
Crawl-delay: 60
Disallow: /bin/
Disallow: /err/
Disallow: /css/
Disallow: /js/

robots.txt文件必须放在网站的根目录内,且必须全小写。现在也有不少的在线robots生成器,可以快速生成robots.txt文件,搜一搜就能发现啦。

附录1:调整默认首页的顺序

依次操作:左键wampserver角标 -> Apache -> httpd.conf,编辑配置文件: Ctrl+F搜索定位到如下位置:

1
2
3
<IfModule dir_module>
DirectoryIndex index.php index.php3 index.html index.htm
</IfModule>

DirectoryIndex列表项决定了默认首页的名称及类型。排在前面的默认加载的优先级高,修改该列表可以修改优先级、添加新的默认加载页或删除默认加载页。

WordPress默认的主页为index.php,是优先级最高的加载项,一般情况下我们不需要修改。但是针对想制作自己的html首页,然后再跳转到博客页的情况,需要进行修改。

附录2:其他安全策略(安全组与出入站规则)

部分的云服务器提供商提供了安全组策略,我们可以通过配置安全组并绑定主机来设定开放的端口(入站规则和出站规则),当然如果云服务器提供商不提供该服务的话,我们也能通过Windows Server的防火墙来设置相应的规则,只开启部分需要的端口,关闭不用的端口来确保服务器主机的安全。

对于一般的网站服务器,通常只需要开放22(SSH远程登陆)、80(http)、443(https)、3389(Windows远程控制)端口和ICMP协议(ping)端口。

附录3:服务器配置仅允许指定域名访问网站(非https访问)

前面我们已经提过了原理啦,这里直接上实现。修改httpd-vhosts.conf文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<VirtualHost *:80>
ServerName localhost
ServerAlias localhost
DocumentRoot "${INSTALL_DIR}/www/err" # err文件夹下存放被恶意劫持后用于显示的网页
<Directory "${INSTALL_DIR}/www/err/">
Options +Indexes +Includes +FollowSymLinks +MultiViews
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName example.com # 自己的域名
ServerAlias example.com # 自己的域名
DocumentRoot "${INSTALL_DIR}/www"
<Directory "${INSTALL_DIR}/www/">
Options +Indexes +Includes +FollowSymLinks +MultiViews
AllowOverride All
Require all granted
</Directory>
</VirtualHost>

协议

本文遵循CC BY-ND 4.0协议,署名-禁止演绎。

转载请注明出处:https://tis.ac.cn/blog/kongdeyou/Windows服务器博客搭建实录/
并署名:kongdeyou(tis.ac.cn/blog/kongdeyou)

谢谢!

原始链接:https://blog.kdyx.net/blog/kongdeyou/windows%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA%E5%AE%9E%E5%BD%95/

版权声明: "CC BY-NC-ND 4.0" 署名-不可商用-禁止演绎 转载请注明原文链接及作者信息,侵权必究。

×

喜欢或有帮助?赞赏下作者呗!