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即可。如下所示:

# 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>块,按如下内容进行修改替换:

<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,然后确保该配置下的项符合如下所示:

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端口)。主要语句是下面这三行:

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

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

<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>这一段前面,加上下面的内容:

<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目录下),输入:

echo >.htaccess

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

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

ErrorDocument 404 /404.html
ErrorDocument 403 /403.html

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

robots.txt文件配置

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

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搜索定位到如下位置:

<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文件:

<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)

谢谢!

One thought on “Windows服务器博客搭建实录

  1. CC BY-ND:知识共享,署名-禁止演绎,意思是转载此作品时要附上原作者名称等信息且转载时不能修改原内容。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注