在虛擬主機上設定 SSL/TLS 與啟動 HTTPS 的方法

可喜可賀,最近的獅子免費主機終於回歸了!在回歸之於,馬上註冊了一個帳號,看起來還不錯, cPanel 也是新版的。

接著也開放了可以安裝 SSL/TLS 的憑證了。以前大都是要買憑證並透過有公信的 CA 才有合法的憑證,現在有免費的方案可以選擇,有 WoSign (沃通) 與  Let’s Encrypt 可以選擇,前者是大陸(恩..),後者大家可能比較有聽過,官方網站在這裡,所以我們本篇文章就以獅子主機與使用 Let’s Encrypt 為例子,來教大家如何安裝這個免費的憑證。

第一步:先登入獅子主機

這一步我想大家都應該會,先跳過,登入之後先切換到 cPanel。畫面會長下圖這個樣子。

cpanel

如果沒有註冊的話,可以註冊一個,使用免費的方案與一個子網域來作使用。

第二步:到 sslforfree.com

這個網站可以幫助你申請 Let’s Encrypt ,因為 Let’s Encrypt 對於虛擬共享主機 (shared hosting) 是不友善的,還好國外有人做出網站可以幫助我們順利取得 Let’s Encrypt 的憑證。

進到網頁的畫面之後,一開始就有一個地方可以輸入你的網址,就把網址輸入進去並按下:Create Free SSL Certificate 按鈕。

sslforfree

 

接著等待一段時間之後,就會跑出下面的畫面了,有兩種方式可以驗證你的網域,第一種是網站幫你登入 FTP 自動幫你驗證。

第二種是手動驗證下載所需的檔案並上傳至利用FTP上傳至你的虛擬主機上。

這邊是強烈建議使用自動認證,原因是不用把檔案下在回來手動上傳檔案上去。因此我們選擇 Automatic FTP Verification 的按鈕

sslforfree

 

這裡會要求你填寫使用者名稱與密碼,至於目錄那一欄可以不必填寫沒有關係,因為他自己會自動偵測到預設家目錄上。

填寫完以後,就可以按下 Download Free SSL Certificate 的按鈕了。等一段時間之後,就會出現如下的畫面,分成兩部分來說明:

第一部分是,這裡可以申請一個帳號來作為管裡每個網域的憑證,憑證有效期限為每三個月,因此需要每三個月做一次更新,憑證才會有效。

sslforfree

 

若有帳號的話,憑證的時間快過期的時候,網站也會發信到你的帳號信箱做提醒。

第二部分是,有三個欄位,分別是 憑證,私鑰與 CA 檔。下面的按鈕是可以下載一個壓縮檔,裡面會有這三個檔案。

這邊我們不需要用到,我們可以分別去複製這三個檔案,將這三個檔案放到 cPanel 中的 SSL/TLS server。

sslforfree

我們轉到 cPanel 控制畫面,點選安全性分類下的 SSL/TLS。

cpanel

進去之後,按下:管理 SSL 網站,下面有三個地方可以貼,分別是: 憑證,私鑰與 CA 檔。下面可以選擇網域,選擇好之後我們把剛剛所產生的憑證,私鑰與 CA 檔 這三個檔案分別匯入進去。

接著按下安裝憑證,就可以了。

cpanel

 

我們看一下有沒有裝好,開 web browser 並輸入網址,看到下圖這樣,就成功囉!

httpsurl

[後記]

sslforfree.com 登入帳號之後可以看到所有申請的網域,這邊就可以進行 renew (續約憑證) 等相關的動作了。

sslforfree

 

[參考文章]

[免費]SSLforFree 免費ssl憑證:https://changken.biz/969

更換預設 phpMyAdmin 登入網址

我們在 Linux/Ubuntu 下,安裝使用 LAMP (Apache, MySQL/MariaDB, PHP) 或是 LEMP (Nginx, MySQL/MariaDB, PHP) 這樣搭配的 web server 在管理 MySQL 資料庫的時候會不熟,則需要安裝  phpMyAdmin 作為管理 MySQL 管理 web 介面,通常在 Ubuntu 下用下面的指令安裝即可:


sudo apt-get install phpmyadmin

安裝完成之後,輸入網址:http://example.com/phpmyadmin 就可以使用了。

平常一般人都知道只要進入這個網址就是可以進入 phpMyAdmin,尤其是再有允許外連的時候,容易造成安全上的問題,因此,為了避免這樣的情形發生,通常會限制 IP 允許登入 phpMyAdmin,不過,限制 IP 有一個缺點,萬一在 IP 以外的地方要連線登入就有問題了,因此,我們需要使用這篇所要的教學,把預設的路徑改掉。

