如何安裝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

如何在Ubuntu 16.04上安裝Certbot產生有效的SSL憑證

前言

在開始這篇文章之前,需要先確認已經完成下列兩篇文章:

  1. 如何在Ubuntu 16.04上的Nginx建立子網域
  2. 在Ubuntu 16.04 上架設Nginx + PHP 7

簡介Certbot

Certbot是一個由電子前哨基金會(EFF)所開發的工具,其目的是為了讓我們能夠輕易的安裝他們所推出的Let’s Encrypt憑證與續約。

那這個憑證,每次有效期只有三個月,因此續約憑證的有效性就顯的格外重要。以下是安裝的方法與步驟。

安裝Certbot

首先先進入他們所推出的官網

畫面會長下面這個樣子:

接著依照自己的作業系統與使用的HTTP server名稱選擇,以上述兩個教學文章來說,我們這邊要選擇的是,Ubuntu與Nginx,選完之後,會像下列的圖示那樣。

我們從上面的圖片可以看到,選好之後會有相對應的事情要我們做,依照它所寫的步驟,一步一步的將Certbot給安裝起來。依序的輸入下面的指令:


sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot

sudo apt-get update
sudo apt-get install python-certbot-nginx

安裝完成之後,我們可以選擇使用下面的指令,產生我們要SSL憑證之外,還需要幫我們設定Nginx相關的憑證設定。


sudo certbot --nginx

執行上述的指令之後,會跑出下面的畫面:

**注意**

如果在執行上述的指令發生下列類似錯誤訊息的話:


no module named pyasn1

有一些套件/模組並沒有安裝在系統中,因此我們需要使用下列的指令將我們缺少的套件給安裝起來。

要注意的是,在Ubuntu 16.04中,它會使用Python 3來安裝我們的


sudo apt-get install python3-pyasn1 python3-pyasn1-modules

安裝完成之後,再執行一次就會產生出這樣的畫面:

接著會開始一連串的問問題,像是:輸入你要顯示的e-mail還有一些條款需要同意等。

再來後面就是,有要同意就輸入『A』,或是要輸入是則輸入『Y』等,最後來到下面的畫面:

這邊是要問在它從網域清單裡面所找到的網域,請選擇要上HTTPS的憑證。

那這邊假使沒有出現你所建立好的子網域提供我們選擇的選項,沒有關係,我們在後面會有其他的作法可以指定網域上HTTP憑證。

這邊出現可以選擇網域的是:peter-lee.tk和www.peter-lee.tk

那假設上面所列出的清單都想上HTTPS憑證的話,就直接按下一enter鍵即可,那若要選擇,就選擇數字的1,2,3…..吧!我在這邊是選擇按下enter鍵。

在過程中,會有選項問說要不要設定重新導向到HTTPS的選項,這邊可以「No redirect」

我們後面的步驟中可以自行設定。重新導向問題如截圖:

完成之後,會產生下面的截圖,會出現所需要注意的Notes

接著我們輸入下面的網址來測試看看有沒有上好HTTPS憑證。


https://peter-lee.tk

那這樣就成功了。

強制從HTTP導向到HTTPS

有時候我們需要要求所有瀏覽網站的訪客都要使用HTTPS的方式進行連線,那我們就要讓訪客HTTP連線時,幫它重新導向到正確的位址。

我們可以在Nginx的設定檔中,加註這一行來達到這個目的。

我們先用vim編輯器打開Nginx設定檔。


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

在原來的設定檔裡面加上一些設定:


server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/html
    index index.php index.html
    
     if ($scheme = "http") {
         return 301 https://$server_name$request_uri;
     }

}

這個設定意思是說:當檢查$scheme是http時,就把整個網址導向成https連線方式,並給HTTP狀態碼為301。

接著存檔,並檢查Nginx語法是否有誤並重新啟動Nginx服務。


sudo nginx -t && sudo service nginx restart

接著瀏覽網站,就會發現會重新導向到HTTPS新的網站了。

利用Certbot指定網域

有時候,列出可以上SSL證書的子網域列表中,並沒有我們想要的,但是我們可以透過certbot所提供的指令來指定我們要上SSL證書的子網域。

不過記得要先把要上SSL證書的子網域先建立好。

指令如下:


certbot --nginx certonly -n -d sub.domain1.com

  • –nginx是指到哪一個HTTP server
  • certonly指的是只要產生憑證證書就好。
  • -n指的是不要有互動的選項(no interactive的意思)
  • -d指的是說指定要產生SSL憑證的網域名稱。

設定工作排程重新簽章憑證

因為Let’s encrypt SSL的證書也需要重新簽章憑證,所以要設定工作排程。

因為每三個月憑證證書就會失效,因此就需要使用工作排程來設定排程重新簽章。

進入排程編輯設定檔


sudo crontab -e

設定每三個月會重新簽章一次


0 0 3 * *    bash renew.sh

renew.sh


certbot --nginx certonly -n -d domain.com

簡易故障排除

在這章節,是我遇到的錯誤,因為我過了一段時間都還沒有把HTTPS的重新導向設定完成,一直吐「redirects are too many」的訊息給我….後來我找到問題了。

因為我把網域交給CLOUDFLARE代管,而DNS record會把proxy開起來,這意味著可以使用Cloudflare 外部forward的SSL連線,但是我們已經有安裝Let’s encrypt SSL了。

所以我們應該要將proxy forwarding 給關掉,如下示意圖,變成灰色就是代表關掉了。

