凯哥stack

Nginx+hexo建站小结

getting-better

准备工作

近期建立了自己的第一个博客网站,中间得到了很多小伙伴的帮助,同时也把整个过程在这里分享一下,个人选择域名申请+云主机模式,也有人选择CDN托管,总之各有好处,CDN托管省心,云主机则需要运行维护,稍麻烦一点,但是有折腾的乐趣,闲言少叙,准备工作:

  • 购买域名(各大共有云都有购买入口,华为云、阿里云、腾讯云等都不错,经常有活动,一般非抢手域名30-50元)
  • 购买云主机(1U/2G即可,一般够用,后期可续费扩容)
  • 工信部备案(一般云运营商都有入口,大概需要2周时间)
    当前的备案过程更加简单和方便,不需要邮寄特殊的幕布了,只要是白墙录制拍照即可完成,非常方便。

配置DNS解析

完成备案后,意味着网站记录在案,即可启用了,当然要在遵守互联网法律法规前提下运营才行。接下来就是配置DNS解析,即将网站绑定到具体IP地址,方式如下:

  • 前缀设置
    一般选择@,如本站直接解析kaige86.com,如果选择www,则解析www.kaige86.com,一般个人博客这两种比较常用。
  • 类型设置
    一般选择A,即IPv4地址,目前基本云主机都是IPv4地址,AAAA为IPv6地址,CNAME则指向另一个域名,如果要为已有其他网站托管博客更换域名,可以使用该设置。
  • IP地址设置
    填入云主机的公网IP即可,保存,网站即是可访问状态,内容则需要在云主机上启动网站服务才能提供。

部署网站服务

完成DNS解析后,只是将域名与IP绑定,在访问域名时可以寻找到主机,内容还需要在主机上建立服务才能提供,一般提供简单服务的有tomcat、apache、nginx,当然hexo server也可以,我的选择是hexo生成静态网页,然后使用nginx提供静态网页服务,这样简单快速。

编译nginx

nginx.org官网下载最新版本,到云主机,然后进行编译,编译非常简单,三步configure/make/make install

1
2
3
$ ./configure --prefix=/opt/nginx --with-http_ssl_module
$ make
$ make install

注意: 如果本机没有安装openssl,则需要安装以下opensll,否则配置会失败。一般我的习惯都是把nginx安装到非系统目录,如/opt/nginx,这样nginx被安装到/opt/nginx/sbin/nginx。

配置nginx

nginx安装完成后,在安装目录有4个文件夹:

  • conf 配置文件夹,内包含nginx.conf为默认的配置文件

  • html 简单demo网页

  • logs 日志文件夹,可以查看运行信息,其中access.log为访问日志,error.log为错误信息。

  • sbin nginx可执行文件所在文件

    配置简单测试例子(nginx默认配置,配置字段解释见注释):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # conf/nginx.conf
    server {
    listen 80; # ---监听80端口
    server_name kaige86.com; # ---网站名字

    #charset koi8-r;

    #access_log logs/host.access.log main;

    location / { # ---以根路径开始的访问规则
    root html; # ---根路径映射到nginx安装目录html子目录
    index index.html index.htm;
    }

    启动nginx(需要root用户权限):

    1
    $ ./sbin/nginx

    更改配置后,需要重启nginx服务:

    1
    $ ./sbin/nginx -s reload

    对了,云主机重启后,自动启动nginx,需要在/etc/rc.local最后增加如下配置:

    1
    /opt/nginx/sbin/nginx

    测试:
    浏览器打开网站http://kaige86.com,可以看到如下信息:

OK,到此位置,简单的静态网页服务就可用了,配置非常简单,而且nginx的性能非常高,还常常被用作API的负载均衡网关。

使用hexo

hexo是一款非常简单实用的博客网站工具,支持静态页面导出和网站server两种模式,我选择使用nginx作为网站服务,只使用静态页面导出功能,当然本地调试过程会使用hexo server查看效果。

安装

  • 安装nodejs v10以上版本
    nodejs官网下载二进制包直接安装或者源码包编译安装都可以,参考: https://nodejs.org/en/
  • 安装hexo
    1
    $ npm install hexo-cli -g
    参考: https://hexo.io/

配置

  • 创建博客

    1
    2
    3
    $ hexo init /opt/blog
    $ cd /opt/blog
    $ npm install

    blog目录即是博客模板框架了,只需要在source/_post/目录下创作markdown文档,即可发布了。
    简易配置参考: https://hexo.io/docs/configuration

  • 发布与调试

    1
    2
    3
    $ hexo clean       # 清理已经生成的网页数据
    $ hexo generate # 生成新的网页数据,生成在public文件夹下
    $ hexo server # 启动网站服务,用于调试

    在浏览器中访问http://127.0.0.1:4000即可看到效果了。

  • 更改主题
    hexo支持自开发主题或者使用他人的主题,本站使用的是geektutu主题,该主题博主已经开源,链接参考: https://github.com/geektutu/hexo-theme-geektutu

对接nginx

直接将nginx的root指向hexo生成的public即可:

1
2
3
4
location / {
root /opt/blog/public; # hexo 生成的网站数据
index index.html index.htm;
}

对于频繁刷新的博客,一般不建议这么做,因为这样在调试过程就会影响网站的访问,我的做法一般是新建另外一个目录/opt/nginx/public,hexo调试完成后在覆盖这里的目录,这样不影响网站正常访问。

1
2
3
4
location / {
root /opt/nginx/public; # 网站实时访问数据
index index.html index.htm;
}

写一个简单的更新脚本update.sh:

1
2
3
#!/bin/bash
rm -r /opt/nginx/public
cp -r /opt/blog/public /opt/nginx/

好了可以访问网站了。

部署ssl

一般静态网页使用http就可以了,https的优势是所有的访问都是加密的,尤其对一些涉及用户名密码的网站都使用https,如银行官方网站。为了追赶时髦呢,不妨尝试一下:

  • 申请证书
    在购买域名的运营商可以申请免费证书,如trust asia,申请很快,完成后可以下载证书文件,注意证书文件要妥善保存,内置公私密钥,尤其是私钥。
    证书文件解开后目录一般是这个格式:

    1
    2
    3
    4
    5
    6
    7
    -+- Apache
    +- IIS
    +- Nginx
    +- 1_www.example.com.crt
    +- 2_www.example.com.key
    +- Tomcat
    +- www.example.com.csr

    申请证书的好处除了可以加密网站浏览外,还可以对网站进行认证,即CA机构(这里是trust asia)对该网站进行了认证,浏览器地址栏显示一把安全锁。

  • 配置nginx
    在conf/nginx.conf配置文件的最后,有一段配置默认是注释的,nginx官网也有配置举例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    server {
    listen 443 ssl;
    server_name www.example.com;
    ssl_certificate cert/1_www.example.com.crt;
    ssl_certificate_key cert/2_www.example.com.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
    root /opt/nginx/public;
    }
    }

    将证书文件放在conf/cert(目录自行创建)。
    官网配置指导: http://nginx.org/en/docs/http/configuring_https_servers.html

  • 效果展示
    浏览器打开https://kaige86.com后,可以看到有安全锁标识:)