這裡只先教 Apache 的做法,如果需要 Nginx 的話,可以參考下面參考文章的做法。

第一步:修改設定檔


sudo vi /etc/phpmyadmin/apache.conf

第二步:開啟設定檔之後,把它改成下列的樣子:


# Alias /phpmyadmin /usr/share/phpmyadmin

# /my 可以改成自己想要的形式
Alias /my /usr/share/phpmyadmin

附上圖片參考

phpmyadmin

[注意]

若是看參考文章中,後面還有一個步驟要利用下面的指令,加入一行到 apache2.conf 的設定檔,接著再重新啟動 Apache server 。


echo "Include /etc/phpmyadmin/apache.conf" >> /etc/apache2/apache2.conf

我加了之後,重新啟動 Apache 時會出現錯誤:


The Alias directive will probably never match because it overlaps an earlier Alias

所以我上面這一步驟沒有做,不過還是可以 work ,記得要重新啟動 Apache service 即可。

驗證一下,就可以知道有沒有成功了。原來的 /phpmyadmin 就會變成 404 Not found 了。下圖為最後文章中所驗證的方法。

Secure-PhpMyAdmin-Login-Page

[參考文章]

How to Change and Secure Default PhpMyAdmin Login URL

Zend Framework 2 建立自己的 Module (5)

本篇文章是要來介紹有關於文字翻譯,還有頁面的樣式

Styling and Translations

有關於頁面上的文字內容都可以進行對應的翻譯,可以到:/path/to/project-name/module/Application/language 查看 en_US.po 檔案

po 副檔名檔案是一種翻譯類型的檔案,因此需要特殊的 editor 才能夠打開,我們這邊要先去下載一個 poedit 這個編輯氣是屬於跨平台的,進入官網之後是很容易找到下載點的。

下載回來之後,安裝並打開,會看到介面如下面的截圖:

poedit

我們按下開啟打開 en_US.po 檔,就可以進行編輯的動作,按照下面的圖把 skeleton application “翻譯" 成 “tutorial"

poedit

接著存檔之後,檔案選單中有一個編譯成 MO 檔,改完之後都需要編譯成新的 MO 檔

接下來是 styling 的部分,就是樣式的地方,每次在頁面出來的時候,都會有:© 2005 – 2016 by Zend Technologies Ltd. All rights reserved. 這個 copyright 的文字。

為了要把它移掉,我們需要去編輯:/path/to/project-name/module/Application/view/layout/layout.phtml

並移除:<p>&copy; 2005 – <?php echo date(‘Y’) ?> by Zend Technologies Ltd. <?php echo $this->translate(‘All rights reserved.’) ?></p> 這一行。
接著再打開頁面之後,那一行 copyright 文字就會不見了。

album

Zend Framework 2 建立自己的 Module (4)

Database and models

在這裡,我們使用了:Zend\Db\TableGateway\TableGateway 做為對資料庫中的資料表進行新增,查詢,修改以及刪除。

我們使用 MySQL 並透過 PHP 的 PDO 層作為存取資料庫,我們先建立一個名為:zf2tutorial 的資料庫作為資料庫的名稱,接著執行下面的 SQL 檔的指令

The model files

Zend Framework 並沒有提供 Model 之類的 component 原因是因為這部分是我們自己的商業邏輯,我們需要自己寫的

我們建立一個名為 Album.php 並放在 /path/to/project-name/module/Album/src/Album/Model 目錄下

Album.php

在 Album.php 中,就只有一個簡單的 Album class 我們為了要與 Zend\Db 中的 TableGateway 運作正常,因此我們需要實做 exchangeArray() 方法,這個方法可以簡易的從另一個項目設定中去複製一個陣列中的資料,並把資料可以印出在 view 上 (或表單)

我們建立了一個 AlbumTable.php 檔在: /path/to/project-name/module/Album/src/Album/Model 目錄下

AlbumTable.php

其中裡面的方法功能介紹如下:fetchAll 就是得到一個查詢所有 Album 的集合,getAlbum 則是得到某一行的且傳回物件,saveAlbum 則是儲存一行 Album 相關的資料,最後的 deleteAlbum 則是刪除某一行指定的 Album 記錄。

Using ServiceManager to configure the table gateway and inject into the AlbumTable

修改前面的 Module.php,位置在:/path/to/project-name/module/Album/Module.php

接下來要加入有關資料庫登入的驗證資訊,所以我們要分別編輯:/path/to/project-name/config/autoload/global.php 與 /path/to/project-name/config/autoload/local.php

global.php

