如何在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憑證就好。


sudo certbot --nginx certonly

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

**注意**

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


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鍵。

完成之後,會產生下面的截圖,會出現所需要注意的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憑證的網域名稱。

簡易故障排除

在這章節,是我遇到的錯誤,因為我過了一段時間都還沒有把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

有趣驗證碼的分析

前言

之前在大學的時候,無意間發現學校的網站後台登入畫面,有驗證碼,當初沒有多想,就是跟一般的驗證碼相同,後來點開驗證碼的圖片連結之後,發現意外的有趣XD…

分析步驟

首先,我們先要拿到相關的連結,就以下面圖中的連結來說好了。

我們會看到登入那邊有一個小驗證碼,對驗證碼圖片開一個新分頁的連結,接著會到下圖所示。

接著,可以看到是一個叫做『authimg.php』的PHP程式在負責產生驗證碼,後面接的參數Code就是負責產生驗證碼裡面的數字。

乍看之下,並沒有什麼特別的,看起來就是一個很正常的亂數驗證碼,不過事實並非這樣。

刪減亂數字串

我試著從字串最後面開始刪減亂數字串之後,我們可以發現到,驗證碼裡面數字並不會跟著變動!不過背景跟數字擺放角度會變,當刪減到剩下長度為8以下的字串時候,可以發現到數字會減少,到長度剛好為8時,每兩個字元的字串正好是對應到一個數字,所以驗證碼可以得出前8個字元分別對應到4個驗證碼裡的數字。

得到確切驗證碼方法

知道是前8個字元對應4個驗證碼的數字之後,可以知道每2個字元對應到1個驗證碼中的數字,以上面連結中為例。驗證碼中數字為『9496』


QK34YS34241124MOQKICA0MOMOEG34

取前8個字元,則變成


QK34YS34

那剩下『QK』的時候,可能會以為數字是:9,但是顯示出來卻是:4

而字串『34』得出來卻是:9

後面的『YS』與『34』也是如此。

所以我們可以得到驗證碼設計的演算法步驟:

  1. 取Code參數值字串中前8個字元
  2. 前4個字串與後4個字串先分成兩組
  3. 二組字串內部分別兩兩一組之後互相對調兩者再合併
  4. 得到我們要的驗證碼

以『QK34YS34』為例。照步驟則拆成兩組,分別為:『QK34』與『YS34』,接著再相互對調,變成:『34QK』與『34YS』最後的字串為:


34QK34YS

建立數字對應表格

有了得到確切驗證碼的字串之後,從上面得到:『34QK34YS』對應到的是『9496』。不過,這樣還是沒有得到全部的字串對應數字的驗證碼,需要找出0~9所有的對應表。所以我們多重新整理幾次連結之後,擷取出有包含0~9所有字串可能。

接著建立對應表格如下

字串字串對應的數字
A00
241
IC2
EG3
QK4
MO5
YS6
UW7
B08
349

驗證方法

為了要驗證方法是否正確,我假設了一個驗證碼答案的數字為『1234』

則對應字串為:『24ICEGQK』,再反推先前推導出的驗證方法得到『IC24QKEG』

再把上面講到的方法反推,所得到的字串放到連結,去請求驗證碼圖片並得到的結果如下

所以,此取得驗證碼方法完成。

後記

驗證碼還是不要這麼容易被識別出比較好,不然就會造成這樣的結果。

我計畫做出可以偵測在網頁裡面,有沒有這個驗證碼連結。分成JavaScript與PHP版本。做好在更新文章內容吧XD

AWS Workshop(2017/11/17)

前言

