安裝Hue管理HBase資料庫

前言

由於工作的關係,需要將HBase安裝好之後,找一個能夠管理資料庫的介面,找了又找,最後找了這個,叫做Hue的資料庫管理介面。本文章中,會教導該如何在Ubuntu 16.04上面將此資料庫管理介面安裝起來並執行。

前置環境

在安裝Hue之前,需要有下列的環境與先需先安裝好幾個套件。

  • 一個乾淨的Ubuntu 16.04
  • 已經安裝好Hadoop與HBase,若尚未安裝,請先參考這篇文章
  • 因為需要編譯,需要安裝好編譯的工具與編譯期間需要用到的函式庫。
    # 更新套件的鏡像來源
    sudo apt-get update
    sudo apt-get install maven \
    git-core \
    make \
    libffi-dev \
    python-dev \
    krb5-config \
    libkrb5-dev \
    libssl-dev \
    libsasl2-dev \
    libsasl2-modules-gssapi-mit \
    libldap2-dev \
    libxml2 \
    libxml2-dev \
    libxslt1.1 \
    libxslt1-dev \
    libsqlite3-dev \
    libgmp3-dev \
    libmysqlclient-dev
    

    安裝編譯工具

    sudo apt-get install build-essential autoconf libtool pkg-config python-opengl python-imaging python-pyrex python-pyside.qtopengl idle-python2.7 qt4-dev-tools qt4-designer libqtgui4 libqtcore4 libqt4-xml libqt4-test libqt4-script libqt4-network libqt4-dbus python-qt4 python-qt4-gl libgle3 python-dev
    

下載Hue專案

在本次步驟,我們使用Git指令將Hue專案下載回來。


git clone https://github.com/cloudera/hue

編譯Hue Web App

下載Hue專案回來之後,接著切換到hue專案底下,並執行make apps


cd ~/hue

make apps

編譯完成之後,我們可以使用下面的指令試著將server跑起來。


build/env/bin/hue runserver

跑起來之後,用瀏覽器訪問,localhost:8000就可以看到如下的畫面了。

成功之後,記得按下ctrl+c停止Hue server並回到原來打指令的模式。

設定HBase

在正式將Hue server弄起來之前,需要先將HBase設定好。

首先,先使用root使用者執行 netstat指令查看9090是否有人使用。


sudo netstat -nl|grep 9090

確定沒有人使用之後,則切換到/usr/local/hbase/bin底下並執行下面的指令


hbase-daemon.sh start thrift

執行完成上述的指令之後,我們可以使用jps指令,並可以看到多了一個叫做ThriftServer的跑起來了。

設定Hue設定檔

接著我們要在Hue中設定有關於HBase的相關設定。照著下面指令,將設定檔案開啟。


vim ~/hue/desktop/conf/pseudo-distributed.ini

接著找到[hbase]的設定地方,按照下面的截圖,把一些設定前面的註解拿掉與修改設定值。

完成之後,Hue的HBase相關設定就完成了。

用Nginx反向代理讓外網也可連Hue

因為Hue跑此server的時候,只在內網跑,監聽的位址是localhost,也就是127.0.0.1

那我們如果是使用VPS,把Hue架設與運行起來好之後,我們在外網是看不到server的畫面。因此我們可以安裝Nginx並使用反向代理的方式,把畫面接出來。

首先先安裝Nginx


sudo apt-get update

sudo apt-get install nginx

設定反向代理的位址


# 打開Nginx設定檔

sudo vim /etc/nginx/sites-available/default

找到下面的location / 區塊,把區塊中內容改成下面的設定,接著存檔並離開。


location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
proxy_pass http://localhost:8000;
}

檢查Nginx設定檔是否有誤


sudo nginx -t

看到下面的截圖之後,就代表設定檔的語法沒有問題。

重新載入Nginx服務


sudo service nginx reload

做完上述的設定之後,我們在使用nohup指令將Hue server跑在背景執行。


nohup build/env/bin/hue runserver &

執行完nohup之後,記得要再按一次enter鍵,才會回到原來指令模式。

接著可以用ps指令查看Hue是不是正確在背景中執行,若正確的話,會與如下圖一樣,途中,黃色部份的PID會有所不同,是正常的。

若有需要設定Hue的話,則先需要將這兩個process停止,停止的方式則是用kill指令,並在kill 後面加入要kill 的 PID,若以下面的截圖作為例子,則是將8136與8146停止,其指令如下:


kill 8136 8146

參考資料

 

在Ubuntu 16.04上安裝HBase

前言

在前面的文章中,我們已經把Hadoop安裝起來了,那本篇文章,則是要接續前面的部份,將HBase也一併安裝起來。

前置條件

  • 需要完整的安裝並正常運行Hadoop,若還沒完成者,請先到此篇文章進行安裝。

第一步:下載HBase壓縮檔

這邊一樣,我們先使用wget指令下載HBase壓縮檔,下載完成之後,進行解壓縮並把整個檔案移到/usr/local/hbase,並將使用者權限修改為hadoop,相關指令如下。
這裡示範安裝HBase版本為1.4.7


wget http://apache.mirror.gtcomm.net/hbase/stable/hbase-1.4.7-bin.tar.gz
tar -zxvf hbase-1.4.7-bin.tar.gz
sudo mv hbase-1.4.7 /usr/local/hbase/
sudo chown -R hadoop /usr/local/hbase/

第二步:設定HBase環境變數

依照下面的方式,在~/.bashrc中設定相關的環境變數


export HBASE_HOME=/usr/local/hbase
export PATH=$PATH:$HBASE_HOME/bin

設定完成之後,別忘了使用source指令進行重新載入.bashrc檔

第三步:設定hbase-env.sh

在hbase-env.sh設定檔中,設定JAVA_HOME環境變數。相關指令如下:


cd /usr/local/hbase/conf

vim hbase-env.sh

並加入這一行:export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

編輯/usr/local/hbase/conf/hbase-site.xml設定檔案並將下列內容加到<configuration></configuration>之間,其內容如下:


<property>
<name>hbase.rootdir</name>
<value>hdfs://localhost:9000/hbase</value>
</property>

<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/hadoop/zookeeper</value>
</property>

<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>

第四步:執行HBase

使用下面的指令將HBase跑起來。


/usr/local/hbase/bin/start-hbase.sh

一樣,在執行過程中會需要打密碼,那就打hadoop使用者的密碼。

執行成功後如截圖所示:

接著執行HBase shell。


hbase shell

執行成功後如下截圖所示:

我們可以在HBase shell底下執行status命令來查看有沒有出現錯誤,若成功的話,可以得到下面截圖的結果。

也可以用網頁的方式查看目前HBase的狀態。其拜訪網址如下:


http://ip-address-or-domain-name:16010

總結

啟動HBase執行script順序如下:


start-hdfs.sh
start-yarn.sh

start-hbase.sh

結束HBase之script順序如下:


stop-hbase.sh

stop-dfs.sh
stop-yarn.sh

每個script檔案擺放路徑就不在此一一贅述,可以去先前的文章內容中找到相對應的script檔案路徑。

Hadoop + HBase對於硬體資源是很要求的。我在自租的VPS,太差的配備是跑不起來的。

以個人的經驗來說,CPU建議至少要再4core至6core才夠用,RAM大約在16G會比較好一點,我是在DigitalOcean上面跑起來的。選用的方案是6core+16G的Droplet方案。

參考資料

在Ubuntu 16.04中安裝Hadoop

前言

因為工作上的需要,需要建置HBase當做資料儲存的空間,而這個同樣也是一個No-SQL資料庫。至於什麼是No-SQL DB,則不在此文章的範圍內,可以自行去查詢了解。

在本篇文章中,會教導該如何在Ubuntu 16.04中,將Hadoop與HBase架設起來。

前置環境

下面則是列出所需要的環境。

  • 一台乾淨且裝有Ubuntu 16.04的主機

安裝Hadoop

在本章節中,教導使用者們一步一步的安裝好Hadoop,可能在這裡會問:我只需要HBase,但是一定要安裝Hadoop嘛?答案是肯定的,因為HBase這個資料庫是相依於Hadoop,因此需要先安裝好Hadoop,才可以安裝HBase。

第一步:登入主機

首先先使用ssh登入到我們的主機


ssh user-name@ip-address-or-domain-name

第二步:建立hadoop使用者

在建立Hadoop之前,需要先建立一個名為hadoop使用者給Hadoop使用。先使用下面指令建立一個使用者。


sudo useradd -m hadoop -s /bin/bash


