如何在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