如何在Ubuntu 18.04上安裝與管理多個PHP 7.x版本

前言

最近幾天,看Ubuntu 18.04也出一段時間了,後來也出了「Ubuntu 18.04.01」的版本。

看起來也成熟了,所以就從Ubuntu 16.04升級到Ubuntu 18.04了。

在本文章中,我們除了使用「PHPBrew」可以安裝與管理多個PHP版本之外,也可以直接安裝使用「apt-get」等相關指令在本機系統上安裝與管理多個PHP7.x的版本。

至於,PHP5.x版本嘛…..就沒有要敘述了

因為PHP 7.x是目前官方維護與主力的版本,所以就以PHP7.x為主要的版本作為教學。

前置環境

首先需要有下列的環境才可以繼續後面的步驟。

  1. 一個完整乾淨的Ubuntu 18.04

匯入第三方套件庫

因為Ubuntu 18.04官方預設PHP版本只有7.2,但是我們需要多個版本。

因此我們就需要仰賴第三方的套件來源庫幫助我們達成這件事情。

依序執行下列三個指令即可將第三方套件庫匯入。

在加入第三方套件來源的「add-apt-repository」指令中,在Ubuntu 18.04開始,會在加入後自動執行更新套件來源的動作,因次指令「sudo apt-get update」變成可做與可不做。


sudo add-apt-repository ppa:ondrej/php -y

sudo apt-get update

那有出現類似下面的截圖,就代表已經成功的把此第三方PHP來源套件成功匯入了。

接下來,我們可以透過下面的指令搜尋到有關的PHP套件。

不過裡面居然還有收錄「PHP-5.6」的,讓我深感意外……


sudo apt-cache search php | grep "php7.*-cli"

sudo apt-cache search php | grep "php5.*-cli"

分別執行這兩個指令之後,就會得到下面的截圖結果。

安裝PHP 7.0

把我們需要的PHP 7.0都匯入好之後,接著就可以安裝要的PHP版本了。

依照下面的指令來安裝PHP 7.0相關的擴展


sudo apt-get update

sudo apt-get install php7.0

當然,有些擴展可能我們會沒有安裝到,需要執行指令來另外安裝。

比如說,我們想要名為「mbstring」擴展,就要執行下面指令安裝。


sudo apt-get update

sudo apt-get install php7.0-mbstring

注意到了嘛?上面是示範安裝「PHP 7.0」部份,我們不難發現,若是要安裝其他的版本,則只要將「7.0」改成「7.1」,「7.2」與「7.3」等字樣即可。

在終端機上切換多個版本

在終端上「terminal」,我們可以使用下列的指令進入互動模式輕易的做到多版本切換:


sudo update-alternatives --config php

接著就會出現跟下面一樣的截圖,選擇相對應的數字即可切換到想要的PHP版本。

若是不想進入互動模式,也可以直接設定執行PHP版本路徑。


sudo update-alternatives --set php /usr/bin/php7.1

在Nginx上切換多個版本

前一章節中為示範在終端機上切換多個PHP版本,那在Nginx上也可以做到同樣的事情。

我們只要使用下面幾個步驟,即可在Nginx上面切換多個版本。

安裝Nginx

如果安裝了,這步驟可以先跳過。


sudo apt-get update

sudo apt-get install nginx

安裝相對應版本的PHP FPM

FPM, 全名是「Fast CGI process manager」,Nginx是把PHP當作Fast-CGI跑,因此需要安裝相對應PHP版本的FPM套件,我們可以使用下列指令來安裝:

安裝,PHP 7.0使用,套件名稱就是「php7.0-fpm」,PHP 7.1就是「php-7.1-fpm」,以此類推。


sudo apt-get update

sudo apt-get install php7.0-fpm

接著,修改Nginx sites設定。使用下列指令並找到下面相關的語句把註解拿掉以便啟用PHP-FPM。


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


# pass PHP scripts to FastCGI server
#
location ~ \.php$ {
include snippets/fastcgi-php.conf;
#
# # With php-fpm (or other unix sockets):
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
deny all;
}

 

其中,注意到「fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;」這行。

不難發現這是需要指定我們真正要運行的PHP 7.1的版本。那其他版本也是照之前的規則做更動。