接著為這個hadoop使用者設置一個密碼,注意:密碼會需要輸入兩次來做確認


sudo passwd hadoop

為了增加目錄權限操作方便,我們將hadoop這個使用者設定有root權限可以使用,設定方式如下指令:


sudo adduser hadoop sudo


到這裡,就把Hadoop需要的使用者建立完成了,記得使用下面指令切換使用者再進行下一步!


su hadoop

第三步:更新鏡像來源並安裝JAVA環境

在Ubuntu底下,安裝任何的套件前,我們都會使用下面的指令先更新好鏡像來源網址。


sudo apt-get update

sudo apt-get install default-jdk default-jre

安裝好JAVA環境之後,可以使用下面的指令做測試:


java -version

如下圖所示:

第四步:設定JAVA環境執行路徑

在本步驟中,需要設定JAVA_HOME環境變數。

先編輯在家目錄下面的.bashrc檔案。


vim ~/.bashrc

接著加入路徑,注意:路徑有可能不同,需要自己設定正確的相對應路徑


export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin
# 設定後面所需要用到的Hadoop相關執行路徑

export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

設定完成之後,再執行source指令將此環境變數載入。


source ~/.bashrc

接著可以使用,whereis java與java -version這兩個指令做驗證。


whereis java

java -version

其結果如下圖所示:

第五步:安裝Hadoop

我們這邊選用的是2.8.5的版本,使用wget指令來進行下載壓縮檔。


wget http://apache.mirror.gtcomm.net/hadoop/common/hadoop-2.8.5/hadoop-2.8.5.tar.gz

第六步

  • 解壓縮Hadoop壓縮檔到/usr/local資料夾
  • 切換資料夾至/usr/local
  • 將資料夾名稱重新命名
  • 將/usr/local/hadoop切換權限給hadoop使用者

sudo tar -zxf ~/hadoop-2.8.5.tar.gz

cd /usr/local

sudo mv ~/hadoop-2.8.5/ ./hadoop

sudo chown -R hadoop /usr/local/hadoop

第七步:驗證Hadoop是否可以運行

下面指令可以幫助我們驗證hadoop是否可以正常運行


cd /usr/local/hadoop

./bin/hadoop version

如果可以成功運行的話,如下面截圖所示:

第八步:偽分佈式Hadoop

Hadoop允許可以使用兩個分離的process運行,意思就是一個當NameNode一個當DataNode,同時讀取的是HDFS文件。

要修改成此模式需要修改core-site.xml與hdfs-site.xml這兩個設定檔案。

Hadoop設定文件是以XML格式,每個設定的property都有起始與結尾標籤,在標籤裡面放置的是設定值。

先開啟,core-site.xml檔案。


cd /usr/local/hadoop

vim ./etc/hadoop/core-site.xml

接著在<configuration></configuration>標籤之間插入下面的值。


<property>
<name>hadoop.tmp.dir</name>
<value>file:///usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>

接著,修改hdfs-site.xml設定檔案


cd /usr/local/hadoop

vim ./etc/hadoop/hdfs-site.xml

一樣在<configuration>與</configuration>中加入:


<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///usr/local/hadoop/tmp/dfs/data</value>
</property>

設定完成後,接著就可以使用下面指令執行NameNode初始化。


cd /usr/local/hadoop

./bin/hdfs namenode -format

執行完成之後,可以注意到這兩行,若是一樣,則代表執行成功。

第九步:執行NameNode與DataNode process

使用下面的指令執行與啟動NameNode與DataNode process


cd /usr/local/hadoop

./sbin/start-dfs.sh

執行此process期間,會使用到ssh相關的登入,因次遇到yes就輸入yes。

遇到打密碼,就打hadoop使用者的密碼。

若在執行過程中出現「localhost: Error: JAVA_HOME is not set and could not be found.」等字樣,則需要在/usr/local/hadoop/etc/hadoop/hadoop-env.sh 底下設定JAVA_HOME環境變數


export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

設定完成之後,再執行一次:./sbin/start-dfs.sh就會成功了。其成功截圖畫面如下:

設定好之後,使用網路瀏覽器拜訪網址:http://ip-address-or-domain-name:50070,就可以看到運行的狀態頁面了。

第十步:啟動yarn

首先,先執行下面的指令,修改檔案名稱並進行mapred-site.xml編輯。


cd /usr/local/hadoop