下一篇文章,將會介紹PostgreSQL的使用方式,不要錯過了喔!

參考資料

  1. Nginx 301 重定向 redirect 域名配置
  2. Certbot

如何在Ubuntu 16.04上的Nginx建立子網域

前言

此篇文章是接續上一篇的更進一步的教學,請先完成此篇文章之後,再來操作這篇的教學。

建立子網域

在建立子網域之前,事先要有一個網域名稱並將此網域指向到指定的IP位址。

並在DNS託管的網站上面新增一筆DNS紀錄,範例如下:


sub.test.com. 1800 IN A 123.345.234.4

其中,子網域名稱sub.test.com是自己要輸入的,這邊只是一個示意圖供本次的教學做例子。

新增完成之後,接著要為這個子網域建造一個新的路徑(website root)

也就是網站的根目錄的意思。接著按照下面的方式,為子網域產生一個對應的設定檔。


sudo vim /etc/nginx/sites-available/sub.test.com

其設定檔的範例內容如下:


server {
listen 80;

root /var/www/sub.test.com;
index index.html index.htm index.nginx-debian.html;

server_name sub.test.com www.sub.test.com;

location / {
try_files $uri $uri/ =404;
}
}

其中,root指的是website root網站進入的根目錄,而server_name則是自己指定的子網域。

記得為子網域建立:web root目錄!


sudo mkdir /var/www/sub.test.com

當設定完成以後,可以將上述的設定檔用捷徑連結的方式指到sites-enabled目錄下。

輸入下面的指令即可達成:


sudo ln -s /etc/nginx/sites-available/sub.test.com /etc/nginx/sites-enabled/sub.test.com

當上面的設定都完成以後,重啟Nginx服務,即可完成子網域的設定了!


sudo service nginx restart

下一篇文章,則要使用Let’s encrypt所提供的certbot來安裝我們的SSL憑證,讓Nginx有一個合法有效的憑證並可以透過HTTPS來進行網站的連線。

參考資料

  1. How to create subdomain with nginx server in the same droplet

在Ubuntu 16.04 上架設Nginx + PHP 7

前言

工作的緣故,需要使用這個不一樣的組合,可能有些人是第一次聽到吧XD

LEPP, 是我把:Linux + Nginx + PostgreSQL + PHP 的縮寫,並安裝在Ubuntu 16.04上面。為了把國外良好與優良的文章做整理,所以就催生出這篇文章出來。

前提作業系統環境

Ubuntu 16.04.* LTS

安裝Nginx + PHP

有了Ubuntu 16.04的作業系統之後,使用ssh方式登入,如下的畫面。


ssh user_name@your-host-name-or-ip-address

登入進去之後,開始進行下列的安裝Nginx套件指令。


sudo apt-get update

sudo apt-get install nginx

強烈建議使用ufw防火牆進行允許HTTP port 80 可以連入。


sudo apt-get install ufw

sudo ufw enable

sudo ufw allow 'Nginx HTTP'

sudo ufw status

接著拜訪下面的連結:


http://server_name_or_ip_address

看到下面的畫面之後,就會知道已經成功安裝了。

Nginx default page

安裝PHP 7

安裝完Ngnx之後,接下來要安裝的是PHP 7,因為要讓Nginx上面跑PHP,所以我們要額外的安裝Fast CGI module。我們就依照下面的指令依序安裝php與其fast cgi模組。

以及存取PostgreSQL的模組,以及一些我覺得有必要的擴展(extensions)。


sudo apt-get update

sudo apt-get install php-fpm php-pgsql

安裝好以後,可以運用下面的指令檢查看看是否PostgreSQL擴展已經安裝成功。


php -m | grep pg

接著設定與fpm有關PHP組態設定檔,別忘了,vim要安裝唷!


sudo vim /etc/php/7.0/fpm/php.ini

接著組態設定檔裡面,找到這一行:


;cgi.fix_pathinfo=1

把它改成


cgi.fix_pathinfo=0

改完之後存檔,並將服務php-fpm進行重啟


sudo service php7.0-fpm restart

接著,修改Nginx的sites-available設定檔


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

並按照下面的設定檔進行增加,下面是新增過後的設定檔的樣子。


server {
listen 80 default_server;
listen [::]:80 default_server;

root /var/www/html;
index index.php index.html index.htm index.nginx-debian.html;

server_name server_domain_or_IP;

location / {
try_files $uri $uri/ =404;
}

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

location ~ /\.ht {
deny all;
}
}

主要是新增:index.php, server_domain_or_IP, location ~ \.php$ 區塊以及location ~ /\.ht區塊

新增完成之後,可以使用下面的指令來幫助我們檢查Nginx語法是否正確


sudo nginx -t

都設定完成沒有錯誤之後,我們可以重新啟動Nginx的服務。


sudo service nginx restart

接著我們可以新建立一個頁面在/var/www/html下面,名叫:info.php。


<?php

phpinfo();

拜訪網址,成功的話,就會看到下面的畫面了。

要記得一件事情,因為這是用來測試PHP有沒有安裝成功,所以記得測試完成沒有問題之後,把info.php給移除喔!

因為,這只是用來測試的,記得測試完成之後,要把這個檔案移除喔!

下一篇,我們來介紹:怎麼用Nginx來建立子網域。

參考資料

  1. how-to-install-linux-nginx-mysql-php-lemp-stack-in-ubuntu-16-04
  2. how-to-create-subdomain-with-nginx-server-in-the-same-droplet