在參加MOPCON的時候,因為在Unconf中有舉辦這場演講,所以在因緣際會下,也接到了這場免費的工作坊邀請。(相關連結

這場工作坊Workshop最主要是基礎入門AWS的雲端運算平台,對於我這個沒有使用過AWS來說,是在最適合不過的課程,再加上是免費的,所以二話不說也就報名了。

課程筆記

上課的課程筆記我把它記在Gist上,若有需要可以參考。

最主要的操作課程如下:

  • 建立EC2 and MySQL Database
  • Launch Your Amazon Simple Storage Service(S3)

前置作業

在開始後面的兩個Lab操作之前,務必先要註冊一個AWS的帳號,註冊帳號方式,不在此教學文章裡面,不過網路上很多。還有重要的一點就是,需要有一張信用卡,因為信用卡需要用來預先知道你是否有能力可以付款服務,因此需要信用卡資訊,在註冊成功後,還需要讓AWS象徵性的扣一美元。本次兩個WorkShop是有附教學文件檔的,但礙於是訓練的課程,所以就不會在此公開,需要的人可以寄信向我索取。

那下面的是我濃縮文件上的教學,以及自己改過的版本,讓整體的教學更簡單易懂。因為在課程中,台上帶頭做的講師除帶的較緊湊之外,加上文件並沒有寫的很清楚。在這樣的情況下,我當時與朋友都沒有跟上,我是自己事後看文章的教學成功的。

客戶端需要的環境

這裡指的是你自己的電腦環境,作業系統我建議是Unix-based的。像是Linux發行版本中的Ubuntu, Fedora等都可,不拘,不要Windows就好。雖然在教學文件中是以Windows為主,但是在SSH連線時我覺得異常的難用,因為需要下載Putty與使用PuttyGen來進行連上機器的動作,這兩個東西在我學會Linux相關的作業系統之後,就很少在用了。

建立EC2 and MySQL Database

從本章節開始,會紀錄該如何從無到有建立一台Amazon EC2和MySQL資料庫

因為AWS上所有的服務都是切開的,所以要建立一台機器需要花很多的設定包含內部的子網路,允許Port number的安全規則等都需要一一的設定,因此整個教學步驟會很多。廢話不多說,從下面開始吧!

步驟一

登入AWS並進到開始的畫面。在登入成功之後,會跳轉到下面的頁面。

在左上角的選單中,可以發現到有一個US West…等的字樣,當按下去之後,就可以選擇希望建立要使用的主機地點,地點是可以隨意選擇的。

步驟二

建立一個自己的VPC,首先先從首頁頁面中進入。

接著會看到有一個預設的VPC,我們在這裡自己建立一個,不使用預設的VPC。

接著按下『Create VPC』按鈕會跳出畫面,如下圖所示。

接著在表單裡面依照對應填入

Name tag: My Lab VPC
IPv4 CIDR block: 10.0.0.0/16

如下圖中所示。填入之後按下『Yes, Create』就把VPC建立起來了。

步驟三

在同一個頁面中,點選『Internet Gateways』(如下圖所示)並按下『Yes, Create』按鈕

接著選擇新建立好的『』並點選『Attach to VPC』按鈕把VPC建立(Attach)起來,如下圖所示。建立之後,就會看到剛剛建立的Internet Gateway已經是Attached的狀態了。

接著同一個頁面左邊,選擇『Subnets』並依照下圖建立一個名為: 『Public Subnet 1』的子網路。VPC記得選擇我們剛剛所建立的『My Lab VPC」Availability Zone選擇『us-west-1b』,IPv4 CIDR block選擇『10.0.1.0/24』。接著按下圖中的『Yes, Create』。

接著重複上面的步驟,在建立一個名為『Public Subnet 2』的子網路。Name tag改成『Public Subnet 2』,VPC選擇『My Lab VPC』,Availability Zone選擇『us-west-1c』,IPv4 CIDR block選擇『10.0.2.0/24』,如下圖所示。

接著選擇『Public Subnet 1』,下方Tab切換到『Route Table』並點選連結『』,如下圖。連結的文字不一樣沒有關係,因為每個產生出都是隨機的。

進到Route Table的連結頁面之後,按照下圖所示步驟,把Table設定好,接著按下圖中的『Save』按鈕。Target在點下去之後會有提示填入的值,選擇剛剛所建立的『My Lab IGW』。

『Public Subnet 2』也是像上面的步驟重複一遍。這個時候我們可能不需要在重複做一遍,因為AWS會幫我們把『Public Subnet 2』設計好。不過保險起見,還是重複步驟去確認是否有設定完成。

步驟四

這步驟中,建立我們要的『Instance』。回到AWS console並點選『EC2』。

點選『Launch Instance』按鈕。

從圖中可以看到,有很多映像檔可以選擇。在我參加的Lab中,是選擇第一個『Amazon Linux』作為要啟動的Instance,那這一次在本次教學中,我選擇下方的『Ubuntu 16.04』作為這次要啟動的映像檔,當然這邊我們也可以自行選擇所需要的映像檔。

接著會來到方案的部份,選擇預設的『t2.micro』就好。接著選擇:Next: Configure Instance Details。

接下來在設定部份,需要注意下圖圈起來得部份。選擇剛剛所建立的Subnet Network和VPC。

  • Network: My Lab VPC
  • Subnet: Public Subnet 1
  • Auto-assign Public IP: click Enable

沒問題就按下『Next: Add Storage』,這裡就用預設的設定就好,不需要更動。按下下一步『Next: Add Tags』按鈕。

在設定Add Tags頁面中,按下『Add Tags』接著就按照下圖所示,把需要的Key跟Value填入。並按下『Next: Configure Security Group』。

在『Configure Security Group』設定頁面中,主要是要設定允許可以通過的Port Number並設定清單。按照下圖中的2~3步驟去產生三個協定可以允許通過的Port Number。裡面的步驟1需要注意的是,需要自己填入我們自己取的Security Group名稱和敘述。在最後按下『Review and Launch』按鈕。

在Review步驟中,基本上就是看前面的設定的東西有沒有錯誤,沒問題後按下『Launch』。

這時候需要選擇或是建立自己的Key Pair,選擇新增一個Key Pair(Create New Key Pair),如下圖所示。在按下『Download Key Pair』之後,才可以按下『Launch Instance』。這個Key Pair 的目的是要用來使用SSH連線到主機所使用。

接著顯示出下圖這個畫面,代表Instance就開始啟動中了。

同一頁面中拉下來有『View Instances』的按鈕,點下去就可以回到Instance的清單。

等到Instance的狀態變成如下圖所示,即代表Instance已經建置完成可以開使用了。

接著打開我們的Terminal,依照圖中圈選起來的位置可以找到連線的IP address

接著輸入下面的command把剛剛下載的Key Pair file 權限改成400


chmod 400 peter2ubuntu.pem

接著輸入下面command開始連線


ssh -i "your-key-pair-file.pem" user-name@your-ip-address

連線過去的user name會隨著使用的Image映像檔不一樣。若要確定是哪一種可以點選下圖中的『Connect』按鈕,接著會出現連線的相關資訊。

接著就連線成功了!

Create a VPC security group for the RDS DB Instance—-建立RDS關聯式資料庫Instance

如果有用VPS(Virtual Private Server)相關的服務就會知道,這個EC2機器建立起來只會有memory和CPU,並沒有storage的儲存空間,所以要有儲存空間的話,需要再去使用RDS(Relational Database Instance)建立Relational Database關聯式資料庫。

在建立Database Instance之前,需要先設定一些與建立EC2類似的設定,Subnets子網路和Security Group的規則等。

步驟一

回到AWS console management並點選VPC進入到VPC的頁面(如下圖所示)接著左邊有一個可以捲動的選單,往下拉找到『Security Groups』連結並選擇下去。

接著如下圖裡的步驟標示所示,建立一個給Database的Security Group

記得要選擇VPC為之前所建立的,不要使用預設的VPC。填完之後就按下『Yes, Create』按鈕。

建立之後,會看到清單多了『DBSecurityGroup』可以選擇。依照下圖的數字步驟,來設定Inbound Rules。

按下『Edit』按鈕之後,如下圖所示,可以知道要填入的值,唯一要注意的是,source是要選擇『LabSecurityGroup』的Group ID。

在上圖的同一個頁面中,左邊的捲動菜單選擇『Subnets』子網路的設定。

選擇『Public Subnet 1』注意下面的Availability Zone: 『us-west-1b』。

選擇『Public Subnet 2』注意下面的Availability Zone: 『us-west-1c』,每個人的都不盡相同。

注意自己當初選擇的Zone,在之後建立新的『Private Subnet』給DB Instance時會需要用到。

看過之後,我們可以來建立新的『Private Subnet』了。首先依照下圖方式,建立一個新的Subnet名為『Private Subnet 3』,注意框起來的部份。

接著再去用上面同樣的方法去建立『Private Subnet 4』。

Availability Zone的選擇在這個區域下只有兩個可以選,所以我們選擇的時候,就直接分別選擇:『us-west-1b』與『us-west-1c』(如上兩張圖所示)

接著要建立『DB Subnet Group』,先回到AWS Management Console,並點選RDS。進到RDS的畫面之後,再點選左邊選單的『 Subnet Groups』。

接著按照下圖所示,把剛剛建立的『Private Subnet3』和『Private Subnet4』串成一個Subnet Group。

 

之後重複兩次上圖中的動作,就會變成下圖的樣子。

按下『Create』之後,會回到原來Sunet Group的清單,這時候會沒有顯示剛剛建立的清單,這時候只要按下右上角的圖案,就會顯示剛剛我們所建立的Subnet Group了。

步驟二

上面把Subnet 與Subnet Group設定好之後,回到AWS console management並選擇:RDS(圖中有標示)

進入之後如下圖點選『Get Started Now』。

接著會進到可以選擇要使用的資料庫的畫面,在當天Work Shop的時候,有些人的畫面是新版的,那我還是使用舊版的,下圖也是舊版的,我沒有看過新版介面長怎樣,等真的我也被改版的時候再來更新吧XD。接著點選『MySQL』。

接著點選『Select』按鈕。

MySQL DB server 選擇『Production』

接著下一步之後,可以看到下圖中的DB Instance,預設是比較大的DB Instance Class,我們在這裡調整成最小的DB Instance Class以及其他的設定如下圖一樣一併的調整。

往下拉選單之後,下面有需要填寫相關DB的部份,像是:DB Instance 名稱,使用者名稱,密碼等。如下圖,填完成之後,接著下一步(Next Step)。

接著下圖所示,需要選擇對應的VPC以及Security Group還有設定Database Name。其他的設定預設就好,唯一需要注意的是『Publicly Accessible』的這個選項,預設是『No』,當選擇No的時候,EC2以外的裝置或是機器是無法連近來這台DB server的,當選擇『YES』時,才可以在EC2機器外部連線到這台DB server。

接著設定好之後,捲軸往下拉即可看到『Launch DB Instance』

當按下去之後,就會出現下圖的訊息,代表DB Instance已經完成建立,目前正在建置中,要看最新的DB Instance 的狀態,可以按下下圖中的按鈕。

當圖中的狀態(Status)已經是『Available』的時候,代表DB Instance已經建置完成了。

在下圖中有兩個需要注意的地方,一個是DB的狀態,還有End Point,End Point指的是連線DB的主機位址,這個在EC2內部裡面是需要的。這樣才可以知道DB要連線到哪一台主機。

步驟三

完成建置DB Instance之後,我們就要來使用先前建置好的EC2機器來進行連線到我們建置好的DB Instance把這兩個連接起來。

從這裡開始會跟Lab上面的會有出入,因為如果是以這篇的EC2主機的話,用的是Ubuntu的主機,所以這篇下面也是以Ubuntu的主機作為基礎。

而Lab上面的則是以:yum等指令為主。

首先先用SSH連線到主機。


ssh -i "your-key-pair-file.pem" user-name@ip-address

更新mirror連結與位址


sudo apt-get update

安裝 Nginx以及PHP


sudo apt-get install nginx

在瀏覽器輸入IP Address得到下面的頁面。

安裝MySQL server


sudo apt-get install mysql-server

會要求設定root password

連線到剛剛我們設定好的MySQL DB Instance


mysql -h db.choi5coyenv6.us-west-2.rds.amazonaws.com -u your-user-name -p

登入成功之後,如下圖所示。

執行查找Database name


select database();

接著會如下圖所示。

安裝:php-cli, php-fpm, php-mysql等套件。


sudo apt-get install php-cli php-fpm php-mysql

安裝(可選/參考)php-curl, php-mcrypt等套件。


sudo apt-get install php-curl php-mcrypt

編輯php.ini檔案並找到下面的設定值改成0


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

# In php.ini 檔案中找到下面的值改成0

cgi.fix_pathinfo=0

重新啟動php-fpm的服務


sudo systemctl restart php7.0-fpm

# 等價下列的command,兩者皆可,上面印出的訊息較多。

sudo service restart php7.0-fpm

設定Nginx config file設定檔


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

#  把檔案改成下列的形式

# 要改的地方為:index.php, server_domain_or_IP

# location ~ \.php$ 以及 location ~ /\.ht的部份

&nbsp;

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;
}
}