注意: 还没有完,当访问http://kaige86.com的时候自动跳转到https就完美了,万能的nginx当然有办法,可以配置重定向,直接将http网页重定向到https,配置如下:

1
2
3
4
5
server {
listen 80;
location / {
return 301 https://example.com$request_uri;
}

至此,基本完成配置,还有一些安全配置待优化。

安全

互联网上的各种试探和攻击不会停止,唯一能能做的就是做好个人防护。

1
2
3
2020/04/02 06:18:20 [error] 2295#0: *678 open() "/98k.php" failed (2: No such file or directory), client: 118.*.*.247, server: localhost, request: "POST /98k.php HTTP/1.1"
2020/04/02 06:18:20 [error] 2295#0: *678 open() "/981.php" failed (2: No such file or directory), client: 118.*.*.247, server: localhost, request: "POST /981.php HTTP/1.1"
2020/04/02 06:18:20 [error] 2295#0: *678 open() "/887.php" failed (2: No such file or directory), client: 118.*.*.247, server: localhost, request: "POST /887.php HTTP/1.1"

加固安全策略,由于使用静态网页,所有的浏览请求都是GET请求,禁止所有GET以外的请求访问,这样可以让那些人彻底死心,节省网站流量:

1
2
3
4
5
6
location / {
limit_except GET { # 除了GET以外其他请求全部禁用
deny all;
}
...
}

关闭后的效果:

1
2
3
2020/04/18 19:15:15 [error] 2004#0: *6159 access forbidden by rule, client: 39.*.*.11, server: www.kaige86.com, request: "POST /sdk HTTP/1.1"
2020/04/18 19:15:15 [error] 2004#0: *6159 access forbidden by rule, client: 39.*.*.11, server: www.kaige86.com, request: "POST /sdk HTTP/1.1"
2020/04/18 19:15:15 [error] 2004#0: *6159 access forbidden by rule, client: 39.*.*.11, server: www.kaige86.com, request: "POST /sdk HTTP/1.1"

关闭nginx错误信息返回时,隐藏返回nginx版本号:

1
2
3
server {
listen 80;
server_tokens off; # 隐藏nginx版本号

关闭后返回效果:

1
2
3
4
5
6
7
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx</center>
</body>
</html>

至此已经完成了网站部署,如果大家有更好的建议可以在下面回复,喜欢的小伙伴点个赞吧:)


专题:

本文发表于 2020-04-18,最后修改于 2020-04-21。

本站永久域名kaige86.com,也可搜索「 凯哥stack 」找到我。

期待关注我的 ,查看最近的文章和动态。


上一篇 « 苹果和谷歌联手打造新冠接触者追踪应用? 下一篇 » 新冠接触者追踪(二) -- 苹果和谷歌的技术草案

推荐阅读

Big Image