mv ./etc/hadoop/mapred-site.xml.template ./etc/hadoop/mapred-site.xml

vim ./etc/hadoop/mapred-site.xml

接著在<configuration>與</configuration>中加入下面的設定標籤。


<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

接著設定yarn-site.xml設定檔。


cd /usr/local/hadoop

vim ./etc/hadoop/yarn-site.xml

在<configuration>與</configuration>標籤中加入下面的設定值。


<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

接著就可以啟動yarn了。當然,中間會打密碼執行。

執行下面指令來啟動,啟動完成之後,可以拜訪:http://ip-address-or-domain-name:8088/cluster來看目前所有的叢集(cluster)的狀態與資訊。


cd /usr/local/hadoop

./sbin/start-yarn.sh

# 啟動背景 web server 查看歷史運作紀錄

./sbin/mr-jobhistory-daemon.sh start historyserver

後記

  • 如果使用較低方案的VPS 方案做練習的話,會跑不起來,原因是因為RAM太小不夠。因此需要使用與這篇文章來設定swap來達到這個目的。
  • 有的時候ssh連線是使用非port number 22,因此需要使用到HADOOP_SSH_OPTS來設定port number。設定此環境變數在.bashrc檔案即可,記得使用source 重新載入此檔案。設定環境變數如下,22是我們可以修改的port number:
    export HADOOP_SSH_OPTS="-p 22"
    

參考資料

下一篇將介紹如何安裝:HBase

如何安裝GVM來管理Go版本

前言

Go是一個新興的程式語言,那它也有管理版本的工具,那本文章,就是要來講解,如何做Go版本的管理。

前置環境

要安裝與使用gvm之前,需要有下面的環境才開始往後的教學。

  1. Ubuntu 16.04
  2. 系統預設要有一個go-lang環境
  3. 一個執行shell環境,bash或是fish皆可

安裝gvm

在安裝gvm之前,先執行下面的指令,確定Ubuntu系統上是不是已經有一個Go的版本了


sudo apt-get update

sudo apt-get install golang-go

接下來,則是安裝gvm,若是使用fish shell,則可以參考此篇文章安裝方式。

設定GOROOT_BOOTSTRAP環境變數

因為在編譯Go版本的時候,需要用到Go裡面的相關路徑,因此需要先設定好變數

可以打開家目錄底下的.bashrc檔案並加入下面的資訊。

fish 則是在家目錄底下的.config/fish/config.fish


export GOROOT_BOOTSTRAP=/usr/lib/go-1.6

加入完成之後,若不想要重新開啟terminal,則需要使用下面的source指令重新載入相關的設定。


# bash shell

source ~/.bashrc

# fish shell

source ~/.config/fish/config.fish

這樣就可以完成編譯Go的版本了。

使用gvm安裝和使用Go版本

下面可以安裝指定的Go版本


gvm use go1.9

這時候需要等候,因為會下載與編譯,需要一段時間做這件事情。

使用Go的版本


gvm use 1.9

列出所有已經有安裝過的Go版本


gvm list

參考資料

如何在Ubuntu 16.04使用Fish shell

前言

我們在Ubuntu 16.04中,或是大家最常在Linux上用的shell命令就是bash了。可是在一般我們使用的情形之下,bash實在是會沒辦法達到我們的需求,這時候,就需要考慮其他的shell來使用了。那普遍最多人使用的是:zsh與fish shell是兩大宗。

本文章中,會教如何在Ubuntu 16.04下,安裝與一般使用fish shell的教學。

前置環境

  1. Ubuntu 16.04

安裝步驟

首先,先載入外部的,fish shell的儲存庫,因為Ubuntu 16.04內建的fish套件所收錄的版本較舊,我們要用較新的版本,因此我們需要先加入外部的fish shell儲存庫。接著更新好鏡像來源之後,就可以安裝新版的fish套件了。其依序的輸入命令如下:


sudo add-apt-repository ppa:fish-shell/release-2
sudo apt-get update
sudo apt-get install fish

fish shell的一般設定

一般安裝好fish之後,我們為了要有更好的fish shell體驗,我們會先使用oh-my-fish來幫助我們設定與增強fish的使用。前提是我們先需要在Ubuntu 16.04上安裝好curl套件,接著按照下面的指令將oh-my-fish下載下來並執行。


curl -L https://get.oh-my.fish | fish

