写于 2018.02.19html
做为一个前端开发工程师,天天和浏览器、业务代码打交道,对于“前端”的概念算是比较熟悉了,主流的框架、工具等都能玩得转,但总以为本身一直都被禁锢在小小的所谓“前端”的圈子中——由于除此以外的知识点仍是比较薄弱的。前端
后来在公司里面得到了一个轮岗的机会,进入到了运维团队去学习,眼界也开阔了不少,对于自身水平的认识也更加深刻,火烧眉毛想要提高本身“前端知识”之外的技能树。node
因为运维团队常常会跟服务器打交道,那么我何不干脆就从服务器开始,好好折腾一遍呢?nginx
曾经考虑过购买腾讯云或者阿里云等国内服务器,可是因为国内总所周知的缘由,许多资源的下载要么特别慢,要么干脆直接跪了,动不动就要切换源。同时若是域名绑定了国内的服务器,都须要进行备案,实在是无比麻烦。毫无疑问,我最终选择了国外的服务器,世界瞬间就清净了……git
关于国外的服务器选购,是见仁见智的事情,我选购的是一台搬瓦工20G KVM服务器,5美圆/月,买了不吃亏买了不上当,而后安装了Centos 7 x86_64 bbr系统,接下来就能够愉快地玩耍了。github
搭个什么服务都好,总不能让别人背本身的ip,若是可以拥到一个拉风的域名仍是很赞的。因而我就去万网,直接以本身的英文名字jrainlau
申请了一个jrainlau.com
域名,一年才55块RMB,真的超值哦~web
很简单的下单、支付,而后我就拥有了本身的专属域名,接下来就是进行DNS解析了。npm
进入阿里云的控制台,找到云解析DNS
,点进去就能看到咱们的域名解析信息了。添加两条类型为A
的记录,通通指向服务器的ip地址便可:浏览器
在域名解析生效前的10分钟里面,足够咱们在服务器上配置好Nginx了。安全
首先ssh登陆服务器:
ssh root@xxx.xxx.xxx.xxx -p yyyy
复制代码
输入搬瓦工提供的登陆密码以后,顺利登入。
可是若是每次登陆服务器都要输入一遍那乱码般的密码,是很痛苦的一件事,因此果断使用ssh-key来实现免密登陆。
ssh-keygen -t rsa
复制代码
按照提示选择秘钥所存放的目录(~/.ssh/
),密码留空,最后能够在设定的目录里找到生成的秘钥:ssh-copy-id root@xxx.xxx.xxx -p yyyy
复制代码
而后按照提示输入一遍密码就能够了。之后想要登陆服务器就能够直接免密登陆啦!作完刚才的“分支任务”,回到咱们配置Nginx的主线。
按照Nginx官网的文档,在CentOS中安装Nginx是很是简单的:
yum install -y nginx
复制代码
可是在实际操做中,却发现一直提示No package nginx available
。搜了一圈,Stack Overflow里面的回答都是由于可能没有安装epel
,因而立刻尝试之:
yum install -y epel-release
复制代码
奇怪的是,运行结果提示epel已经存在,为nothing to do。而后当我尝试安装nginx的时候,发现仍是no package nginx available。尝试列出yum全部的源,发现根本没有epel源:
yum repolist
源标识 源名称 状态
base/7/x86_64 CentOS-7 - Base 9,590+1
extras/7/x86_64 CentOS-7 - Extras 388
updates/7/x86_64 CentOS-7 - Updates 1,922+7
复制代码
后来通过一番折腾,才找到解决办法:
# 首先进入/yum.repos.d目录
cd /etc/yum.repos.d
# 而后编辑epel.repo文件
vi epel.repo
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch/debug
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1
[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
#baseurl=http://download.fedoraproject.org/pub/epel/7/SRPMS
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1
复制代码
能够看到,[epel]
和[epel-source]
里面的enabled
都是0,解决办法就在这里,只要把0改为1,保存退出后便可。
如今咱们从新运行yum repolist
,会发现epel源已经被加上了:
源标识 源名称 状态
base/7/x86_64 CentOS-7 - Base 9,590+1
elrepo-kernel ELRepo.org Community Enterprise Linux Kernel Repository - el7 37
epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 12,277
epel-source/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 - Source 0
extras/7/x86_64 CentOS-7 - Extras 388
nodesource/x86_64 Node.js Packages for Enterprise Linux 7 - x86_64 22
updates/7/x86_64 CentOS-7 - Updates 1,922+7
repolist: 24,236
复制代码
再执行yum install -y nginx
,发现终于可以成功安装了!
nginx version: nginx/1.12.2
复制代码
接下来只要用一条指令便可开启nginx:
nginx
复制代码
通过上面的一番折腾,域名的DNS解析早已生效了,此时输入域名并回车,就能看到nginx的欢迎页啦~
看到左上角“不安全”三个字,内心是很是不爽的,因而立刻进行下一步工做,上HTTPS。
因为是我的服务器,因此免费证书已经足够了,另外为了方便起见,因此我使用了certbot
这个工具来帮我把服务器升级成HTTPS。
首先经过yum下载安装certbot
:
yum install certbot
复制代码
因为certbot服务器在验证域名的时候,会经过HTTP的方式访问一个由certbot生成的静态文件,因此咱们首先要在nginx里面进行配置:
进入/etc/nginx
,而后编辑nginx.conf
,在server
里面添加下列两个location规则:
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /usr/share/nginx/html;
}
location = /.well-known/acme-challenge/ {
return 404;
}
复制代码
能够看到,上面的root
我是指向了/usr/share/nginx/htm
,这个目录是能够随便指定的,我这么写彻底是为了偷懒。
nginx配置好了之后,就可使用certbot生成证书了:
# certbot certonly --webroot -w <root url> -d <hostname>
certbot certonly --webroot -w /usr/share/nginx/html/ -d xxxx.com
复制代码
若是看到下列的输出,就证实证书已经生成成功了:
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/xxxx.com/fullchain.pem. Your cert
will expire on 20XX-09-23. To obtain a new or tweaked version of
this certificate in the future, simply run certbot again. To
non-interactively renew *all* of your certificates, run "certbot renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le 复制代码
证书已经准备好了,咱们还须要nginx的支持。从新打开/etc/nginx/nginx.conf
,而后把注释掉的https server给注释回来:
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name xxxx.com;
root /home/www;
ssl_certificate "/etc/letsencrypt/live/xxxx.com/fullchain.pem";
ssl_certificate_key "/etc/letsencrypt/live/xxxx.com/privkey.pem";
ssl_trusted_certificate /etc/letsencrypt/live/xxxx.com/chain.pem;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
复制代码
ps: 上面的root我给配置了
/home/www
目录,意味着之后只要是放在该目录下的静态资源文件夹,我均可以经过https://xxx.com/文件夹名
直接进行访问,更多关于nginx的配置请参考官方文档。
最后重启一下nginx,就能够检验咱们的页面是否已经打上小绿标了:
nginx -s reload
复制代码
因为certbot所使用的letsencrypt证书只有90天的有效期,因此咱们须要对它按期自动更新。
首先模拟更新:
sudo certbot renew --dry-run
# 看到以下输出证实模拟更新成功
-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/your.domain.com.conf
-------------------------------------------------------------------------------
** DRY RUN: simulating 'certbot renew' close to cert expiry
** (The test certificates below have not been saved.)
Congratulations, all renewals succeeded. The following certs have been renewed:
/etc/letsencrypt/live/xxxx.com/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
** (The test certificates above have not been saved.)
复制代码
而后就可使用crontab -e
命令来实现自动化了:
sudo crontab -e
#添加配置,每周一半夜3点00分执行renew:
00 3 * * 1 /usr/bin/certbot renew >> /var/log/le-renew.log
复制代码
服务器已经准备了,HTTPS也弄好了,那么接下来就能够部署咱们的静态页面与nodejs项目了。
从前面的nginx配置能够知道,nginx对于域名为xxxx.com
的请求,都会请求到/home/www
目录下,因此咱们经过git或者scp等方式把静态资源目放置在/home/www
目录下便可。比方说个人markcook项目:
cd /home/www
git clone https://github.com/jrainlau/markcook -b gh-pages
复制代码
此时访问 jrainlau.com/markcook 便可访问到项目的页面。
对于nodejs项目,咱们使用pm2
来守护进程,让项目在后台运行。首先须要安装nodejs,而后再安装pm2:
curl -sL https://rpm.nodesource.com/setup_9.x | bash -
yum install nodejs
npm i pm2 -g
复制代码
接下来依然把nodejs项目经过git放置在/home/www
目录下,进入目录,执行下列命令:
npm i
pm2 start index.js --name my-server
┌─────────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────┬───────────┬──────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
├─────────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────┼───────────┼──────┼──────────┤
│ my-server │ 0 │ fork │ 2306 │ online │ 22 │ 7h │ 0% │ 46.2 MB │ root │ disabled │
└─────────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────┴───────────┴──────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app
复制代码
最后在nginx.conf
里面添加一条代理规则(假设node服务端口为3000):
location /my-server/ {
proxy_pass http://localhost:3000
}
复制代码
这样,就可以经过https://xxxx.com/my-server/
访问到nodejs项目了。
刚才的操做仅仅是做为初次部署,若是之后代码有改动,还须要咱们登陆服务器,进入到对应的项目目录,手动执行git pull
,而后手动重启服务器(若是pm2启动了watch模式能够省略这一步),至关麻烦。能不能有一种办法,可以在我提交代码的时候就自动更新服务器的代码,并自动重启服务器呢?travis-ci
就是来实现这个目的的。
travis-ci支持公开项目和私有项目,是经过.org
和.com
后缀来区分的。以个人一个公开项目为例,首先进入https://travis-ci.org/ 官网,登陆个人github帐号,而后会看到以下页面:
找到须要集成travis-ci的项目,点击它前面的开关便可。
此时在travis-ci上的操做暂时告一段落,可是页面先别关掉,先放在一边。
接下来,咱们回到本地开发机器,经过git clone
命令把这个项目克隆到本地,而后在项目根目录下添加一个.travis.yml
文件。这个文件是travis-ci持续集成的关键,它定义了你全部持续集成的操做。为了简单起见,咱们仅仅使用它进行自动化部署:
language: node_js
node_js:
- 9.3.0
after_success:
- ssh root@xxx.xxx.xxx.xxx -p yyy 'cd /home/www/taxi-server && git pull && pm2 restart taxi-server'
复制代码
能够看到,我给她定义了运行环境为node.js 9.3.0
,在构建成功(其实啥也没构建)以后,自动登陆服务器,拉取最新代码,重启pm2。
你们都知道,登陆服务器是要输入密码的,即便是travis-ci帮咱们自动化进行,这一步也免不了。可是因为输入密码的步骤是交互的,自动化处理不了,因此咱们也要为travis-ci搞一套“免密登陆”。通过上文ssh-key的配置,其实咱们已经具有了这一条件,之不过还须要多几步的操做。
在本地经过gem
安装travis
命令行工具(macOS默认支持ruby):
gem install travis
复制代码
使用travis登陆:
travis login
复制代码
而后输入github的帐号密码便可。
加密本地ssh-key并自动写入.travis.yml
:
# --add参数表示自动添加脚本到.travis.yml文件中
travis encrypt-file ~/.ssh/id_rsa --add
复制代码
这时会看到.travis.yml
多了一段before_install
的内容:
before_install:
- openssl aes-256-cbc -K $encrypted_e65149523857_key -iv $encrypted_e65149523857_iv
-in id_rsa.enc -out ~\/.ssh/id_rsa -d
复制代码
而后把最后一行的“\
”转义符删掉,并换行顶格添加以下两条内容:
- chmod 600 ~/.ssh/id_rsa
- echo -e "Host xxx.xxx.xxx.xxx\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
复制代码
切记把xxx.xxx.xxx.xxx
换成你服务器的IP。
最后把添加.travis.yml
的项目push到github便可。
从新回到travis-ci.org的页面,进入项目,就可以看到持续集成的效果了:
这时候回到服务器,运行pm2 logs
,会看到服务已经被自动重启的日志记录,至此持续集成及部署功能完美成功!
这一番折腾下来,总算把服务器、建站、持续部署等知识囫囵摸了一遍,对这些技术栈也算有了一些粗浅的看法。接下来还有更多好玩的东西须要进行探索,毕竟这只是一个开始,你们一块儿共勉吧~