11月07, 2016

从零开始创建一个BLOG

之前基于Flask写了一个Blog小程序(microtype),由于实习已无精力去维护添加新功能(其实是懒,所以在找一个符合自己需求的程序从头开始的创建一个BLOG。本篇文章记录了从需要用到的中间件安装到部署web应用程序的整个过程。

firekylin是360奇舞团维护的一个基于ThinkJS 2.0 & ReactJS & ES2015+的简单快速博客平台。

正好非常符合自己的需求,所以就采用了这个程序。

目录

安装依赖

  1. 平台:阿里云国际
  2. 系统:Debian 7

安装相关的编译工具

因为编译nginx需要用到gcc libpcre zlib还有需要从git上面clone代理所以我们要安装这些包

apt-get install build-essential libpcre3 libpcre3-dev zlib1g-dev unzip git

安装 nginx 相关组件

下载 openssl

因为之前的站点就采用了let's encrypt的ecc证书以及Debian 7自带的openssl版本较老,所以我们需要自己下载openssl.

wget -O openssl.tar.gz -c https://www.openssl.org/source/openssl-1.1.0b.tar.gz

下载nginx

因个人使用这里就下载官网最新版本的nginx

wget -c http://nginx.org/download/nginx-1.11.5.tar.gz

编译安装nginx

接下来我们就开始安装nginx了,在这里我们开启HTTP/2模块。

#解压openssl
tar zxf openssl.tar.gz
#解压nginx
tar zxf nginx-1.11.5.tar.gz
#配置nginx编译参数,开启HTTP/2必备模块,gzip静态文件压缩
cd nginx-1.11.5
./configure --with-openssl=../openssl-1.1.0b --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module
#有error的话自己google...
make && make install

到此 nginx 安装完毕

安装mariadb

mariadb是一个MySQL的分支兼容MySQL,貌似运行速度更快所以用这个。。

添加 mariadb 源

apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db

add-apt-repository 'deb [arch=amd64,i386] http://mirrors.tuna.tsinghua.edu.cn/mariadb/repo/10.1/debian wheezy main'

apt-get update
apt-get install mariadb-server

按照流程配置MySQL密码。

创建web应用程序使用的数据库账号密码

#使用root登录
mysql -uroot -p
#创建新的db
CREATE DATABASE blog;
#创建新db用户
CRATE USER 'blog'@'localhost' IDENTIFIED BY 'password';
#授予新db用户blog库权限
GRANT ALL PRIVILEGES ON blog.* TO 'blog'@'localhost';
#刷新权限表
FLUSH PRIVILEGES;

部署代码

创建相关用户

为了降低应用被日的情况下直接被拿到最高权限,我们需要创建一个普通用户去跑web应用程序, 并将他加入 sudoers

#添加用户并添加一个附属组sudo
adduser lazydog
usermod -G sudo lazydog

为何加入sudo组里面这边因为sudoers里面文件已经写好了相关的配置我们就不需要使用 sudoedit 去重复劳动了

alt

安装nodejs

su - lazydog
sudo apt-get install nodejs
#这里可能需要自己手动安装npm(nodejs 包管理器)
sudo apt-get install npm

获取应用源代码

从github获取firekylin源代码

#新建一个目录
cd ~ && mkdir www
cd www
wget -c http://firekylin.org/release/firekylin_0.12.9.tar.gz
tar zxf firekylin_0.12.9.tar.gz

lazydog@iZj6c2wgxq1l7dxdkl15piZ:~/www$ ls -lh
total 1.5M
drwxr-xr-x 7 lazydog lazydog 4.0K Nov  6 23:38 firekylin
-rw-r--r-- 1 lazydog lazydog 1.5M Oct 16 10:12 firekylin_0.12.9.tar.gz

初始化应用

接着我们要安装应用相关依赖

cd firekyline
#会根据package.json自动安装依赖
npm install
#安装完成后相关依赖会被放到./node_module中

接着我们要安装 pm2 一个类似supervisor进程管理工具

sudo npm install -g pm2
cp pm2_default.json pm2.json
#更改应用pm2配置文件,可根据自己需求定制,这里修改个cwd地址为应用程序目录
vim pm2.json
{
  "apps": [{
    "name": "blog",
    "script": "www/production.js",
    "cwd": "/home/lazydog/www/firekylin",
    "exec_mode": "fork",
    "max_memory_restart": "512M",
    "autorestart": true,
    "node_args": [],
    "args": [],
    "env": {
    }
  }]
}
#运行app
pm2 start pm2.json
#如果需要自己程序监听port可以在项目目录下面新建一个port文件并放入想要监听的端口
touch port
echo 8888 > port

启动完毕,初始化站点就不在赘述。

alt

使用SSL

Let's Encrypt是一个免费、自动化、开放的证书签发服务。。然而只有90天有效期,但是我们可以通过自动化的工具去续约从而达到无限使用的目的。

获取acme.sh

Let's Encrypt官方提供的工具很难用。这里我们使用acme.sh来快捷的申请我们的证书。

#安装acme.sh
curl https://get.acme.sh | sh
#安装完成就会创建一个cronjob, 每天0点时为你检查证书是否快过期,如果快过期了(60天)就会自动申请。很强大有木有~

接下来我们就要利用这个工具去申请证书了,这里因为我用的是cloudxns的api所以先去找到自己的api key填入acme.sh的account.conf中. API管理

接着编辑account.conf

vim /root/.acme.sh/account.conf

修改44 46行的key 修改44 46行的key 接着申请证书

#将你需要用到ssl的域名全部写入进去
/root/.acme.sh/acme.sh --issue --dns dns_cx -d lazydog.me -d www.lazydog.me -d eyeadmin.lazydog.me -d cn.lazydog.me -k ec-256

安装证书

然后就是安装证书,可根据自己的实际情况改写命令

/root/.acme.sh/acme.sh --installcert -d lazydog.me --keypath /home/lazydog/www/ssl/lazydog_me.key --fullchainpath /home/lazydog/www/ssl/lazydog_me.cer --reloadcmd "/usr/local/nginx/sbin/nginx -s reload" --ecc

最后就是配置nginx ssl站点了,这里贴一个我的配置。建议可以围观下Jerry Qu大神的博客。。

server {
    listen               443 ssl http2;

    server_name          www.lazydog.me lazydog.me;
    server_tokens        off;

    # 中间证书 + 站点证书
    ssl_certificate      /home/lazydog/www/ssl/lazydog_me.cer;

    # 创建 CSR 文件时用的密钥
    ssl_certificate_key  /home/lazydog/www/ssl/lazydog_me.key;

    # openssl dhparam -out dhparams.pem 2048
    # https://weakdh.org/sysadmin.html
    ssl_dhparam          /home/lazydog/www/ssl/dhparams.pem;

    # https://github.com/cloudflare/sslconfig/blob/master/conf
    ssl_ciphers                EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers  on;

    ssl_protocols              TLSv1 TLSv1.1 TLSv1.2;

    ssl_session_cache          shared:SSL:50m;
    ssl_session_timeout        1d;

    ssl_session_tickets        on;

    ssl_stapling               on;
    ssl_stapling_verify        on;

    # 根证书 + 中间证书
    # https://imququ.com/post/why-can-not-turn-on-ocsp-stapling.html
    ssl_trusted_certificate    /home/lazydog/www/ssl/fullchain.pem;

    resolver                   223.5.5.5 valid=300s;
    resolver_timeout           10s;

    access_log                 /home/lazydog/www/nginx_log/lazydog_me.log;
    root /home/lazydog/www/firekylin/www;
    charset utf-8;
    set $node_port 8360;
    if ($request_method !~ ^(GET|HEAD|POST|OPTIONS)$ ) {
        return           444;
    }

    if ($host != 'lazydog.me' ) {
        rewrite          ^/(.*)$  https://lazydog.me/$1 permanent;
    }

    location ~* (robots\.txt|favicon\.ico|crossdomain\.xml)$ {
        root             /home/lazydog/www/firekylin/www/static;
        expires          1d;
    }

    #xss
    location ^~ /xss/ {
        proxy_pass_header Server;
        proxy_pass http://localhost:8888;
        proxy_set_header X-Real-Ip $remote_addr;
    }

    location ^~ /static/uploads/ {
        add_header       Access-Control-Allow-Origin *;
        set              $expires_time max;
        expires          $expires_time;
    }

    location ^~ /static/ {
        add_header       Access-Control-Allow-Origin *;
        expires          max;
        etag             on;
    }


    location / {
        proxy_http_version       1.1;

        add_header               Strict-Transport-Security "max-age=31536000;";
        add_header               X-Frame-Options deny;
        add_header               X-Content-Type-Options nosniff;
        add_header               Cache-Control no-cache;

        proxy_ignore_headers     Set-Cookie;

        proxy_hide_header        Vary;
        proxy_hide_header        X-Powered-By;

        proxy_set_header         X-Via            INTL.ecs_hk;
        proxy_set_header         Host             lazydog.me;
        proxy_set_header         X-Real_IP        $remote_addr;
        proxy_set_header         X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:$node_port$request_uri;
        proxy_redirect off;
    }
}

server {
    server_name       www.lazydog.me lazydog.me;
    server_tokens     off;

    access_log        /dev/null;

    if ($request_method !~ ^(GET|HEAD|POST)$ ) {
        return        444;
    }

    location / {
        rewrite       ^/(.*)$ https://lazydog.me/$1 permanent;
    }
}

配置完毕

配置完毕后,重启nginx接着访问看效果 alt

本文链接:https://lazydog.me/post/create-a-blog-step-by-step.html

-- EOF --

Comments