在官網下面有一些實用的指令,像是update, install, theme, list以及remove等,都可以參照oh-my-fish官網的README,在此就不再做相關的贅述。不過下面會介紹與推薦一些fish shell的樣式與實用的工具。

Fish Shell 推薦樣式

下面是fish shell所推薦的樣式(theme):

  • cyan
  • ocean
  • bobthefish

更多的樣式介紹與使用方式在此連結

Fish Shell實用的工具推薦

接下來會是推薦實用的工具

  • nvm
  • phpbrew
  • gvm

NVM安裝

在fish shell底下安裝nvm(Node version manager)是一件容易的事情,只要輸入下面的指令就可以完成安裝。


omf install nvm

phpbrew安裝

同樣的,我們只需要書下面的指令,即可完成phpbrew的安裝。


omf install phpbrew

GVM安裝

因為gvm(Go version manager)並不在我們使用的omf安裝清單中,因此我們需要透過其他安裝外掛的工具,如fisherman來幫助我們完成其安裝。

安裝fisherman

首先先下載fisherman與安裝


curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs https://git.io/fisher

上面指令安裝完成之後,就會有fisher這個指令可以使用了。

接著再使用fisher指令來安裝gvm


fisher gvm

安裝好之後,就會有gvm的指令可以使用與管理Go版本了。

參考資料

 

如何使用Nginx, Gunicorn與Supervisor 部署一個Flask App

前言

前陣子,因為隔壁組的關係,需要建置聊天機器人在外網,所以需要在外面的雲端平台上建置機器人的服務,這樣一來外面的人才可以存取到機器人,因為後端預測語意分析是用Python寫成的,為了要整合起來的便利,所以需要使用Python來建置後端與機器人。

因為Messenger機器人是透過Web後端進行存取與溝通,所以本篇文章是在教學,如何使用Nginx, gunicorn與supervisor 進行搭配,來部署一個Flask App

分別先講一下這四個工具每個的工作:

  1. Flask: 後端程式,一個Python web framework
  2. Nginx: 反向代理
  3. Gunicorn: 幫助我們部署Flask App
  4. Supervisor: 監控與控制Gnuicron的程序(process)
  5. inotify-tools: 監控當後端的code改變時會自動的更新

前置需要先已經設定的東西

  • 已經有一台虛擬私人主機(VPS, Virtual Private Server)
  • Ubuntu 16.04
  • 已經有網域並指向到這台主機的IP位址
  • Python3 (不用安裝,Ubnutu已經內建)

第一步:登入主機

首先,先登入主機。


ssh username@domain_or_ip_address

第二步:安裝Nginx

接著,要安裝好Nginx。


sudo apt-get update

sudo apt-get install nginx

第三步:安裝所需要用的套件


sudo apt-get install supervisor python-pip3 python3-virtualenv

  • supervisor套件先前已經提過,這裡就不在贅述
  • python-pip3 是用於Python3 的pip3 套件管理系統
  • python-virtualenv是用於Python2/Python3的虛擬環境,可以幫我們把Python環境獨立出來與系統環境分開

第四步:建立一個虛擬環境

因為我們的Flask App為了不要與系統環境污染,因此需要建立一個虛擬環境來做這件事情。因此我們建立一個虛擬環境,而名字叫做simple-bot,因為建置環境時,預設會使用Python2做建置環境的對象,所以要在後面指定要建立的Python設定檔。


virtualenv simple-bot --python=/usr/bin/python3

接著建立好環境之後,切換到simple-bot的環境,其指令如下


source ../simplebot/bin/activate

如果是使用Fish shell的話,要執行下面的指令來切換環境


source ../simplebot/bin/activate.fish

如果要離開這個的環境,這時候只需要執行下面的指令即可:


deactivate

寫一個Hello Flask App

下面是一個基本的Hello Flask App


from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
return "Hello World"

if __name__ == '__main__':
app.run(debug=True)

接著執行下面的app.py


python3 app.py

接著使用瀏覽器去拜訪:http://127.0.0.1:5000,接著就會看到下面的畫面了。

安裝Gunicorn

根據英文說法,這個Python3 套件是叫做:


Gunicorn ‘Green Unicorn’ is a Python WSGI HTTP Server for UNIX.

意思就是,用來在UNIX相關作業系統上做Python WSGI HTTP Server

利用下面的方式把Gunicorn安裝起來