下面的指令步驟即是在Nginx上面切換不同版本PHP-FPM,假設使用PHP 7.0


sudo update-alternatives --config php

sudo service php7.0-fpm start

# 找到有-fpm.sock等字樣並取代成相對應的php-fpm.sock

sudo sed -i 's/php7.*-fpm.sock/php7.0-fpm.sock/g' /etc/nginx/sites-available/default

sudo service nginx restart

結論

這篇文章,你已經學到了:

  1. 在Ubuntu 18.04上安裝與管理多個PHP版本
  2. 在終端機與Nginx上切換與使用不同PHP版本

參考文章與延伸閱讀

 

如何在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 上架設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

Using the Guzzle5 to access the web service in PHP

[Abstract]

Nowadays, we usually use the curl to access the web service in PHP. However, the curl does not have the useful features during accessing the web services. For example, set the timeout to restart requesting services, use the flexible parameters to build the url queries and so on.

In this article, you will learn how to use the Guzzle to make the HTTP request and access the web services in PHP. You will also learn some samples to access the mailing service and Image service.

[Introduction]

The Guzzle(https://github.com/guzzle/guzzle). It’s the PHP HTTP client and it’s on top of the PHP curl.It implements some missing features in PHP curl. You can see more details about the following link lists:

  1. The GitHub project: https://github.com/guzzle/guzzle
  2. The official documentation: http://docs.guzzlephp.org/en/stable/
  3. The Guzzle 5.3 documentation: http://docs.guzzlephp.org/en/5.3

[Prerequisite]

  • PHP Requirements: PHP 5.4+
  • To use the PHP stream handler, allow_url_fopen must be enabled in your system’s php.ini. allow_url_fopen.
  • To use the cURL handler, you must have a recent version of cURL >= 7.16.2 compiled with OpenSSL and zlib. cURL.

[Installation]

In this article, we introduce how to install the Guzzle5.3 via Composer(http://getcomposer.org/) and the steps are as follows:

  1. Download the composer.phar from the follwoing command:
    curl -sS https://getcomposer.org/installer | php
    

    Or you can download the latest composer.phar manually and check out the download section in this link: https://getcomposer.org/download.

  2. We create a project named guzzle-demo and create a composer.json in project root folder. Add the required Guzzle version in composer.json.The contents are as follows:
    {
       "require": {
           "guzzlehttp/guzzle":"5.*.*"
       }
    }
    

[Access the 3rd party web services]

In this article, we present some samples to access the MailGun and Imgur API via the Guzzle 5.

[MailGun]

MailGun is a mailing service which help us to be convenient to send the e-mail. And it also helps us to be flexible for sending e-mails.web present the curl and Guzzle5 sample code of sending e-mail are as follows:

CURL:


function send_simple_message() {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($ch, CURLOPT_USERPWD, 'api:key-your-key');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLOPT_URL, 'https://api.mailgun.net/v3/your-domain.mailgun.org/messages');
    curl_setopt($ch, CURLOPT_POSTFIELDS, array('from' => 'peter <peter279k@gmail.com>',
           'to' => 'peter <peter279k@gmail.com>',
           'subject' => 'Hello', 'text' => 'Hello World'));
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

Guzzle5:

require "vendor/autoload.php";

$client = new GuzzleHttp\Client([
    'defaults' => [
    'auth' => ['api', 'key-your-api-key'],
    ]
]);

$res = $client->post('https://api.mailgun.net/v3/your-domain.mailgun.org/messages', [
    'body'=>[
        'from' => 'peter <peter279k@gmail.com>',
        'to' => 'peter <peter279k@gmail.com>',
        'subject' => 'Hello',
        'text' => 'Hello World'
    ]
]);
var_dump($res->json());

We can notice that the CURL is more completed than the Guzzle5 because the most of options are setted by Guzzle5. We will foucus on the parameters for the requesting queries.

[Imgur]

The Imgur is the famous Image service. It provides the Good space to store the own images. The sample code which is about the uploading image via CURL and Guzzle5 are as follows:

CURL:


$client_id = "your-imgur-client-id";
$image = file_get_contents("/path/to/image.png");

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.imgur.com/3/image.json');
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Client-ID ' . $client_id));
curl_setopt($ch, CURLOPT_POSTFIELDS, array('image' => base64_encode($image)));

$reply = curl_exec($ch);
curl_close($ch);

$reply = json_decode($reply, true);

var_dump($reply);

Guzzle5:


$imageFile = file_get_contents("../imgur_result.png");

$client = new GuzzleHttp\Client([
    'defaults' => [
        'headers' => ['Authorization' => 'Client-ID 3aa5c24753e1656'],
    ]
]);

$res = $client->post('https://api.imgur.com/3/image.json', [
    'body'=>[
        'image' => base64_encode($imageFile)
    ]
]);

var_dump($res->json());

[Summary]

In this tutorial, we present the steps to let you learn how to use the Guzzle5 to access the web services.If you get the certification error during the HTTP request, you should fix the certification bundle error by yourself.

We also present the sample code to make you compare the difference of using CURL and Guzzle5.We hope the readers can replace the Guzzle with CURL for the next web application project.And using the Guzzle to access the web service easily.

[References]

  1. MailGun user manual: https://documentation.mailgun.com/en/latest/user_manual.html
  2. Imgur API documentation: https://apidocs.imgur.com

 

 

在Ubuntu 上安裝PHPMyAdmin 的要點與設定

[前言]

因為在Ubuntu 上面安裝很多次的PHPMyAdmin 了。因此想要統一紀錄安裝的過程。

以及所需要注意的事項與設定。

[安裝過程]

[前置條件]

  • 已經有一台VPS 並上面搭載Ubuntu 14.04/16.04 的版本
  • 已經初始化過Ubuntu 作業系統,請參照此篇文章
  • 已經安裝好LAMP server
  • 該升級的套件都已經升級(可選選項,可做或可不做)參考文章

[安裝步驟]


sudo apt-get update

sudo apt-get install phpmyadmin

在安裝的過程中會詢問是要設定哪一種 HTTP server ,選擇Apache 即可

[安全性設定]

  1. Change Default PhpMyAdmin Login URL 改變預設的登入網址
    預設是:domain.com/phpmyadmin
    要更改的話,只需要去:/etc/phpmyadmin/apache.conf 更改即可。
    更改的地方如下圖所示。改成 Alias /customadminname /usr/share/phpmyadmin
  2. Enable HTTPS on PhpMyAdmin 在PHPMyAdmin 下啟用HTTPS
    通常HTTP/HTTPS 下拜訪 PHPMyAdmin都是允許的。
    為了防止密碼被有心人士監聽看光光,所以啟動HTTPS 是有必要的。
    主要是有兩種方式可以啟用HTTPS。
    使用 Let’sencrypt, 自行簽章, 購買有效的憑證以及使用DNS 代管(Cloudflare 的中介 HTTPS)。
    本章節主要是使用Cloudflare 的 HTTPS。因此只需要改動 /etc/phpmyadmin/config.inc.php 檔。
    更改的方式如下圖,加入 $cfg[‘ForceSSL’] = true;
  3. Password Protect on PhpMyAdmin 使用http-basic auth 保護 PHPMyAdmin
    這裡需要用到:htpasswd 這個指令,需要用到 apache2-utils。
    需要額外安裝,使用 sudo apt-get install apache2-utils 來安裝。
    在/etc/apache2/sites-available/000-default.conf 加入使用HTTP-Basic-Auth 的設定

    <Directory /usr/share/phpmyadmin>
    AuthType Basic
    AuthName "Restricted Content"
    AuthUserFile /etc/apache2/.htpasswd
    Require valid-user
    </Directory>
    

    接著設定帳號, 密碼以及相關檔案的權限

    sudo htpasswd -c /etc/apache2/.htpasswd yourusername
    # specify user/group permissions
    sudo chmod 640 /etc/apache2/.htpasswd
    sudo chgrp www-data /etc/apache2/.htpasswd</pre>
    <pre>

    設定完成後,再去拜訪網站就會要輸入帳號與密碼了。(如下示意圖)

  4. Disable root Login to PhpMyAdmin 停用使用者 root 方式登入 PHPMyAdmin
    修改 /etc/phpmyadmin/config.inc.php 檔案在如下圖的位置中加入:
    $cfg[‘Servers’][$i][‘auth_type’] = ‘cookie’;
    $cfg[‘Servers’][$i][‘AllowRoot’] = false;
    這兩行。

設定完之後,都需要記得將Apache 服務重啟:sudo service apache2 restart

安全性設定——Apache VirtualHost 的搭配使用

這是我參考的資料中所沒有提到的,算是自己額外加上去的。

使用VirtualHost 目的是可以使用子網域方式存取。

除了比較好記住之外,也多一層防護。

 

[參考資料]

Ubuntu 14.04 LTS 升級套件須知

[前言]

本文章適用於Ubuntu 14.04的版本。目前收錄:PHP, MySQL 等升級要領。

[前置條件]

已經使用:tasksel 套件安裝好LAMP stack。(相關指令如下)

已經安裝好相關的套件供安裝需要的套件的時候所使用。

預設的PHP 版本為:5.5.9, MySQL版本為:5.5。


# Prerequisite
# You should run the initial_ubuntu.sh script before running this bash script file.
sudo apt-get update
sudo apt-get install dialog tasksel software-properties-common
sudo tasksel install lamp-server

[本文]

本章節主要是展示:

  • PHP 5.5 升級到PHP 7.0
  • MySQL5.5 升級到MySQL 5.6

[PHP5.5 升級]


# upgrade the PHP 5.5.9 to PHP 7
sudo add-apt-repository ppa:ondrej/php

[MySQL5.5升級]


# upgrade the MySQL 5.5 to MySQL 5.7
wget http://dev.mysql.com/get/mysql-apt-config_0.8.0-1_all.deb

# The following command will ask for input:
# see more details: https://askubuntu.com/questions/750498/mysql-5-5-update-to-mysql-5-7
# Notice: I choose the MySQL 5.6 because the MySQL 5.7 encounter some unexpected problems.
sudo dpkg -i mysql-apt-config_0.8.0-1_all.deb

MySQL 在安裝設定檔時,會有選項要選擇升級的MySQL版本。(如下示意圖)

動第一個選項就好,選完選『ok』

接下來是兩者都需要做的事情:更新repo 站點網址,安裝新版的套件以及重新啟動服務


# update the packages repo url
sudo apt-get update

# intall the required packages
sudo apt-get install php7.0
sudo apt-get install php7.0-mysql
sudo apt-get install mysql-server
sudo mysql_upgrade -u root -p
sudo service mysql restart

[MySQL 升級相關問題]


# MySQL server need the logger package during starting the MySQL service.
# If not, it will encounter: " mysqld_safe --syslog requested, but no 'logger' program found. Please ensure that 'logger' is in your PATH, or do not specify the --syslog option to mysqld_safe" error.
sudo apt-get install bsdutils

# solve the MySQL server error: MySQL 5.6 No directory, logging in with HOME=/
sudo service mysql stop
sudo chown mysql /var/run/mysqld
sudo usermod -d /var/lib/mysql/ mysql
sudo service mysql start

[PHP 升級相關問題]

下面列了幾個範例,當要額外安裝PHP extensions時,所做的動作以及啟動這些extensions

供 Apache server 以及 PHP CLI(command line interface) 所使用。


# If you use the Apache server
# Disable php5 Apache module then enable php7 Apache module
sudo a2dismod php5
sudo service apache2 restart
sudo a2enmod php7.0

# If you want to install additional extension for the PHP 7
# You have to refer the following commands.
sudo apt-get update
sudo apt-get install php7.0-curl php7.0-mbstring php7.0-mcrypt

# enable the module in PHP cli
sudo phpenmod mcrypt
sudo phpenmod mbstring
sudo phpenmod curl

# After installing the required PHP extensions, you should restart the Apache service.
# Then the PHP module will successfully load in PHP Apache modules.
sudo service apache2 restart

[參考資料]

  1. PHP, MySQL 升級相關bash script
  2. https://askubuntu.com/questions/750498/mysql-5-5-update-to-mysql-5-7
  3. https://www.digitalocean.com/community/tutorials/how-to-upgrade-to-php-7-on-ubuntu-14-04
  4. https://stackoverflow.com/questions/35988990/how-to-enable-php7-module-in-apache

如何在 Ubuntu 16.04 上安裝 Squid (proxy server)

[English title:How to install Squid in Ubuntu 16.04 LTS?]

[前言]

因為做論文研究關係,需要用到 Squid 這類的 proxy server 來做網址導向(redirection)的動作。

[環境需求]

本次的Linux Distro:Ubuntu 16.04 LTS

[開始安裝!]


# 更新套件

sudo apt-get update

sudo apt-get install squid

# 複製一份設定檔,若改錯還可以把設定回復。

sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.backup

# 編輯 squid.conf

sudo vim /etc/squid/squid.conf

[squid.conf 的設定]

這邊只設定成:把指定的網址做重新導向的動作。

那我們是靠著 PHP script 來處理重新導向的動作,squid 會監聽所有的 HTTP 請求。

把他們交給 PHP 之後,接著交由 PHP 執行,接著 PHP 會去跑我們指定的 PHP script ,處理完並得到結果後進行輸出,結束。

以下是 squid.conf 的內容:除了下面有一些客製化的設定之外,基本上可以直接複製拿來做使用的。

我把 configuration (squid.conf) 貼在Gist:

以及:url_redirect.php (squid.conf 的 134行,使用 PHP script 處理導向)
作用:指的是,若連線到:www.animen.com.tw 就導向到:www.google.com.sa

[解析]

比較重要的地方是從:#custom configuration 下面開始(在 129 行開始),裡面有定義一些

requst header, 還有 url_rewrite 等。

  1. 其中的 192.169.0.1 應該要改成你自己當前電腦所使用的 IP。
  2. 如果要用:url_rewrite 把所有的請求都交給 PHP 來做處理的話,129 行到 133 行可以刪除。
    留下 134 以及 135 行即可。
  3. 若不靠 PHP scirpt 處理導向的話,請留下 129 行到 133 行。刪掉或註解 134 跟 135 行。
    129 行請換成當前電腦的 IP address (請用 ifconfig 指令查詢)。
  4. 第 129 行到 133 行,作用:當連到 www.google.com.pa 時,會自動導向到:https://google.com.tw
  5. 若要改 proxy server 的 port number,請參考第 44 行
  6. 第 101 行的 cache_mgr 是管理者 email 當有存取的動作的時候,就可以發信做通知
    當然也要設定與安裝 email server。
  7. 第 106 行的 visible_hostname 則是填寫你主機的 host name
  8. 任何設定完之後,記得要重啟 squid 服務,這樣新的設定才會生效。
  9. 因為會動到 HTTP 應用層上的東西,所以通常重啟服務會稍微久一點,是正常的。
  10. 有用防火牆的話,記得將 port 打開。(如果要允許讓外部連線的話,不用的話,這步就免了。)

[討論&後記]

雖然有一些方式,像是直接把要導向的 URL 直接的寫在 squid.conf 裡,不過就是我不太熟 bash,再加上要導向的網址很多,想說用 PHP 直接去做掉,會比較快一點。雖然效能會差一點。不過是導向靜態的內容檔案,感覺是還好的。說不定之後就會改成直接在 squid.conf 裡設定,不用 PHP script XD。

[參考資料]

Creating an HTTP Proxy Using Squid on Ubuntu 12.04

SQUID URL Redirection

Squid 官網

在 Ubuntu 16.04 上安裝舊版的 PHP5.6

[前言]

在這邊只是紀錄要怎麼安裝舊版的PHP而已,可以的話,還是用預設安裝PHP7即可。

[加入外部PPA]


sudo add-apt-repository ppa:ondrej/php

sudo apt-get update

[安裝PHP5.6以及一些phpMyAdmin所必要的extension]


sudo apt-get install php5.6

sudo apt-get install php5.6-mbstring

sudo apt-get install php5.6-mcrypt

sudo apt-get install php5.6-mysql

# 啟動 PHP modules

sudo phpenmod mcrypt
sudo phpenmod mbstring

# 打開編輯器去編輯檔案

# 並把裡面的 mysqli.allow_local_infile = On 前面的註解拿掉

sudo vi /etc/php5/apache2/php.ini

# 重新啟動 Apache2 之後,就結束了。

sudo service apache2 restart

[安裝phpMyAdmin]


sudo apt-get install phpmyadmin

新增 Apache2 VirtualHost 使用子網域以及 Freenom 免費網域的申請

最近正在煩惱著該如何部署 Laravel 到專案的子目錄下,比如說,請求的網址:http://localhost/blog 而不是 http://localhost

使用 .hatcess 之後,還是無法設定成功,讓網址可以導向到請求專案的根目錄名稱一樣也可以成功。

目前也有人有這樣的問題,於是有人在 Laravel 的 Github 的專案上開了這樣的 issue: https://github.com/laravel/framework/pull/3918 問題也是跟我相同,需要請求網址的時候可以多一個專案根目錄名稱。

目前比較好的作法是使用:Apache2 的 VirtualHost 來解決這個問題,透過設定 VirtualHost 可以解決請求網址包含專案名稱的問題。下面的教學為使用 Apache2 VirtualHost 並搭配 Freenom 免費的頂級網域名稱來做到。

作業系統:LUbuntu 16.04 LTS

[Freenom 免費頂級網域申請]

  1. 進入 freenom.com 網站。
  2. 輸入一個沒有人註冊的網域名稱並按下『檢查可用性』,如下圖。
    %e5%bf%ab%e7%85%a710
  3. 註冊或登入一個帳號,並成功拿到網域之後,進到如下的畫面:點選 My Domain 接著選擇 Manage Domain。
    %e5%bf%ab%e7%85%a711
  4. 選擇 tab 名稱:Manage Freenom DNS
    %e5%bf%ab%e7%85%a713
    在『Add record』的部份新增一個 A 紀錄,紀錄 ipv4 位址。Name 空白以及在 Target 的地方,填寫自己的固定 ip 位址所以只適合 VPS 或實體有固定 ip 的主機。(TTL 數值可以用預設就好,不用修改它)
  5. 填寫完成之後,按下 Save Changes 按鈕,等一段時間之後,就會出現『Record added successfully 』就代表成功加入一筆紀錄了。
  6. 增加完 A 紀錄之後,就可以知道使用網域名稱來 request url 而且不需要打 ip 位址了。
  7. 接著再新增 CNAME 紀錄,用來做子網域使用,讓外面連進來的人也可以使用子網域連線(搭配 VirtualHost 使用)。
  8. 新增 CNAME 紀錄範例如下圖:
    %e5%bf%ab%e7%85%a714

[VirtualHost 設定]

  1. 需要先安裝好 Apache2 或是 LAMP server 可以參考之前的文章
  2. 照下面新增一個目錄(以 blog.peter279k.tk)
    sudo mkdir -p /var/www/blog.peter279k.tk/html
    
  3. 設定 permissions 權限,這裡可以將使用者權限設定成:www-data
    sudo chown -R www-data /var/www/blog.peter279k.tk/html
    
  4. 編輯一個測試的設定 HTML 檔。
    vi /var/www/blog.peter279k.tk/html/index.html
    
    <html>
    <head>
    <title>Welcome to Example.com!</title>
    </head>
    <body>
    <h1>Success! The example.com virtual host is working!</h1>
    </body>
    </html>
    
    sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/blog.peter279k.tk.conf
    
    # blog.peter279k.tk.conf
    <VirtualHost *:80>
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.
    #ServerName www.example.com
    
    ServerAdmin admin@blog.peter279k.tk
    ServerName blog.peter279k.tk
    ServerAlias www.blog.peter279k.tk
    DocumentRoot /var/www/blog.peter279k.tk/html/blog/public
    
    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    #LogLevel info ssl:warn
    
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    
    <Directory "/var/www/blog.peter279k.tk/html/blog/public">
    AllowOverride All
    </Directory>
    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf
    </VirtualHost>
    
    

    DocumentRoot 和 Directory 需要指定自己的 folder 指定到哪個目錄,網域名稱也需要改成自己改的名稱。

  5. 啟動 site 並重新啟動 Apache2 服務,即完成了。
    sudo a2ensite blog.peter279k.tk.conf
    sudo systemctl restart apache2
    

VirtualHost 設定參考文章:https://www.digitalocean.com/community/tutorials/how-to-set-up-apache-virtual-hosts-on-ubuntu-14-04-lts