測試Nginx 的語法是否正確,語法正確後,接著重新啟動Nginx服務


sudo nginx -t

sudo service nginx restart

接下來建造一個PHP 測試檔案,如下指令。


sudo vim /var/www/html/info.php

info.php內容


<?php

phpinfo();

接著就會看到類似下面的圖phpinfo的圖了。

測驗完成之後,記得把測試檔案刪除。


sudo rm /var/www/html/info.php

參考資料
相關文章
  • Create an alarm in CloudWatch and SNS service (Lab 1 continuation)
  • Launch Your Amazon Simple Storage Service(S3)(Lab 2)

如何將 WordPress 升級與安裝外掛時繞過 FTP

前言

這是一個常見的WordPress問題

很多人常會遇到,這裡稍微紀錄一下發生的原因還有解決的方式。

  1. 權限問題:放置WordPress的目錄權限有誤
  2. wp-config.php尚未設定正確

解決方式

  1. 權限問題,將wp-contentwp-includes目錄改為擁有者與群組為:www-data:www-data
sudo chown -R www-data:www-data /var/www/wordpress/wp-content/
sudo chown -R www-data:www-data /var/www/wordpress/wp-includes/
  1. wp-config.php檔案裡加入下列設定
define('FS_METHOD', 'direct');

總結