pip3 install gunicorn

安裝Supervisor

這是一個允許在UNIX相關作業系統下,可以監控與控制一些指定的程序(processes)

使用前,要先安裝好這個名稱的套件。


sudo apt-get install supervisor

接著在 /etc/supervisor/conf.d/ 目錄下面建立一個叫做HelloBot.conf的設定檔案


[program:HelloBot]
directory=/home/username/hellobot
command=/home/username/hellobot/bin/gunicorn app:app -b 127.0.0.1:8000 --reload --max-requests 1 --access-logfile=- --error-logfile=-
autostart=true
autorestart=true
stderr_logfile=/var/log/HelloBot.err.log
stdout_logfile=/var/log/HelloBot.out.log

這邊來解釋一下,上面每一行的意義。

  1. 第一行的[program:HelloBot]是定義HelloBot這個要監控的程序名稱
  2. 第二行是定義工作目錄(working directory)
  3. 第三行是定義指令,要執行與監控的這個process程序
    這裡除了執行app.py程式起來之外,還有定義跑起來的port number以及需要reload
    還有定義access log 與 error log 是要抓STDOUT與STDERR的輸出。
  4. 第四行與第五行則是定義開機會自動起動。
  5. 倒數兩行則是定義stderr log與stdout log要放在哪一個檔案路徑裡面。

gunicorn所帶的–reload –max-requests 1這兩個參數可以讓gunicorn將程式碼自動更新。

設定好相對應檔案之後,接著執行下面的指令讓supervisor可以讀到新的程序設定檔。

以及為了要載入這個新的程式,必須要重啟supervisor服務。


sudo supervisorctl reread
sudo service supervisor restart

設定Nginx反向代理(reversed proxy)

所謂的反向代理,意思就是在server端上設定當server端收到某一個請求位址之後,可以透過這台server將所有請求導向給另一個真正可以處理這些請求參數服務的後端服務。

所以依照這個定義,則可以將我們上述的兩個東西結合在一起,就會變成:

  • Nginx當作反向代理的server
  • Flask App則是真正處理請求得後端服務

這樣的好處就是,使用者不知道後面是Flask App在做處理,只知道有Nginx的server存在。

從上述的設定檔得知,Flask App服務是跑在127.0.0.1:8000上面,因此我們需要按照下面的方式設定好我們所需要的反向代理設定。

用vim編輯器打開:/etc/nginx/sites-available/default的設定檔

打開之後,找到server區塊,並把下面這一行加進去。

若location /的區塊裡有try_files $uri $uri/ =404;也請記得要刪除。


location / {
proxy_pass http://127.0.0.1:8000;

}

接著檢查設定語法是否正確並重新啟動Nginx服務


sudo nginx -t

sudo service nginx restart

安裝inotify

因為有時候會改一些code讓後端程式變得跟之前不一樣,但是supervisor與Gunicorn並不知道程式碼有更動,因此為了要讓Gunicorn知道程式碼已經變動,所以我們要inotify-tools來幫助我們完成這件事情。使用這個之前,需要在Ubuntu上安裝inotify-tools套件


sudo apt-get update

sudo apt-get install inotify-tools

接著每當同一支程式已經有更新的時候,記得執行下面的指令:

sudo service supervisor restart

這樣就可以把新的程式真正的更新上去了!

結論

上面我們一共安裝了這一些的Python3 套件:


Flask==0.12.2
uwsgi==2.0.17.1
gunicorn==19.9.0
inotify==0.2.10

我們可以定義一個requirements.txt並使用pip3安裝就可以把全部的Python3 套件都安裝好!

我們就可以用下面的方式安裝起來。


pip3 install -r requirements.txt

參考資料

如何在Ubuntu 16.04上移除Nginx的Server 回應標頭

前言

有時候我們在使用Nginx的時候,回應預設標頭會有Server標頭,裡面會有Nginx版本與使用在哪個的Linux發行版本。

這會讓有心人士從這個標頭查找相關的資訊,並進而入侵。我們為了要避免這個問題,因此我們需要在機器上安裝額外的套件來設定。本文章中,我們以Ubuntu 16.04為例子,將Nginx設定成不會有Server標頭洩漏的發生。

預先安裝的環境

首先,我們先假設我們已經先有下面的Linux發行版本與安裝的套件。

  1. Ubuntu 16.04
  2. Nginx