就是加入 db 資料庫相關的,像這裡就是定義 PDO 的,下面則是加入 servive_manager 與 Zend\Db\Adapter\Adapter 內建操作資料庫有關的。

local.php

則是填入登入 MySQL 的驗證資訊,如帳號與密碼。

 

Back to the controller

Listing albums

 

AlbumController.php 前面已經有使用過了,在這裡可以看到一些註解,可以知道加了哪幾行。

index.phtml

下面是有關於視圖 (view) index.phtml 的 code

由 index.phtml 得知:

We always use the escapeHtml() view helper to help protect ourselves from Cross Site Scripting (XSS) vulnerabilities (see http://en.wikipedia.org/wiki/Cross-site_scripting).

我們常會使用 escapeHtml() 來防止跨站腳本的漏洞。

 

最後,輸入網址:http://localhost/project-name/public/album 就會看到如下的畫面

user-guide.database-and-models.album-list

 

到這裡就完成了一個簡單的表格列出專輯清單,下一篇我們會介紹:Styling and Translations 樣式與翻譯。

Zend Framework 2 建立自己的 Module (3)

繼 前一篇文章  我們初步建立了 Module 與設定,接下來要介紹 Routing 與 Controllers

Routing and controllers

依照官方的文件,我們列出下列的表格,分別去描述 Page 名稱與敘述頁面 (Page) 所要做什麼事情

(Page)頁面名稱 (Description)描述
Home edit與delete做為可以編輯與刪除的動作
Add new album (form)做為一個新增專輯
Edit album (form)可以編輯專輯
Delete album (delete)專輯

從上面得知,我們有四個頁面,那每個頁面有相對應的動作,我們把每個動作寫在同一個 Controller (控制器)中,在 Controller 類別中,建立四個方法分別去對應上面表格中的四個動作。

Page Controller Action
Home AlbumController index
Add new album AlbumController add
Edit album AlbumController edit
Delete album AlbumController delete

編輯 /path/to/project-name/module/Album/config/module.config.php

從 code 得知,我們加入了一個 Controller 名字叫做:AlbumController 與一段 code 做為:router 路由網址,而下列的表格為路由網址:

URL Page Action
/album Home (list of albums) index
/album/add Add new album add
/album/edit/2 Edit album with an id of 2 edit
/album/delete/4 Delete album with an id of 4 delete

Create the controller

一般來說 Controller 的命名為:{Controller name}Controller

/path/to/project-name/module/Album/src/Album/Controller

網址對應的動作為:

URL Method called
http://zf2-tutorial.localhost/album Album\Controller\AlbumController::indexAction
http://zf2-tutorial.localhost/album/add Album\Controller\AlbumController::addAction
http://zf2-tutorial.localhost/album/edit Album\Controller\AlbumController::editAction
http://zf2-tutorial.localhost/album/delete Album\Controller\AlbumController::deleteAction

Initialise the view scripts 初始化視圖(樣版)腳本

  • /path/to/project-name/module/Album/view/album/album/index.phtml
  • /path/to/project-name/module/Album/view/album/album/add.phtml
  • /path/to/project-name/module/Album/view/album/album/edit.phtml
  • /path/to/project-name/module/Album/view/album/album/delete.phtml

修改 /path/to/project-name/module/Album/config/module.config.php

下一篇則會介紹:建置資料庫與模型 (Model) 的關係

Zend Framework 2 建立自己的 Module (2)

前置作業

先參考前一篇,把 skeleton (骨架) application 的建立

我們遵照線上文件,把 Module 建立起來,我們建立一個 Module 名稱為 Album 其目錄架構如下:

 

project-name/

—–/module

 ———-/Album

—————/config

—————/src

——————–/Album

————————-/Controller

————————/Form

————————/Model

—————/view

——————–/album

————————/album

由上面的目錄架構得知,最上層的專案根目錄為:project-name 而 module 是下一層目錄,接下來是 Album 我們取的目錄名稱,再下一層有 config, src 以及 view 這三個目錄。

而 src 目錄下又有 Album 目錄,Album 目錄下又有 Controller, From 以及 Model,而 view 目錄下面有一層 album 再下一層有 album。

 

Module.php

建立一個 PHP 檔名為 Module.php  把它放在:/path/to/project-name/module/Album/Module.php 程式碼如下:

 

Autoloading files

自動載入用,因為我們在開發的階段,因此只要建立一個 PHP  檔,其路徑:/path/to/project-name/module/Album/autoload_classmap.php 程式碼如下:


<?php return array(); ?>

 

Module Configuration

建立一個 module.config.php 並放在:/path/to/project-name/module/Album/config 程式碼如下:

 

Informing the application about our new module

修改 application.config.php 其位置在:/path/to/project-name/config/application.config.php 加入一行 ‘Album’ 做為啟用 Album 模組
下一篇介紹:Routing and controllers

Zend Framework 2 建立 skeleton application (1)

Zend Framework 2 wiki 介紹

簡單說,這個框架是一個以 MVC 為基礎的框架,MVC 在這篇已經超出範圍,所以不在這裡去贅述,有興趣可以去找找資料

線上文件連結:http://zf2.readthedocs.io/en/latest/index.html

使用 Composer 下載 Zend Framework


#下載 Composer

curl -sS https://getcomposer.org/installer | /path/to/executable/php

#執行 composer.phar 產生一個 Zend Framework 的 skeleton application 專案

#參考文章: http://zf2.readthedocs.io/en/latest/user-guide/skeleton-application.html

php composer.phar create-project --stability="dev" zendframework/skeleton-application path/to/install

從上面可以得知,下載完之後的專案為一個正在開發的 skeleton 骨架 application

在這篇的文章中,會請你去設定 Apache 的 VirtualHost 去更改網址,如不要的話,或是有一些共享主機 (shared hosting) 並不允許你去更改 httpd.conf 的設定,所以這在部署上顯得較為困難,因此,如不改的話,其實可以連上 http://your-domain.com/project-name/public 就會看到下面有著與文件上一模一樣的截圖,有出現一模一樣的截圖就代表設定成功了。

user-guide.skeleton-application.hello-world

 

可以試著測試預設的 route 有沒有正常的運作試著輸入網址:http://your-domain.com/project-name/public/123 就會出現下面的 404 Not found

404

 

Error reporting

可以編輯 public 目錄下的 index.php 裡面的第四行插入下面這段 code:

其目的是在開發的階段可以立即的在網頁上顯示錯誤,不過記得網站上線之後要將錯誤關閉


<?php
/**
* Display all errors when APPLICATION_ENV is development. (這段是插入的)
*/
if ($_SERVER['APPLICATION_ENV'] == 'development') {
error_reporting(E_ALL);
ini_set("display_errors", 1);
}
/**
* This makes our life easier when dealing with paths. Everything is relative
* to the application root now.
*/

chdir(dirname(__DIR__));

// Decline static file requests back to the PHP built-in webserver
if (php_sapi_name() === 'cli-server' && is_file(__DIR__ . parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH))) {
return false;
}