此為常見的WordPress問題,很多人剛開始入門的時都會遇到,經過這一次,筆者也有遇過數次,有時後也會忘記解決的方式,因此特別將此解決的方法寫成一篇文章並做成筆記供日後可以參考。

安裝ThinkFan風扇控制軟體

在Ubuntu 16.04上安裝ThinkFan風扇控制軟體

此篇文章主要是紀錄我在X201 上的Ubuntu 16.04 安裝ThinkFan

概要

  1. ThinkFan介紹
  2. 安裝方法
  3. 結論

ThinkFan介紹

ThinkFan 是一款ThinkPad上用來控制風扇的一種方法。
在Ubuntu 上有提供工具可以安裝與設定

安裝方法

前置條件

  1. 假設使用的是:Ubuntu 16.04
  2. 使用ThinkPad X201
  3. 對Ubuntu 有一定的了解

安裝步驟

  1. 執行更新鏡像來源
sudo apt-get update
  1. 安裝ThinkFan
sudo apt-get install thinkfan
  1. 設定ThinkFan(開啟ThinkFan的控制權)
sudo echo "options thinkpad_acpi experimental=1 fan_control=1" | sudo tee /etc/modprobe.d/thinkpad_acpi.conf
  1. 修改ThinkFan設定檔,把設定檔的最下面兩行註解拿掉