安裝nginx-extras

我們首先需要安裝nginx-extras來幫助我們隱藏Server的回應標頭(header)


sudo apt-get update
sudo apt-get install nginx-extras

設定回應的Server標頭為隱藏

安裝好nginx-extras之後,我們打開/etc/nginx/nginx/conf設定檔,在http區塊裡面我們可以設定如下面的參數:


more_clear_headers Server;
server_tokens off;

接著設定完成之後,就會像如下截圖一樣。

接著在使用下面的指令檢查Nginx的語法與重新啟動Nginx服務,這樣就會成功把Server回應標頭給移除掉了!


sudo nginx -t

sudo service nginx restart

參考資料

  1. how-do-you-change-the-server-header-returned-by-nginx

如何在Ubuntu 16.04上面修正時間與修改目前的時區

前言

我們有時候向主機供應商租用主機的時候,往往會遇到時區不一樣或是時跑掉。

這時候我們需要自行更新我們想要指定的時區與修正正確的時間。本文章,以Ubuntu 16.04為例子,來演示如何指定時區與修正正確的時間。

指定時區

在開始指定時區之前,可以使用下面的指令來看一下目前的時間。


date

這時候會看到下面的輸出時間。


Sat Jul 21 05:10:48 UTC 2018

我們可以從輸出的時間日期發現到,是UTC時間,可是我們想要的是台北時間。

因此我們透過下面的指令可以重新設定系統的時區。


sudo dpkg-reconfigure tzdata

接下來會進到類似下面這樣的畫面。

如果沒有要設定的話,可以先按下TAB按鍵,接著可以選下面的Ok或是Cancel這樣就可以離開設定時區的畫面了。

因為這篇文章是範例的演示是要修改成其他的時區,因此我們先選擇洲,選完之後再選Taipei。

接著再按下enter,再輸入先前提到的date指令就會發現日期時間就會改變了。

透過NTP校正時間

有時候機器上面的時間會跑掉,所以我們需要透過NTP來進行更新時間。

我們先安裝ntpdate套件。


sudo apt-get update

sudo apt-get install ntpdate -y

接著執行下面的指令來校正時間


ntpdate tock.stdtime.gov.tw

接著就會校正時間成功了。

參考資料

  1. NTP列表時間
  2. setting-timezone-from-terminal

如何在Ubuntu 16.04上移除Apache2的Server 回應標頭

前言

現今我們在Ubuntu 16.04上面安裝的Apache2在預設的使用下,會回傳Server的回應標頭。

當我們使用如curl等指令時,會得到如下的相關資訊:


curl -I your-domain.com | grep Server


Server: Apache/2.4.18 (Ubuntu)

如上這樣情形,會因此造成資訊洩漏,讓其他有心人士可以透過回應的標頭猜測出網站相關的訊息。為了防止這個情況的方式,我們需要安裝security2模組與設定。來隱藏這個訊息。

預先安裝的環境

我們使用的預先安裝環境的系統發行版本與Apache2版本為下列列表:


Ubuntu 16.04

Apache/2.4.18

安裝mod_security2

透過下面的指令,把mod_security2安裝起來


sudo apt-get update

sudo apt-get install libapache2-mod-security2

編輯mod_security2設定檔


sudo vim /etc/apache2/mods-enabled/security2.conf

見到下面的設定檔,在裡面加上一行(設定檔中有標注)


<IfModule security2_module>
# Default Debian dir for modsecurity's persistent data
SecDataDir /var/cache/modsecurity