// Setup autoloading
require 'init_autoloader.php';

// Run the application!
Zend\Mvc\Application::init(require 'config/application.config.php')->run();

下一篇介紹如何建立一個自己的 Module

Git 實用技巧

在這篇文章,記錄一些使用 Git 的技巧。

回復上一個 commit (不知道 commit-id 可以使用 git log 查詢)


git reset commit-id --hard

將遠端的 commit 強制更新到指定回復的 commit 時間點


git push repo-url branch-name --force

刪除一個標籤


git tag -d tag-name

刪除遠端上的標籤


git push repo-url branch-name :reds/tags/tag-name

加入一個標籤


git tag tag-name

將一個標籤推送到遠端


git push repo-url tag tag-name

查看所有標籤


git tag

 

以上,想到再補充。

設定 CentOS 上的 MariaDB

前言

由於要使用爬蟲的關係,跟朋友借了一個 server 來存放資料使用 XD,雖然 PHP , Apache 與 MariaDB(MySQL) 已經幫我完整的安裝好了。不過需要自己設定以下則是設定的方法 :

  1. 查看 MariaDB 服務是否有啟動。
    service mariadb status
    

    沒有則自行啟動

    service mariadb restart
    
  2. 啟動完成後,登入 MariaDB ,使用者為:root 密碼為空。
    # 登入 MariaDB
    mysql -u root -p
    # 登入之後,輸入下面的 SQL 語法
    UPDATE mysql.user SET Password=PASSWORD('your-newpassword') where USER='root';
    FLUSH PRIVILEGES;
    quit
    
  3. 完成之後,重新啟動 MariaDB 服務
    service mariadb restart
    
  4. 執行 mysql_secure_installation 去做 MySQL 的安全性設定
    mysql_secure_installation
    
  5. 最後再重新啟動 MariaDB 服務

以上就是 MariaDB 的設定方法。

 

Cross compile Python for Android