# 先用vim 開啟檔案
sudo vim /etc/thinkfan.conf
# 把設定檔的最下面兩行註解拿掉
tp_fan /proc/acpi/ibm/fan
tp_thermal /proc/acpi/ibm/thermal (0, 10, 15, 2, 10, 5, 0, 3, 0, 3)
# 先用vim 開啟檔案
sudo vim /etc/default/thinkfan
#把 START=no 改成 START=yes
  1. 筆電重新啟動並啟動ThinkFan服務
sudo service thinkfan restart
  1. 設定Fan的轉速
# 最大風速
echo level 7 | sudo tee /proc/acpi/ibm/fan
# 風速自動
echo level auto | sudo tee /proc/acpi/ibm/fan

參考文章

  1. 安裝ThinkFan風扇控制軟體
  2. How_to_control_fan_speed
  3. THINKPAD X220 UBUNTU CONFIGURATION GUIDES

How to improve my PHP library?

Introduction

In this article, I reflect on my open source project and try to find the way to improve it.

Table Of Contents

  1. The Code Style
  2. The Dependencies
  3. The PHP version
  4. Conclusion

The Code Style

  1. The code standard is under the PSR-2 and use the StyleCI to fix them automatically.
  2. the code space which is before -> and after -> is terrible.

The Dependencies

  1. The project contains the two branches.The one is Guzzle 5 and another one is Guzzle 6.I think it’ fine.
  2. The Guzzle 5/6 should not skipp the certification checking.Maybe let users fix this or add the cacert.pam in project.

The PHP version

  1. The PHP 5 and PHP 7 is fine, but I think add the recommendation to use the PHP 7.

Conclusion

In this article, I reflect on my project and try to make the project better.

If you have any suggestions, please feel free to send the comments to let me know.

Thanks.

The currency API lists

Introduction

In this article, we present the lists about the currency lists.
This lists are important for me because they will be our next PHP projects.

Table Of Contents

  1. What’s Currency?
  2. Currency Lists
  3. Conclusion

What’s Currency?

According to the wiki, it says that exchanging the money.There are many countries and they usually use the different currency in their conuntry.For instance, the USA uses USD and the Taiwan uses the TWD.

Currency lists

In this section, we just present the currency lists here. It provide us to refer and prepare for our next PHP projetcs.The currency lsist are as follows:

  1. CurrenCyconverterApi
  2. JsonRates
  3. dlvrit
  4. Fixer.io
  5. the references

Conclusion

In this article, we present the currency lists for us and show everyone who want to know the currency services.

If we complete the project, the article will be updated.