# Include all the *.conf files in /etc/modsecurity.
# Keeping your local configuration in that directory
# will allow for an easy upgrade of THIS file and
# make your life easier
IncludeOptional /etc/modsecurity/*.conf

# 加入下面那一行

SecServerSignature " "
</IfModule>

重啟Apache2服務

依照先前的設定檔完成之後,下面跟著執行指令來重啟Apache2服務


sudo service apache2 restart

驗證Server回應標頭

我們再使用下面cURL指令來驗證回應標頭是否正確。


curl -I your-domain.com | grep Server

這時候就會發現改成下面的回應標頭了!


Server:

參考資料

  1. How to install mod_security in Apache 2.4
  2. How to remove “server” information from http-header in Apache 2.4

如何在Ubuntu 16.04上安裝與存取PostgreSQL

前言

在開始操作這篇文章之前,需要完成下面的教學文章:

  1. 如何在Ubuntu 16.04上安裝Certbot產生有效的SSL憑證
  2. 如何在Ubuntu 16.04上的Nginx建立子網域
  3. 在Ubuntu 16.04 上架設Nginx + PHP 7

PostgreSQL簡易介紹

PostgreSQL是一個關聯式的資料庫,個人認為比MySQL/MariaDB強大的原因是,因為PostgreSQL可以支援一些不一樣的欄位型別,像是JSON type等等。這是有別於一般的SQL資料庫,同時這也是它的優勢跟特性。

PostgreSQL安裝

首先,我們依序執行下面的指令:


sudo apt-get update
sudo apt-get install postgresql postgresql-contrib

安裝好以後,預設會有一個使用者叫做postgres的使用者。

切換使用者之後,輸入:psql,就會進入指令模式了,要退出只要輸入\q或是ctrl+d組合鍵即可退出。


sudo su - postgres

psql

為了不要讓外部可以連線,我們需要到PostgreSQL的設定檔進行設定。


sudo vim /etc/postgresql/9.5/main/pg_hba.conf

 

每個版本號對應的路徑設定檔會不一樣,像這邊是9.5版本,如果是安裝9.1版本,那9.5那邊就要改成9.1。

理論上要確認長成這樣的使用者設定。

設定一個使用者

有別於MySQL/MariaDB的使用者設定,PostgreSQL設定外連的使用者是需要設定在設定檔裡面的,所以我們要接續上面的打開設定檔並把


local all postgres peer

改成


local all postgres trust

改完之後接著重新啟動PostgreSQL服務


sudo service postgresql restart

切換成使用者postgres


psql -U postgres

接著進入PostgreSQL的互動shell中,修改密碼並離開互動shell。


ALTER USER postgres with password 'your-password';

最後再去把設定檔中的下面這一行:


local all postgres trust

改成


local all postgres md5

並重新啟動PostgreSQL服務。


sudo service postgresql restart

利用Adminer.php驗證PostgreSQL連線設定

為了要知道先前的設定可以知道,是否連線是正確的,所以我們在這部份要利用Adminer來驗證前一部份的設定。

在這之前,我們為Adminer建立一個子網域叫做db.peter-lee.tk。

詳細的在Nginx架設與子網域設定,請看最前面的前言教學連結。

Adminer介紹

Adminer是一款只有一個單一PHP檔案的PostgreSQL資料庫管理系統,當然PostgreSQL也有phppgAdmin可以使用,但是已經在2013以後就沒有在積極的維護了。為了有良好的使用體驗跟完整的支援,我這次在這篇的教學中使用Adminer來管理PostgreSQL資料庫。

下載Adminer

首先,先拜訪Adminer官方網站,接著拉到頁面在下方的downloads部份。如圖所示

並複製第一個Adminer的連結。

切換到要拜訪的子網域的網頁根目錄下(web root)並輸入下面的指令下載


sudo wget https://github.com/vrana/adminer/releases/download/v4.6.2/adminer-4.6.2.php

有時候版本會更新,所以複製的下載連結會有所不同,這點需要注意!

下載完成之後,把檔案名稱修改成index.php


sudo mv adminer-4.6.2.php index.php

利用Nginx網址重寫導向給index.php

我們假設我們建立好的子網域名稱叫做:db.peter-lee.tk。則我們打開此子網域的對應設定檔做設定。


sudo vim /etc/nginx/sites-available/db.peter-lee.tk

打開的設定檔並加上網址重寫,其完整的設定檔長成這樣:


server {
listen 80;

root /var/www/db.peter-lee.tk;
index index.php index.html index.htm index.nginx-debian.html;

server_name db.peter-lee.tk;

location / {
try_files $uri $uri/ /index.php?$query_string;
}

location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}

location ~ /\.ht {
deny all;
}

}

  • 一律導向給index.php做處理。

接著嘗試連線PostgreSQL連線看看有沒有設定正確。若連線成功的話,就會像下面一樣的畫面了。

 

同場加映

在下一篇,我們會介紹如何建置一個Hello Laravel App。

敬請期待!

參考資料

  1. Adminer
  2. Rewrite of NGINX to Laravel 5 in an online host
  3. How To Install and Use PostgreSQL on Ubuntu 16.04