前置作業 & 注意事項

  1. 產生要移植平台相對應的 standalone toolchain ,參考 Android API level (系統版本) 傳送門
  2. cross compile relative libs. link
  3. 修正 cross compile 與 auto conf 期間產生的錯誤
  4. 注意編譯需將 libs 都編譯成 static mode. (non-dynamic mode) 目的是可以方便使用,缺點是檔案大小會較大,不過動態連結,缺點是在入時會呼叫外部的 *.so 檔,Linux 底下的動態連函式庫(Dynamic link library)。(DLL) 但是手機的路徑與 Linux 預設路徑是不同的,所以使用 static mode 不外部呼叫 DLL 是最保險,不然還要去處理載入外部的路徑問題。
  5. 下載 Python source code,也可以使用 MEGA 載點的,已經修正錯誤。
  6. 如果使用自行下載的 source 編譯與 auto conf 發生錯誤,可以自行參考MEGA 載點中的 source 裡的檔案,看是如何修改的。

Python-2.7.1

  1. MEGA 載點或 Python 官網下載 source code
  2. 若從MEGA上下載,可以跳過這一點。這一點是上 patch ,MEGA 載點裡有這個檔案可以使用:python-2.7.1-cross-compile.patch
  3. 編譯 host 版本的 Python
  4. 把產生執行檔改成:
    mv python hostpython
    mv Parser/pgen Parser/hostpgen
  5. 按照下面的 android-configure bash script file

#上 patch,第 2 點

patch -p1 < /path/to/python-2.7.1-cross-compile.patch


#android-configure

#!/bin/bash

export TOOLCHAIN=/home/lab501/android-toolchain-16
export PATH=$TOOLCHAIN/bin:$PATH
export CC=$TOOLCHAIN/bin/arm-linux-androideabi-gcc
export CXX=$TOOLCHAIN/bin/arm-linux-androideabi-g++
export RANLIB=$TOOLCHAIN/bin/arm-linux-androideabi-ranlib
export AR=$TOOLCHAIN/bin/arm-linux-androideabi-ar
export LD=$TOOLCHAIN/bin/arm-linux-androideabi-ld
export STRIP=$TOOLCHAIN/bin/arm-linux-androideabi-strip
export ARCH="arm-linux-androideabi"
#export LD_LIBRARY_PATH="/data/local/tmp/_install_python/lib"
#change your shared libs'(libpython.so) path (LDFLAGS= --rpath)

./configure \
     LDFLAGS="-static -static-libgcc -fPIE -pie" \
    CFLAGS="-static -fPIE -pie" \
    --host=arm-linux-androideabi \
    --target=arm-linux-androideabi \
    --disable-shared \
    --prefix="/home/lab501/android-cross-compile-16/Python-2.7.1/_install"

make \
    HOSTPYTHON=/home/lab501/Python-2.7.1/hostpython \
    HOSTPGEN=/home/lab501/Python-2.7.1/Parser/hostpgen \
    CROSS_COMPILE=androideabi \
    CROSS_COMPILE_TARGET=yes \
    BLDSHARED="arm-linux-androideabi-gcc -shared" \

#make install...
#make -i install \
    #HOSTPYTHON=/home/lab501/Python-2.7.1/hostpython \
    #BLDSHARED="arm-linux-androideabi-gcc -shared" \
    #CROSS_COMPILE=androideabi \
    #CROSS_COMPILE_TARGET=yes

修改:setup.py 檔,設定如何 build modules

#for example, build hashlib modules
#只加入下面這兩行
#find_library_file(self.compiler, 'Modules',lib_dirs,
#       ['/home/lab501/Python-2.7.1/Modules'] )

if have_any_openssl:
#if have_usable_openssl:
# The _hashlib module wraps optimized implementations
# of hash functions from the OpenSSL library.
#comment this code. In order to cross compile hashlib.
#exts.append( Extension('_hashlib', ['_hashopenssl.c'],
# include_dirs = ssl_incs,
# library_dirs = ssl_libs,
# libraries = ['ssl', 'crypto']) )

#add this code. In order to cross compile hashlib. Important
find_library_file(self.compiler, 'Modules',lib_dirs,
['/home/lab501/Python-2.7.1/Modules'] )
#else:
# print ("warning: openssl 0x%08x is too old for _hashlib" %
# openssl_ver)
# missing.append('_hashlib')
#if COMPILED_WITH_PYDEBUG or not have_usable_openssl:
# The _sha module implements the SHA1 hash algorithm.
#comment this code. In order to cross compile hashlib.
#exts.append( Extension('_hashlib', ['shamodule.c']) )
# The _md5 module implements the RSA Data Security, Inc. MD5

參考資料

How-to-Cross-Compile-Python-and-Run-in-Embedded-System

howto-cross-compile-python-25

後記

build modules :要自己去調整 setup.py 要試試看,有可能會調整失敗,try and error.