不單單是前端er——折騰服務器武裝本身

clipboard.png

前言

做爲一個前端開發工程師,天天和瀏覽器、業務代碼打交道,對於「前端」的概念算是比較熟悉了,主流的框架、工具等都能玩得轉,但總以爲本身一直都被禁錮在小小的所謂「前端」的圈子中——由於除此以外的知識點仍是比較薄弱的。html

後來在公司裏面得到了一個輪崗的機會,進入到了運維團隊去學習,眼界也開闊了不少,對於自身水平的認識也更加深刻,火燒眉毛想要提高本身「前端知識」之外的技能樹。前端

因爲運維團隊常常會跟服務器打交道,那麼我何不乾脆就從服務器開始,好好折騰一遍呢?node

1、購買服務器

曾經考慮過購買騰訊雲或者阿里雲等國內服務器,可是因爲國內總所周知的緣由,許多資源的下載要麼特別慢,要麼乾脆直接跪了,動不動就要切換源。同時若是域名綁定了國內的服務器,都須要進行備案,實在是無比麻煩。毫無疑問,我最終選擇了國外的服務器,世界瞬間就清淨了……nginx

關於國外的服務器選購,是見仁見智的事情,我選購的是一臺搬瓦工20G KVM服務器,5美圓/月,買了不吃虧買了不上當,而後安裝了Centos 7 x86_64 bbr系統,接下來就能夠愉快地玩耍了。git

clipboard.png

2、購買域名

搭個什麼服務都好,總不能讓別人背本身的ip,若是可以擁到一個拉風的域名仍是很讚的。因而我就去萬網,直接以本身的英文名字jrainlau申請了一個jrainlau.com域名,一年才55塊RMB,真的超值哦~github

很簡單的下單、支付,而後我就擁有了本身的專屬域名,接下來就是進行DNS解析了。web

進入阿里雲的控制檯,找到雲解析DNS,點進去就能看到咱們的域名解析信息了。添加兩條類型爲A的記錄,通通指向服務器的ip地址便可:npm

clipboard.png

3、安裝Nginx

在域名解析生效前的10分鐘裏面,足夠咱們在服務器上配置好Nginx了。瀏覽器

首先ssh登陸服務器:安全

ssh root@xxx.xxx.xxx.xxx -p yyyy

輸入搬瓦工提供的登陸密碼以後,順利登入。

可是若是每次登陸服務器都要輸入一遍那亂碼般的密碼,是很痛苦的一件事,因此果斷使用ssh-key來實現免密登陸。

  • 第一步,生成祕鑰(若是本機已存在可省略這一步)

    ssh-keygen -t rsa

    按照提示選擇祕鑰所存放的目錄(~/.ssh/),密碼留空,最後能夠在設定的目錄裏找到生成的祕鑰:

    clipboard.png

  • 第二步,上傳祕鑰到服務器

    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的歡迎頁啦~

clipboard.png

4、使用HTTPS

看到左上角「不安全」三個字,內心是很是不爽的,因而立刻進行下一步工做,上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

clipboard.png

因爲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

5、部署靜態頁面與Node.js項目

服務器已經準備了,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

此時訪問 https://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項目了。

6、使用travis-ci實現持續部署

剛纔的操做僅僅是做爲初次部署,若是之後代碼有改動,還須要咱們登陸服務器,進入到對應的項目目錄,手動執行git pull,而後手動重啓服務器(若是pm2啓動了watch模式能夠省略這一步),至關麻煩。能不能有一種辦法,可以在我提交代碼的時候就自動更新服務器的代碼,並自動重啓服務器呢?travis-ci就是來實現這個目的的。

travis-ci支持公開項目私有項目,是經過.org.com後綴來區分的。以個人一個公開項目爲例,首先進入https://travis-ci.org/ 官網,登陸個人github帳號,而後會看到以下頁面:

clipboard.png

找到須要集成travis-ci的項目,點擊它前面的開關便可。

clipboard.png

此時在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的配置,其實咱們已經具有了這一條件,之不過還須要多幾步的操做。

  1. 本地經過gem安裝travis命令行工具(macOS默認支持ruby):

    gem install travis
  2. 使用travis登陸:

    travis login

    而後輸入github的帳號密碼便可。

  3. 加密本地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的頁面,進入項目,就可以看到持續集成的效果了:

clipboard.png

clipboard.png

這時候回到服務器,運行pm2 logs,會看到服務已經被自動重啓的日誌記錄,至此持續集成及部署功能完美成功!

尾聲

這一番折騰下來,總算把服務器、建站、持續部署等知識囫圇摸了一遍,對這些技術棧也算有了一些粗淺的看法。接下來還有更多好玩的東西須要進行探索,畢竟這只是一個開始,你們一塊兒共勉吧~

相關文章
相關標籤/搜索