2015年9月22日 星期二

WordPress Crash After Change IP Address

WordPress Crash After Change IP Address


簡述

一般不會有這樣的問題, 因為大部份正式的 WordPress 站台都會使用 domain name 來當站台的網址而不是使用 IP address。但對於使用 IP address 當網址的 WordPress 站台, 一旦 IP address 有所變動, 那 WordPress 站台鐵定掛點。
本文列出一些資料修正的方法, 主要是更改 WordPress 資料庫中網址的欄位, 讓 WordPress 站台能夠重新站起來。

處理步驟

Case 1: 單一獨立 WordPress 站台

1. 備份站台資料庫並登入 MySQL 準備修改內容:
$ sudo mysqldump -uUser -pPassword myWPDB > myWPDB.sql
$ mysql -uUser -pPassword
mysql> use myWPDB

2. 檢查目前的資料, 確認要如何修改:
mysql> SELECT * FROM wp_options WHERE option_name IN ('siteurl','home');
# 輸出結果類似以下內容
+-----------+-------------+---------------------+----------+
| option_id | option_name | option_value        | autoload |
+-----------+-------------+---------------------+----------+
|         2 | home        | http://1.123.111.55 | yes      |
|         1 | siteurl     | http://1.123.111.55 | yes      |
+-----------+-------------+---------------------+----------+
要把其中 IP address 的部份改為新的 IP address; 其他如 http:// 或是若有子目錄的部份全都要保留下來。

3. 確認好新的 option_value 後, 執行以下指令更改資料:
mysql> UPDATE wp_options SET option_value = '新值' WHERE option_name IN ('siteurl','home');

Case 2: WordPress MU 網誌網路

1. 先使用 Case 1 的方法更改所有子網誌的內容
子網誌資料表的名稱為 wp_x_options, 例如 wp_2_options, wp_3_options.

2. 檢查以下兩個網誌網路的資料表, 確認要如何修改:
mysql> SELECT * FROM wp_site;
mysql> SELECT * FROM wp_blogs;
3. 執行以下指令修改 IP 位址:
mysql> UPDATE wp_site SET domain = '新的網址';
mysql> UPDATE wp_blogs SET domain = '新的網址';
4. WordPress MU 的 wp-config.php 設定檔裡會多一個設定值要修改:
$ sudo vi wordpress-網頁根目錄/wp-config.php
修改以下定義
define('DOMAIN_CURRENT_SITE', '新的網址');
-- valid for WordPress 4.3.1

2015年9月20日 星期日

Replace MySQL with MariaDB Installation

Replace MySQL with MariaDB Installation

簡述

Since MariaDB trends to be the open source drop-in replacement of MySQL, I'd like to try and write down how to drop-in replace MySQL with MariaDB in Ubuntu 14.04. The versions involved are mysql-server-5.5 and mariadb-server-5.5.

執行步驟


1. Backup all databases and configuration files:

$ sudo cp /etc/mysql /etc/mysql_mysql
$ mysqldump -uUserID -pPassword myDatabase > myDatabase.sql;

2. Stop services:

$ sudo service nginx stop
$ sudo service apache2 stop
$ sudo service mysql stop

3. Uninstall MySQL Packages:

$ sudo apt-get purge mysql-server mysql-client mysql-common
$ sudo apt-get autoremove
$ sudo apt-get autoclean
Some messages output: mysql-client not installed, so not removed; /etc/mysql not empty, so not removed, that's OK, don't care about it.
One thing should be cared about is php5-mysql and relative configurations also removed. We have to add them back after MariaDB installed.

4. Install MariaDB:

$ sudo apt-get install mariadb-server
An interface displayed several times during installation asking new MariaDB root user's password, just hit Enter to keep it unchanged. The installation process basically merges old MySQL database without change it.
New configuration files will write to /etc/mysql folder.

5. Stop MariaDB to do some configurations:

$ sudo service mysql stop
$ sudo vi /etc/my.cnf   

# -------------------------
# add following section to my.cnf
[mariadb]
aria_pagecache_buffer_size = 1M  # minimized mem. usage, default: 128M
character-set-server = utf8mb4   # full UTF-8 characters support
collation-server     = utf8mb4_unicode_ci    
# -------------------------

$ sudo service mysql restart
$ sudo service apache2 restart
$ sudo service nginx restart

6. Solving php5-mysql issue:

Try to connect to your WordPress sites, an error message will show up:
Your PHP installation appears to be missing the MySQL extension which is required by WordPress.
Just install it and restart Apache, your WordPress will back to alive!
$ sudo apt-get install php5-mysql
$ sudo service apache2 restart
Now I could have my WordPress run on LNAMP (Ubuntu, Nginx, Apache, MariaDB, PHP) VM web server! :D.

Ubuntu ADSL Dial Up 撥接上網設定方法

Ubuntu ADSL Dial Up 撥接上網設定方法


簡述


設定方式:

$ sudo pppoeconf     # 執行撥接設定程式

其他相關指令:

$ pon dsl-provider     # 以設定檔 dsl-provider 進行連線
$ poff                 # 中斷連線
$ plog                 # 查看連現的 log
$ ifconfig ppp0        # 查看網路撥接連線狀態

2015年9月19日 星期六

Blogger Title SEO 搜尋最佳化

Blogger Title SEO 搜尋最佳化

簡述

Google 旗下產品 Blogger 的所有預設範本在設定 Title 時把 blog 的名稱放前面, post 的標題放後面有點讓人出乎意料。因為自家的搜尋引擎搜出來的標題結果常會顯示了完整的 blog 名稱卻讓 post title 截掉一大半, 也不利搜尋者判別該文章是不是自己想找的內容。
還好 Blogger 範本是可以 customized, 剛好 Blogger 本身又提供了控制 title 名稱的語法, 透過高人提供 Blogger Title SEO 搜尋最佳化的方法可將 Blogger 文章的標題重新改為文章標題在前, 其後再補部落格名稱。

修改方式

編輯目前使用的範本(Template) 選擇 Edit HTML, 找到這一行:
<title><data:blog.pageTitle/></title>
將它替換成以下的 script 後存檔離開:
<b:if cond='data:blog.pageType == "item"'>
  <title><data:blog.pageName/> - <data:blog.title/></title>
<b:else/>
  <title><data:blog.pageTitle/></title> 
</b:if>

參考資料:

Blogger Conditional Tag — b:if and b:else
9 Killer Blogspot SEO Tips For bloggers

2015年9月17日 星期四

vi vim Editor 常用指令

vi vim Editor 常用指令

本文所列為 Ubuntu 環境下 vi vim editor 常用指令, 輸入指令前要先按 ESC 回到指令模式。指令模式下按 ESC 仍為指令模式, 多按幾次無防!
gg            # 游標移至文首
G             # 游標移至文尾
/字串          # 搜尋字串
/             # 搜尋下一個
/字串 加 \c    # 搜尋字串不分大小寫, \c 加在搜尋字串開頭或結尾皆可

2015年9月16日 星期三

Upgrade MySQL Charset utf8 to utf8mb4

Upgrade MySQL Charset utf8 to utf8mb4

For UTF-8 encoding, MySQL originally use charset utf8 which is with maximum length of 3 bytes for every character to cover 65536 unicode characters; from version 5.5.3, MySQL implements a new charset utf8mb4 which is with maximu length of 4 bytes for every character to support full UTF-8 encoding unicode characters.

For a good multilingual support in modern international internet environment, it's better to upgrade MySQL charset utf8 to utf8mb4 from now on. Also it better to change the collation to utf8mb4_unicode_ci for more correct text sorting.

Upgrade MySQL Charset utf8 to utf8mb4:

Modify my.conf default setting
New database default charset and collation
Verify existed database structure and data upgrading

Cautions:

Use varchar instead of varcher for saving disk space
Index length field should be limited to 191 but not 255 chars
Alter char-related fields' length by 4/3 to prevent data trucation after upgrade

2015年9月14日 星期一

MySQL 常用 Command Line 指令

MySQL 常用 Command Line 指令

本文所列為在 Ubuntu 環境下一些 MySQL 常用 Command Line 指令, 包含 mysql 介面的指令如 help, show, ... 等等, 及標準的 SQL 語法如 create, select, update, delete, ... 等等。

順道一提 MariaDB 是 MySQL 非 Oracle 管轄的版本, 幾乎 100% 相容於 mysql (介面指令也用 mysql), 雖然底層有用到不同技術, 但應用層面上可完全將兩者都當做是 MySQL 來使用。

MySQL 介面指令說明, 指令後不可以加註解, 指令可不用加結尾分號

mysql> help  
mysql> help functions
mysql> help contents
mysql> help <content_category_item>
mysql> help <conntet_topic_of_category_item>
mysql> help '%search_string%'
基本上, 非執行 SQL 查詢的 MySQL 介面指令都不需要以分號結尾。

Basic Information

Starting point:
# schema
mysql> SHOW {DATABASES | SCHEMAS};
mysql> SELECT * FROM information_schema.SCHEMATA;
mysql> SHOW CREATE DATABASE myDbName;

# table
mysql> SHOW TABLES [{FROM | IN} myDbName];
mysql> SELECT * FROM information_schem.TABLES WHERE TABLE_SCHEMA = myDbNAME;
mysql> SHOW CREATE TABLE myDbName.myTblName;
mysql> DESC myDbName.myTblName;

# column
mysql> SHOW COLUMNS {FROM | IN} myTblName {FROM | IN} myDbName;
mysql> SHOW COLUMNS {FROM | IN} myDbName.myTblName;
mysql> SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = myDbName AND TABLE_NAME = myTblName;
mysql> DESC myDbName.myTblName myColName;
查詢資料庫預設 character set 及 collation
# schema
SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = "schemaname";

# table 
SELECT CCSA.character_set_name FROM information_schema.`TABLES` T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA WHERE CCSA.collation_name = T.table_collation AND T.table_schema = "schemaname" AND T.table_name = "tablename";

# column
SELECT character_set_name FROM information_schema.`COLUMNS` WHERE table_schema = "schemaname" AND table_name = "tablename" AND column_name = "columnname";

EXPLAIN, DESCRIBE, DESC, SHOW COLUMNS:

mysql> EXPLAIN myTable;                    # EXPLAIN = DESCRIBE = DESC
mysql> SHOW COLUMNS FROM myTable;
mysql> EXPLAIN myTable myField;
mysql> EXPLAIN myTable '%search_string%';

USE

USE 告知 client 端之後的 SQL 語法若未指定資料庫名稱,則都是針對所選定的資料庫進行的。
mysql> USE myDatabase

CREATE

CREATE DATABASE myDataBASE CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE TABLE myTableName (myField1Name myField1Type, myField2Name myField2Type);

# create table example
CREATE TABLE birds (
bird_id INT AUTO_INCREMENT PRIMARY KEY,
scientific_name VARCHAR(255) UNIQUE,
common_name VARCHAR(50),
family_id INT,
description TEXT
);

INSERT

INSERT INTO myTable VALUES(myField1Value, myField2Value, myField3Value);
INSERT INTO myTable VALUES(myRow1Fld1, myRow1Val1), (myRow2Fld1,myRow2Val1);

# insert data example
INSERT INTO birds (scientific_name, common_name)
VALUES ('Charadrius vociferus', 'Killdear'),
('Gavia immer', 'Great Northern Loon');

SELECT

SELECT * FROM myTable;
SELECT * FROM myTable\c               # 語尾加 \c, 放棄本次輸入的語法
SELECT * FROM myTable\G               # 語尾加 \G, 查詢結果逐欄列行顯示
SELECT * FROM myTable WHERE myField = myFieldValue;
SELECT myTbl1Fld, myTbl2Fld FROM myTbl1 JOIN myTbl2 WHERE myJoinFld1InTbl1 = myJoinFld1InTbl2;
SELECT myTbl1Fld, myTbl2Fld FROM myTbl1 JOIN myTbl2 WHERE myJoinFld1InTbl2 = myJoinFld1InTbl1;

UPDATE

UPDATE myTable SET myField = myNewValue WHERE myCondField = myCondValue;
UPDATE myTable SET mySet1, mySet2, mySetN WHERE myCondField = myCondValue;

DROP

DROP DATABASE myDatabase;

資料備份

$ mysqldump -uUserID -pPassword db_name > DB_BackupFileName.sql
$ mysqldump -uUserID -pPassword db_name table_name > Table_BackupFileName.sql

資料倒帶

小心使用, 會重建 table 並重填資料!
$ mysql -uUserID -pPassword db_name < DB_or_Table_BackupFileName.sql

複製 Table 及資料

CREATE TABLE table_new LIKE table_old;
INSERT INTO table_new SELECT * FROM table_old;
或
CREATE TABLE table_new SELECT * FROM table_old;

ALERT TABLE

ALERT TABLE table_name
DROP COLUMN column_name,
ADD COLUMN column_name column_type,
ADD COLUMN column_name column_type AFTER another_column_name,
CHANGE COLUMN column_name change_to_column_name change_to_column_type,
CHANGE COLUMN old_column_name new_column_name new_column_type DEFAULT defautl_value,
ALTER column_name SET DEFAULT default_value,
ALTER column_name DROP DEFAULT;

AUTO_INCREMENT

SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_NAME = myTableName;
ALTER TABLE myTableName AUTO_INCREMENT = new_value;

參考資料:

Learning MySQL and MariaDB, Russell J.T. Dyer, O'REILLY

WordPress Tuning 及效能改進的常用小技巧

WordPress Tuning 及效能改進的常用小技巧

Disable Revision, 取消文章版本記錄功能:

1. 修改 WordPress 網站根目錄下 wp-config.php 檔
例如檔案 /var/www/html/wp-config.php 找到 //define('WP_POST_REVISIONS', true ); 這行進行修改或是直接在底下添加:
define('AUTOSAVE_INTERVAL', 300 );   // 每5分鐘自動存檔一次
define('WP_POST_REVISIONS', false ); // 存檔時不備存前一版內容
2. 進入 database 清除舊有的 revision 記錄
$ mysql -uroot -p
mysql> use myWordPressDBName;
mysql> DELETE FROM wp_posts WHERE post_type = "revision";
mysql> exit;
每個 WordPress 的子網誌有自己的資料表群組, 例如第2個子網誌的貼文資料表有可能名為 wp_2_posts, 要修改前要先確認正確的資料表名稱。

參考資料:

How to Disable Post Revisions in WordPress and Reduce Database Size

WordPress ERR_TOO_MANY_REDIRECTS

WordPress ERR_TOO_MANY_REDIRECTS


Got an WordPress ERR_TOO_MANY_REDIRECTS error when the first time visiting your new fresh installed WordPress website?
WordPress_ERR_TOO_MANY_REDIRECTS
Try following approaches, it maybe helps.

Case 1: WordPress was installed in an LAMP server

When you installed WordPress in an LAMP server, It means the Apache Server is your only httpd server, and it is responsible for the directory rewrite job for your WordPress website.

Step 1: Check Apache rewrite module is enabled!
Simply enable it in Ubuntu using following command:
$ sudo a2enmod rewrite
and you'll find a "rewrite.load" file in directory "/etc/apache2/mods-enabled" with an standard Ubuntu installation.
Step 2: Check .htaccess authorization
If your WordPress is installed in directory "/var/www/html", find the ".htaccess" file is in it with correct authorization. You could use following command to set the authorization:
$ sudo chown www-data:www-data /var/www/html/.htaccess
$ sudo chmod 644 /var/www/html/.htaccess
Step 3: Check rewrite authorization already granted to WordPress directory
If your WordPress is installed in directory "/var/www/html", edit the Apache configuration file:
$ sudo vi /etc/apache2/apache2.conf
and make sure you've granted the rewrite authorizaiton to the WordPress directory something like:
<Directory /var/www/html>
        AllowOverride All
</Directory>
Step 4: Verify .htaccess file again if you installed WordPress as an WordPress MU (WordPress Nework)
Go to the control panel of WordPress where you clicked to install WordPress Network previously, and make sure you've followed it's instruction to modify the .htaccess file.

Case 2: WordPress was installed in an LNAMP server

When you installed WordPress in an LNAMP server, it usually means you use Nginx server as an reverse proxy httpd server and proxy requests to Apache server. It will be more easy and flexible when you leave the rewrite job to Apache server.
Step 1: Verify every steps in case 1 are set!
Apache server still responsible for WordPress directory's rewrite job.

Step 2: Pass the WordPress directory request to Apache server from Nginx
By the Nginx's default configuration, your WordPress request will be trapped in loop of index.php page and root directory. Just pass the WordPress requests to Apache server and everything will be fine.
Try to add following codes as a final location search rule to your "/etc/nginx/sites-available/default" file if your Nginx is an standard installation in Ubuntu:
        location ~ ^/.* {
                proxy_pass http://localhost:8080;
                include proxy_params;
        }
The http://localhost:8080 in the example should be changed to http://YourServerDomainName:YourApachePortNumber.

Hope this helps!
Relative article

2015年9月12日 星期六

WordPress sitemap Apache .htaccess Rewrite 設定

WordPress sitemap Apache .htaccess Rewrite 設定

簡述


LNAMP LAMP 架構下 WordPress MU WordPress Nework 網誌網路使用 Yoast SEO sitemap XML網站地圖 時 Apache 後台的 .htaccess rewrite 規則定義檔的設定方式, Nginx 不使用此檔
檔案位置: /網站根目錄/.htaccess
包含 WordPress rewrite 規則、Yoast SEO 外掛中 sitemap 的 rewrite 規則, 並已考慮 WordPress MU 子目錄架構的狀況。內容定義如下:
# BEGIN WordPress

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

# Yoast SEO sitemap rewrite rule for WordPress - start (by rex)
RewriteRule ^([^/]+/)*sitemap_index.xml$ /$1index.php?sitemap=1 [L]
RewriteRule ^([^/]+/)*locations.kml$ /$1index.php?sitemap=wpseo_local_kml [L]
RewriteRule ^([^/]+/)*geo_sitemap.xml$ /$1index.php?sitemap=geo [L]
RewriteRule ^([^/]+/)*([^/]+?)-sitemap([0-9]+)?.xml$ /$1index.php?sitemap=$2&sitemap_n=$3 [L]
RewriteRule ^([^/]+/)*([a-z]+)?-?sitemap.xsl$ /$1index.php?xsl=$2 [L]
# Yoast SEO sitemap rewrite rule for WordPress - end

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]

</IfModule>

# END WordPress

2015年9月11日 星期五

[專案] LNAMP 網站重建, 根目錄移轉, 架設 WordPress 4.3 網誌網路

[專案] LNAMP 網站重建, 根目錄移轉, 架設 WordPress 4.3 網誌網路

專案日期: 2015.09.11 (五)


目的:

1. 想讓 local 端和免費空間上所建的 WordPress 網誌網路目錄結構一致, 方便在 local 編撰後再 update 到免費空間上發佈!

2. 原先網站根目錄 /var/www/html 之下的內容想先保留可切換回來的彈性。

3. 原 WordPress 網誌網路的文章資料要倒進新的網誌


專案資訊:

原網站根目錄: /var/www/html
新網站根目錄: /var/www/wordpress



執行步驟:

1. 透過 WordPress 控制台工具匯出原 wordpress 上的文章
2. 備份 Apache 與 Nginx 需修改到的設定檔:
$ sudo cp /etc/apache2/apache2.conf /ect/apache2/apache2.conf.path.html
$ sudo cp /etc/apache2/sites-available/000-default.conf /ect/apache2/sites-available/000-default.conf.path.html
$ sudo cp /et/nginx/sites-available/default /etc/nginx/sites-available/default.path.html
3. 修改 Apache 與 Nginx 的設定檔, 將錄徑 /var/www/html 改為 /var/www/wordpress
$ sudo vi /etc/apache2/apache2.conf
<Directory /var/www/wordpress>
        AllowOverride All
</Directory>

$ sudo vi /etc/apache2/sites-available/000-default.conf
DocumentRoot /var/www/wordpress

$ sudo vi /etc/nginx/sites-available/default
root /var/www/wordpress;
4. 下載 WordPress 4.3, 解壓縮, 複製程式主目錄到 /var/www/wordpress 並修改權限
$ sudo cp -r wordpresss /var/www/wordpress
$ sudo chown -R www-data:www-data /var/www/wordpress
$ sudo chmod -R 644 /var/www/wordpress
$ sudo chmod -R a+X /var/www/wordpress
5. 備份並修改 wp-config-sample.php 啟用 WordPress MU 的安裝工具
$ sudo cp /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config-sample.php.backup

$ sudo vi /var/www/wordpress/wp-config-sample.php
define('WP_ALLOW_MULTISITE', true);
6. 重啟 Apache 及 Nginx 服務
$ sudo service apache2 restart
$ sudo service nginx  restart
7. 建立新的 MySQL 資料庫, 和原站台的資料分開管理
$ mysql -uroot -p
mysql> create database newpress;
mysql> exit
8. 瀏覽器連上 VM 網址, 開始安裝 WordPress
使用新的 database 名稱 newpress,
安裝的第一個網誌將做為網誌網路的簡單入口, 先輸入與網誌網路相關標題, 之後可修改!
安裝完會要求以設定的帳密登入, 登入後會直接進到控制台

9. 安裝網誌網路:
控制台 --> 工具 --> 網誌網路安裝
設定 "網誌網路標題"
如果連線時是使用 IP 而非 domain name, WordPress 會直接認為初始安裝是用子目錄, 所以網誌網路的架構只能用子目錄而不能使用子網域;因為本來就想用子目錄方式安裝, 所以不影響!
點選 "安裝" 按鈕後會提示要備份和修改 .htaccess 和 wp-config.php 檔, 照做!
$ sudo cp /var/www/wordpress/.htaccess /var/www/wordpress/.htaccess.backup
$ sudo cp /var/www/wordpress/wp-config.php /var/www/wordpress/wp-config.php
修改完後重新登入 WordPress
10. 修改 nginx 的設定檔, 解決已知 WordPress 架在 LNAMP 下會出現的重複導向問題
$ sudo vi /etc/nginx/sites-available/default  # 注意 location 設定的順序會影響結果
// location 原 /
// location 自訂 .php
// location 自訂 cache
// location wp-admin
location ~ (^(?:/[^/]+)?/wp-admin$) {
        rewrite (.*) $1/;
}
// location 自訂 / 
location ~ ^/.* {
        proxy_pass http://localhost:8080;
        include proxy_params;
}
有些設定看似多餘, 是為了讓設定項目看起來和原先版本的架構較一致方便比對, 兩個版本的設定檔都有適合使用的地方, 都要保存起來參考。

11. 使用和免費空間上一致的子目錄名稱建立一個新的子網誌並匯入備存的既有文章
日後重新匯入時要先刪除文章、頁面、標簽、分類並清除相關回收桶資料才不會重複!

安裝後出了一個後來覺得很糗的問題:
架好後出現以下無法存取的情況, 一直想不通是啥原因!

Not Found

The requested URL /lnamp/wp-admin/ was not found on this server.
Apache/2.4.7 (Ubuntu) Server at 192.168.227.134 Port 8080
看錯誤訊息是來自 Apache 無法讀取 /lnamp/wp-admin/ 這個偽靜態網址。
其實一開始就猜可能是 Apache 那邊設定的問題, 因為根據之前使用的經驗 Nginx 這邊最多只需處理一個因 LNAMP 架構多出來的一個問題, 要負責把 /lnamp/wp-admin rewrite 成 /lnamp/wp-admin/ 丟給 Apache 就算完成任務了,之後其他 wp-admin 的工作或是偽靜態網址的處理都是 Apache 那邊要負責的! 但一直看不出原因,所以又來回好幾次呆呆地在測 Nginx 那邊的 proxy 設定是否改錯了? /var/www/wordpress 和底下檔案及 .htaccess 權限是否設錯了? Apache 的 rewrite module 是否沒重新啟用而無效? 後來發現連主網誌的偽靜態網址也失效,確信是 Apache 那邊 rewrite 出了問題,把相關設定仔仔細細看了好幾遍最後發現是開 rewrite 權限的 <Directory> 不小心把 wordpress 打成 wordpresss 多了一個 s, 差點沒昏倒! XD


WordPress 資料庫中資料表項目

WordPress 資料庫中資料表項目


WordPress 資料庫中資料表項目簡單分成三組:
網誌網路子網誌獨立網誌網誌網路主網誌
commentmetacommentmetacommentmeta
commentscommentscomments
linkslinkslinks
optionsoptionsoptions
postmetapostmetapostmeta
postspostsposts
term_relationshipsterm_relationshipsterm_relationships
term_taxonomyterm_taxonomyterm_taxonomy
termstermsterms
usermetausermeta
usersusers
blog_versions
blogs
registration_log
signups
site
sitemeta

2015年9月10日 星期四

WordPress 內嵌 Google 相簿圖片的方法

WordPress 內嵌 Google 相簿圖片的方法


方法:

1. 將 Google 相簿中要使用在 WordPress 的圖片集中在一個相簿, 將相簿分享並取得分享的網址。

2. 登出所有 Google 帳戶, 在未連接 Google 帳戶的狀態下開啟分享相簿的網址, 點開要取得連結網址的圖片, right-click 取得網址。

3. 貼圖應加上自己可搜索的圖片資訊, 例如圖檔名稱, 以防 Google 又改變策略使得連結失效時不易知道原來是連哪張圖。

注意事項:

1. 在連接 Google 帳號狀態下所取得的圖片網址是後來改版極長的網址, 這個分享網址只有已登入 Google 的用戶端才能存取得到, 未登入者會跳出 Google 帳戶登入畫面要求先登入! 所以要取得圖片網址前一定要先登出 Google 帳戶。

2. 透過 Google 相簿分享連結取得的圖片僅為縮小版的圖片, 無法連結原圖。要看原圖必需開啟分享的相簿網址, 使用其中附帶的縮放工具來放大。

另有取得原圖連結的方法是從 picasaweb.com 取得分享網址或將圖分享在 blogspot.com 的 blog 上從中取得分享網址, 然後將網址中一段標示縮放尺寸的 sxxxx (xxxx 為尺寸大小的數字) 改為 s0 即為原尺寸圖片分享位址!

測試日期: 2015.09.10

在 WordPress 文章中部份使用自訂的 CSS

在 WordPress 文章中部份使用自訂的 CSS


1. 編輯自訂的 CSS 檔, 例如 /var/www/html/mycss/rexcss01.css, 使用 rexcss01 來當 class id, 範例如下:
table.rexcss01, table.rexcss01 th, table.rexcss01 td {
border: 1px solid black;
border-collapse: collapse;
border-spacing: 0;
padding: 5px;
vertical-align: middle;
width: auto;
}
table.rexcss01 th {
text-align: center;
}
pre.rexcss01 {
background-color: black;
color: #bbbbbb;
}
檔案權限要打開讓網站服務帳號 www-data 可以存取。

2. 在 WordPress 的文章第一行載入 CSS 檔:
<link rel="stylesheet" href="/mycss/rexcss01.css">
文章使用文字模式編輯且千萬不要切換成預覽方式編輯, 不然 link 或 style 此類的 tag 和內容會被自動移除!

3. 在想要使用自訂 CSS 的 tag 上加上 class id, 例如:
<table class="rexcss01">
<thead><tr><td>左</td><td>右</td></tr></thead>
<tbody>
<tr><td>1</td><td>甲</td></tr>
<tr><td>2</td><td>乙</td></tr>
</tbody>
</table>

4. 範例所得的結果如下:
1
2

後來發現使用非正規方法在 html body 中 import CSS 檔不太適合, 因為 WordPress 的匯入工具會自動將這些語法清除。目前比較可行的辦法還是直接把自訂的 style sheet 內容加在佈景主題的 style.css 檔尾! 只是像 WordPress.com 的免費空間無法直接去修改檔案, 只能選用可自訂 CSS 內容的佈景主題!

解決 WordPress 使用 SmartAdapt Theme 時在 HTTPS 的連線下部份字型無法存取的問題

解決 WordPress 使用 SmartAdapt Theme 時在 HTTPS 的連線下部份字型無法存取的問題


問題來源是 SmartAdapt 佈景主題的部份程式碼直接寫定網址為 http:// 所以用 https 連線時就會出現內含不安全連線資源的問題!
解決方式要直接修改 SmartAdapt 佈景主題的程式:
修改以下檔案:
/wordpress/wp-content/themes/smartadapt/inc/classes/theme-options-class.php
尋找所有 http://fonts.googleapis.com 的網址
改成 //fonts.googleapis.com 這種 protocol relative URL 的相對網址
這樣存取資源時就會自動依目前頁面所使用的同一個協定來存取資源!

2015年9月4日 星期五

WordPress 網誌網路 - WordPress Network - WordPress MU - WPMU

WordPress 網誌網路 - WordPress Network - WordPress MU - WPMU


Wordpress MU (Multi-user) 的功能已經整合到新版的 WordPress 中, 不再是一個獨立的專案了, 也不用再另外下載。

要安裝 WordPress MU 第一步要先修改 WordPress 根目錄下的 wp-config.php 程序, 如果是完全新的安裝則是先把 wp-config-sample.php 先備份起來然後直接修改 wp-config-sample.php 即可。在安裝的過程中, 程式會參考 wp-config-sample.php 和畫面上要求輸入的資料寫出 wp-config.php 檔。
//define('WP_ALLOW_MULTISITE', false); 這一行修改或是在底下加一行成
define('WP_ALLOW_MULIISITE', true);
來增加 "控制台-->工具-->Create Network (安裝網誌網路)" 這個功能。

啟用 WordPress MU 有兩種情況
1. 全新乾淨安裝且安裝在網站根目錄下 - 安裝過程會有子網域的設定, 網誌網路結構類型可選用子網域模式或是子目錄分類模式
2. 既有系統上安裝或安裝在網站的子目錄下 - 網誌網路結構類型限定只能用子目錄分類模式
不論是子網域模式或是子目錄分類模式, 網誌網路結構類型一旦選定後就不能更改!
(也許可重建乾淨站台再把資料倒回去, 只是一些計數、log 和 SEO 的資料會 lost 掉)

既有系統上安裝會動到 wp-config.php 檔 、.htaccess 檔和資料庫, 都要先備份起來!

安裝程式執行完後,畫面可能會提示要你去加個目錄、修改和備份一些檔案並重新登入後才算完成, 就照做!

完成所有安裝步驟並重新登入後, 控制台會多出一個 "我的網站-->網誌網路管理" 的選項, 即為 WordPress MU 的控制台, 而原先的 WordPress 站台就成為 WordPress MU 管理下的第一個子站, 也是預設的主站! 若之後有新建其他子站, 可自行設定要以那個子站當入口主站。

參考資料:
http://codex.wordpress.org/Create_A_Network
https://sofree.cc/wordpress-mu/

Nginx 常用設定

Nginx 常用設定


設定檔: /etc/nginx/proxy_params

此設定檔為 Nginx 安裝後自動產生的, 是作 proxy 設定時常用到的一些參數, 目前只 include 使用, 不修改。檔案內容如下
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

設定檔: /etc/nginx/sites-available/default

Nginx 大部份的設定, 尤其是與 reverse proxy 相關的都在此檔案, 以下為一段與 WordPress、 HTTPS 和 proxy cache 相關的設定範例:
# Proxy cache 前置設定
# cache 目錄, cache temp 目錄, 1字元+2字元雙層目錄, cache 名稱及分配記憶體, 效期, 空間
proxy_cache_path /var/www/cache levels=1:2 keys_zone=mycache:10m inactive=1d max_size=1g;
proxy_temp_path /var/www/cache/tmp;

server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;

        # 允許 HTTPS 連線
        listen 443 ssl;
        ssl_certificate         /etc/nginx/rex_ssl_key/cacert.pem;
        ssl_certificate_key     /etc/nginx/rex_ssl_key/privkey.pem;

        # 設定網站根目錄並加入 index.php 為主要的 index
        root /var/www/html;
        index index.php index.html index.htm;

        # 設定 Server Name 為 localhost, 因為沒有 domain name 又 IP 可能會變動
        server_name localhost;

        # Nginx 的預設 location 規則
        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }

        # 所有 .php request 直接重新導向給 Apache 處理
        location ~ .php$ {
                proxy_pass http://localhost:8080;
                include proxy_params;
        }

        # 靜態資料 cache 設定
        location ~* .(js|css|jpg|jpeg|gif|png|ico|cur|svg)$ {
                proxy_pass http://localhost:8080;
                include proxy_params;

                proxy_cache mycache;
                proxy_cache_key $host$uri$is_args&args;
                proxy_cache_valid 200 304 10m;

                expires 30d;
        }

        # WordPress 的控制台程序目錄 wp-admin 若是直接丟給 Apache 處理變 wp-admin/
        # 會硬要在 URL 上加上 Apache 的 8080 port, 這樣會讓 WordPress 主程序認為
        # 和站台設定不一致而重導回主頁不予理會。
        # 所以解決方法就直接在 Nginx 這端將他 rewrite 成 wp-admin/
        location ~ ^(/wp[^/]*(?:/[^/]*)?/wp-admin)$ {
                rewrite (.*) $1/;
        }

        # WordPress 主頁根目錄(首頁文章列表、索引到的文章) 或根目錄之下(偽靜態固定網址、
        # 網誌網路子站) 的 request 因為要透過 WordPress 的 php 程序取得實際網址,
        # 所以直接導向給 Apache 處理
        location ~ (^/wp[^/]*/$|^/wp[^/]*/){
                proxy_pass http://localhost:8080;
                include proxy_params;
        }

其他:
因為 HTTPS 的協定在 LNAMP 的架構下我們是交給 Nginx 處理, 所以習慣在 /etc/nginx 的目錄下另建一個子目錄來存放 certificate key (公用可公開) 和 private key (系統用不可公開)

2015年9月3日 星期四

LNAMP 環境下 Nginx + Apache 協同處理 WordPress 固定網址 Permalink 的 Rewrite 要求

LNAMP 環境下 Nginx + Apache 協同處理 WordPress 固定網址 Permalink 的 Rewrite 要求

主要目的是處理 WordPress 的固定網址功能時需要靠 rewrite 機制來達成, 而 WordPress 網站主頁根目錄下的 index.php 程序似乎又很堅持開啟網頁文章時一定要直接 request 主目錄, 不能加上 index.php 本身, 不然就給你重導回主目錄!

Nginx 是用來當 reverse proxy 的, 不處理 php 程序, 所以無法在 Nginx 這端完成一連貫的 rewrite 要求, 必須把 request 丟給 Apache 處理; 但如果找到 index.php 檔時再丟給 Apache 那 rquest 又會被重導回主目錄而白走一遭, 所以只能在遇到 WordPress 的 request 時就直接轉給 Apache 在 Apache 那邊做連貫處理。這點和一開始剛架好站時就出現 ERR_TOO_MANY_REDIRECTS 錯誤, 造成 WordPress 網站無法開啟的問題雷同。
Apache 這端要能成功執行 rewrite 功能, 必須做好幾點設定:

1. 確認 WordPress 網站主頁根目錄下的 .htaccess 檔 Apache (即網頁服務用戶 www-data) 是否有讀寫權限。

2. Apache 要啟用 rewrite 功能模組
$ sudo a2enmod rewrite
3. Apache 設定檔 /etc/apache2/apache2.conf 要設定允許 Apache 在 WordPress 網站主頁根目錄下執行 rewrite 動作
#<Directory ~ "/var/www/html/wp[^/]*">  # 試過用 regex 無效, 直接指定 hardlink
<Directory /var/www/html/wp>
   AllowedOverride All
</Directory>
<Directory /var/www/html/wpdue>
   AllowedOverride All
</Directory>
4. 重新啟動 Apache
$ sudo service apache2 restart

而 Nginx 這端則是要依 WordPress 程序運作的特性,例如某些功能堅持要導回主網頁,做特別的設定:

在 /etc/nginx/sites-available/default 這個設定檔添加或修改了以下設定
# Proxy cache 前置設定
# cache 目錄, cache temp 目錄, 1字元+2字元雙層目錄, cache 名稱及分配記憶體, 效期, 空間
proxy_cache_path /var/www/cache levels=1:2 keys_zone=mycache:10m inactive=1d max_size=1g;
proxy_temp_path /var/www/cache/tmp;

server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;

        # 允許 HTTPS 連線
        listen 443 ssl;
        ssl_certificate         /etc/nginx/rex_ssl_key/cacert.pem;
        ssl_certificate_key     /etc/nginx/rex_ssl_key/privkey.pem;

        # 設定網站根目錄並加入 index.php 為主要的 index
        root /var/www/html;
        index index.php index.html index.htm;

        # 設定 Server Name 為 localhost, 因為沒有 domain name 又 IP 可能會變動
        server_name localhost;

        # Nginx 的預設 location 規則
        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }

        # 所有 .php request 直接重新導向給 Apache 處理
        location ~ .php$ {
                proxy_pass http://localhost:8080;
                include proxy_params;
        }

        # 靜態資料 cache 設定
        location ~* .(js|css|jpg|jpeg|gif|png|ico|cur|svg)$ {
                proxy_pass http://localhost:8080;
                include proxy_params;

                proxy_cache mycache;
                proxy_cache_key $host$uri$is_args&args;
                proxy_cache_valid 200 304 10m;

                expires 30d;
        }

        # WordPress 的控制台程序目錄 wp-admin 若是直接丟給 Apache 處理變 wp-admin/
        # 會硬要在 URL 上加上 Apache 的 8080 port, 這樣會讓 WordPress 主程序認為
        # 和站台設定不一致而重導回主頁不予理會。
        # 所以解決方法就直接在 Nginx 這端將他 rewrite 成 wp-admin/
        location ~ ^(/wp[^/]*(?:/[^/]*)?/wp-admin)$ {
                rewrite (.*) $1/;
        }

        # WordPress 主頁根目錄(首頁文章列表、索引到的文章) 或根目錄之下(偽靜態固定網址、
        # 網誌網路子站) 的 request 因為要透過 WordPress 的 php 程序取得實際網址,
        # 所以直接導向給 Apache 處理
        location ~ (^/wp[^/]*/$|^/wp[^/]*/){
                proxy_pass http://localhost:8080;
                include proxy_params;
        }

WordPress 在更改固定網址設定時, 會將 rewrite 規則自動寫到 .htaccess 給 Apache 用, 這點就不用煩惱! 不過一旦安裝成 WordPress MU 後, .htaccess 就不會隨固定網址的設定而更改了 (因為 .htaccess 檔只有一個, 但不同子站可能有的有啟用固定網址功能有的沒有啟用)!

2015年9月2日 星期三

Apache 常用 Command Line 指令

Apache 常用 Command Line 指令

url 檢查, 以 http://localhost 為例:
curl http://localhost     # 取得回傳內容
curl -I http://locahost   # 取得回傳 header 資料
curl -k https://localhost # 跳過 SSL 檢查, 讓使用 self-signed 的 https 網站也可回傳資料

$ apache2ctl configtest   # 檢查 apache2 的 config 設定是否正確
$ sudo a2enmod rewrite    # 啟用功能模組: rewrite 
$ sudo a2dissmod rewrite  # 禁用功能模組: rewrite 

Apache 常用設定

Apache 常用設定

設定檔: /etc/apache2/ports.conf 在 LNAMP 的環境下, 如果 Apache 是當後台, 不想讓外界直接存取, 則做以下設定:
檔案 /etc/apache2/ports.conf
# 修改 Listen 8080 成只聽來自 localhost 的 request
Listen localhost:8080 
順便一提, /etc/apache2/ports.conf 設定檔的 Listen 指令這行之後加上的 inline comment 會被當成指令的一部份, 不要在此加上任何東西!
設定檔: /etc/apache2/apache2.conf 設定允許特定目錄下的 rewrite 動作
檔案 /etc/apache2/apache2.conf 
# 添加指定目錄存取屬性
<Directory /var/www/html/wordpress>
        AllowedOverride All
</Directory>

設定檔: /ect/apache2/sites-available/000-default.conf 當後台使用時,要更改對應所 listen 的 port, 且根目錄要和前端 Nginx 所設定的一致
檔案 /etc/apache2/apache2.conf 
<VirtualHost *:8080> 
        DocumentRoot   /var/www/html

        # 接收前端 Nginx proxy 過來的參數 X-Forwarded-Proto 來判別連線協定
        #   設定 Apache 參數讓 Apache 下的 PHP 程序必要時參考
        SetEnvIf X-Forwarded-Proto https HTTPS=1
</VirtualHost> 
這邊不用指為 localhost 因為 ports.conf 已經設定了只聽來自 localhost:8080 的 request - end

Nginx 常用 Command Line 指令

Nginx 常用 Command Line 指令

url 檢查, 以 http://localhost 為例:
curl http://localhost     # 取得回傳內容
curl -I http://locahost   # 取得回傳 header 資料
curl -k https://localhost # 跳過 SSL 檢查, 讓使用 self-signed 的 https 網站也可回傳資料

$ nginx -v        # Nginx 的版本顯示
$ sudo nginx -t   # Nginx 設定檔語法檢查

從 MySQL 資料庫修改 WordPress 的網站位址

從 MySQL 資料庫修改 WordPress 的網站位址

有次在測試將 LNAMP server 加入 HTTPS 連線功能時, 因為沒設定好導致 WordPress 一直重新導向到無法正確執行的 https:// 位址而使得 wp-admin 控制台載入失敗, 也就沒法由控制台來改為原先可用的 WordPress 網站位址!
這時必須從 MySQL 的資料庫中直接修改資料, 不然整個 WordPress 站台就不能用了!

以下是查找網站位址資料和修改內容的範例:
$ mysql -uroot -p     # 登入 mysql
mysql> use wordpress; # 切換到 WordPress 所使用的資料庫
mysql> select * from wp_options where option_name = 'siteurl';
mysql> update wp_options set option_value = '正確的網址' where option_name = 'siteurl';
mysql> exit;
如果有建立網誌網路, 假設初始安裝時所選用的 table prefix 為 wp_ , 那第二個站台的 table prefix 習慣會變成 wp_2_。

LNAMP 環境啟用支援 SSL 的 HTTPS 協定

LNAMP 環境啟用支援 SSL 的 HTTPS 協定

目前找到比較好的 LNAMP 整合並存 HTTP / HTTPS 存取 WordPress / Discuz 的方式:

1. Apache 當後台, 不做 SSL 相關設定, 只 Listen 來自 localhost 的 request, 避免使用者直接輸入 Apache port 來存取網頁
檔案: /etc/apache2/ports.conf
設定:
把 Listen 8080 設限只聽來自 localhost 的 request 如下:
Listen localhost:8080
該設定檔 SSL 的部份, 因為 Apache 的 SSL module 我們沒啟用所以不需要做任何更改。

2. 自行產生一組免費的 self-signed private key 與 public certificate key 來試用, 可先產生 private key 再產生 public key 或兩者一起產生, 範例如下:
$ sudo openssl genrsa -out privkey.pem 2048
$ sudo openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095
或
$ sudo openssl req -x509 -nodes
     -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key 
     -out /etc/apache2/ssl/apache.crt -days 365 
3. Nginx 端啟用 HTTP/80, HTTPS/443 並存服務, proxy_pass 要 include 預設的 proxy_params 參數來 pass X-Forwarded-Proto 參數給後端的 Apache server
檔案: /etc/nginx/sites-available/default
增加協定:
    server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;

        # 允許 HTTPS 連線
        listen 443 ssl;
        ssl_certificate         /etc/nginx/rex_ssl_key/cacert.pem;
        ssl_certificate_key     /etc/nginx/rex_ssl_key/privkey.pem;
4. 在 Apache 的 VirtualHost 的設定中加入以下指令
檔案: /etc/apache2/sites-available/000-default.conf
加入: SetEnvIf X-Forwarded-Proto https HTTPS=1
來告知 Apache 前端是不是由 HTTPS request 來的; 如果是的話就打開 HTTPS 參數, 讓 php 程序知道要用HTTPS方式處理。其中 X-Forwarded-Proto 是設定在 Nighx proxy_params 裡的, proxy_pass 時我們設定讓它一起傳給 Apache

5. WordPress 控制台設定的主網址使用 http:// 即可, 不用改為 https:// , 只需注意在控制台的頁面有些預覽的連結是直接參考主網址設定的協定, 如果在 HTTP 和 HTTPS 間切換會將登入狀態 reset; 而外部使用者在瀏覽頁面時不論是以 HTTP 連線或是 HTTPS 連線是完全沒問題的。
如此設定好後 WordPress 或 Discuz! 都可以使用 HTTP 或 HTTPS 來連線。
Discuz! 因為有緩存機制, 把協定直接寫進了緩存區, 所以對 HTTPS 的支援比較不完整, 在 HTTPS 模式下使用到 HTTP 模式產生的緩存位址該資源可能就無法讀取。不過目前看起來文章的撰寫和瀏覽是沒受到這些緩存資源影響的,可能是因為緩存的大多是靜態圖檔, 對於非安全協定存取的圖檔, 瀏覽器雖會警告但仍然會將它載入。再來有一些無法存取的 css 或 js 檔看起來是插件向站外存取的, 所以不影響 Discuz! 的基本功能。
我們目前使用的模式不需在 Apache 做 SSL 的相關設定, 不過這裡記錄一下 Apache 如何做 SSL 設定供日後有需求時可以參考:

SSL 支援在 Ubuntu 14.04 後的 Apache 已經是標準安裝, 只要啟用和重新啟動 Apache 即可:
$ sudo a2ensite default-ssl
$ sudo a2enmod ssl
$ sudo service apache2 restart
Apache 的 SSL 支援一樣要用到 certificate key pairs, 產生方式同本文前述。

Apache 的 SSL 支援設定範本在 /etc/apache2/sites-available/default-ssl.conf , 若要併用 HTTP 和 HTTPS 設定可將該設定檔下相關的設定複製到 /etc/apache2/sites-available/000-default.conf 中。 合併設定檔後就不需要也不能用 a2ensite default-ssl / a2dissite default-ssl 來開關 SSL 服務!

取消 Apache SSL 支援的指令:
$ sudo a2dismod ssl
$ sudo a2dissite default-ssl
$ sudo service apache2 restart

WordPress 在測試 HTTPS 期間遇到的一些問題和解法:

1. 為啥控制台設定主頁網址不用改 https:// 就可讓 http 或 https 兩者方式存取?
OK> 目前先假設 WordPress 內部運作是透過現用 Protocle + URI 而不是透過指定的 URL 來存取文章, 可暫時先忽略這個問題, 唯一的麻煩是點選 "造訪網頁" 或 "預覽修改" 的功能時, 都會切回主網頁設定的 Protocol 而不考慮現用的 Protocol !
有發現一件事: 站台設定為 http 連線時, 使用http連線, 所有連結都為 http 連結; 使用 https 連線, 除 "造訪網頁" 主網址和 "預覽修改" 都回切回設定的 protocol, 其他所有連結都會使用 https 連結; 如果站台設定為 https 連線, 則不論一開頭是用 http 或 https 連線的, 所有連結都會直接指定為 https 連結。
目前做 HTTP / HTTPS 並存測試時, 最佳設定主網頁的方式就是以 http 設定, 然後點選 "造訪網站" 或 "預覽修改" 時只做檢視, 不要再從中點選 Edit 或任何回控制台的連結, 避免不同 protocol 將登入的連線 reset!
以後只單開 HTTP 或 HTTPS 時 (若 HTTPS 沒問題應為首選) 就沒這個問題了!

2. 網頁會固定用 http 去找外部 googleapis 的字型, 造成當以 https 連線時這些字型會被禁用, 還要找方法解決!
OK> 要解決這個問題似乎要修改 WordPress 的 code! 目前這個字型影響不大先不管! 後來發現這是 theme 造成的不是 WordPress 本身的問題, 所以就當沒這個問題了!

3. 進入控制台時出現一個 theme 下的檔案找不到的問題, 猜測是 theme 本身的問題, 先不用管!
OK> 猜測是 theme 本身的問題, 先不用管!

4. 不使用 /wp/ 轉址會有無限回圈的問題!
OK> 原因是 WordPress 主頁下的 index.php 程式很堅持要透過主網站路徑來存取才可以, 例如 http://localhost/wp/ 這樣子, 連寫定 index.php 成 http://localhost/wp/index.php 也不允許, 也要強制他回轉回 http://localhost/wp/ 來隱藏式地讀取 index.php 執行! 所以 Nginx 只能將存取 WordPress 主網站目錄的任何需求立刻直接傳給 Apache 來處理, 讓 Apache 自己找到底下的 index.php 來用才不會有問題!

5. 使用固定網址時, 出現 apache 找不到檔案的 error, 看起來有點像編碼的問題, 要再查查!
OK> 確認和編碼無關, 估計又是 WordPress 的主頁堅持要用主頁目錄來存取, 例如 /wp/, 而不能加上 index.php 成 /wp/index.php, 遇到以 /wp/index.php 來開啟網頁就直接重導向 /wp/。把整個 WordPress 的 request 都丟給 Apache 在 Apache 那端開啟 Rewrite 功能就一切 OK 了!

6. 新的問題是: 東西全丟給 Apache 那 loading 都在 Apache 那邊, Nginx 不就沒作用了!
OK> 根據網上的資料已經找到 Nginx 中設定 Proxy cache 的方法!
Discuz! 在測試 HTTPS 期間遇到的一些問題和解法:

1. 有些網址寫定連至 8080 port, 將 Apache 設定為只能 localhost 存取會讓這些資源抓不到,處理目標還是看怎麼讓這些網址不要指定存取 8080 port 比較正向解決
NG> 好像 port 資料是 cache 在緩存中, 要想辦法怎麼讓產生的緩存檔不記 port 資料!

2. admin.php 網頁的存取問題, 為啥如果 Nginx 設定沒明指 servername 為 ip 的話, 一定要指定 8080 ports 才能使用
OK> 因為 Discuz! X3.2 的後台管理中心 admin.php 程序在處理過程中預設有做 IP 檢查, 不允需過程中有來源 IP 的切換, 若有 IP 切換就重來, 所以唯一的解決方法是修改 Discuz 根目錄下的 /config/config_global.php 程序, 關掉後台管理中心的 IP 檢查, 因為 Nginx 的 servername 如果設定為 localhost, 當以 Nginx 為 Entry 點來 proxy 給 Apache 時, IP 會輪流用 ipv4 及 ipv6 來嘗試, 造成 Apache 收到的 client IP 一下是 ::1, 一下是 127.0.0.1 造成 IP 不一致; 而以 Apache 為 Entry 點時, 因為 request 完全不經過 Nginx 所以 IP 不會變動沒有問題。
Discuz 設定檔: /config/config_global.php
$_config['admincp']['checkip'] = 1; 改為 = 0;
3. 因為在 LNAMP 中我們設定了禁止外部直接存取 Apache 服務, 而 admin.php 不透過 8080 port 又無法登入, 造成 admin 無法使用
OK> 2 的問題解決了, 3 就沒問題了!

Ubuntu 常用 Command Line 指令

Ubuntu 常用 Command Line 指令


find - 檔案搜尋

$ find /etc/nginx             # 列出指定目錄下所有檔案目錄名稱, 包含起始目錄
$ find /etc/nginx -name *     # 與前一項結果相同, * 為 regex = *
$ find /etc/nginx -name "*"   # 與前一項結果相同, regex * 由 quota 包裹, 不用跳位
$ find /etc/nginx -iname "C*" # 不分大小寫搜尋 c 或 C 開頭的檔案及目錄
$ find /etc/nginx -type f     # 只列檔案
$ find /etc/nginx -type d     # 只列目錄

# 將檔案內容含 proxy 字樣者的檔名列出
$ find /etc/nginx -type f -exec grep -l "proxy" {} ; 

ps, jobs, fg, bg, disown, kill - 程序相關指令

$ ps aux | grep ssh        # 列出所有含指定關鍵字的程序
$ jobs                     # 列出執行中的工作
$ fg 或 fg #[number]       # 將 queue 中的下一個工作或指定編號的工作帶到前景
$ bg 或 bg #[number]       # 將下一個工作或指定的工作推到背景執行
$ disown #[number]         # 停止綁定指定的工作代碼, 當 terminal 結束時工作仍可繼續執行

# 結束指定編號的工作或傳送訊號給指定編號的工作
$ kill #[number] 或 kill -[signal] #[number]

dpkg, apt-cache - 已安裝套件查詢

$ dpkg –get-selections | grep php  # 查詢與 php 有關的已安裝套件
$ apt-cache search mysql-server    # 查詢與 mysql-server 關鍵字相關的套件
$ apt-cache show mysql-server      # 列出 mysql-server 套件詳細資料
$ apt-cache showpkg mysql-server   # 列出 mysql-server 相依元件
$ apt-cache pkgnames mysql         # 列出名稱為 mysql 開頭的所有套件
$ apt list mysql*                  # 列出名稱為 mysql 開頭的所有套件
$ apt list --installed mysql*      # 列出名稱為 mysql 開頭的所有已安裝套件
Ubuntu 和 FreeBSD 套件名稱和包裝有所不同, 在 FreeBSD 上查得到的套件在 Ubuntu 不一定查得到。

free, df, du - 資源使用狀況

$ free -m          # 查詢記憶體使用狀況 (以 MB 為單位)
$ df -h            # 查詢磁碟使用狀況 (以慣用的單位如 M, G 顯示)
$ du -sh myFolder  # 查詢子目錄佔用多少空間 

netstat - 網路使用狀況

$ netstat -ln      # 查詢 listen ports

2015年8月30日 星期日

LNAMP 安裝 WordPress 與 Nginx Proxy 設定

LNAMP 安裝 WordPress 與 Nginx Proxy 設定

安裝步驟如下:

1. 下載 WordPress 正體中文版
2. 解壓縮並將主檔目錄 copy 到 /var/www/html/wp
3. 進入 wp 上層目錄
4. $ sudo chown -R www-data:www-data wp
5. $ sudo chmod -R 644 wp
6. $ sudo chmod -R a+X wp
7. MySQL 先建立一個名稱為 wordpress 的資料庫
8. 瀏覽器訪問 wp 主頁
9. 輸入相關資料開始安裝

安裝完後使用控制台或編寫文章都沒問題,但要瀏覽網誌時出現 頁面重新導向不正確 ERR_TOO_MANY_REDIRECTS 的錯誤! --- 將 WordPress 的網址加上 8080 port 就都沒問題了, 看起來 LNAMP 的 proxy 設定真的頭大呀! 嘗試了多種方法, 找到一種可暫用但感覺怪怪的方案, 請往下看 ....
在剛安裝好的 LNAMP 環境下, Nginx 當前端、Apache 當執行 php 的後端, 安裝好 WordPress 要執行時出現問題!

WordPress 的 wp-admin 執行沒問題, 但要檢視剛建好的 WordPress 網站主頁面時 Chrome 瀏覽器主頁直接顯示 "這個網頁含有重新導向迴圈" ERR_TOO_MANY_REDIRECTS 的錯誤而無法正確執行。

網上有很多類似的問題, 但對這個狀況好像沒啥解釋也不太實用!
猜測問題來源是 WordPress 本身的做法是每個 php 程序執行完後網址都轉跳回 WordPress 的根目錄。
試過 disable cache : 失敗!
試過 plugin disable xml-rpc : 失敗!
試過 alias root : 失敗!
試過複製 location / 成 /wp 和 /wp/ : 失敗!

最後成功的方法是加了以下一段設定:
location ~ ^/wp/$ {
      proxy_pass http://localhost:8080;
      include proxy_params;
   }
直接把 /wp/ 這個位址的 request 全轉給 apache 處理 (希望 document 中的非 php link 還是透過 Nginx 處理, 不然 LNAMP 架構就沒意義了) 怪的一點是 Nginx 的設定檔已經有以下這一段了呀:
location ~ .php$ {
      proxy_pass http://localhost:8080;
      include proxy_params;
   }
明明是已經知道網址給 /wp 時會自動試改為 /wp/ 然後讀取 /wp/index.php 所以才有半法轉 apache 處理完發現要重新轉址回 /wp/ ! 為啥處理一半又途然沒法處理 /wp/ 這個目錄, 要在 Nginx 設定檔中明確宣告才有辦法再轉? 搞不懂.....!!! 就暫時先這樣用了! 改天試試裝第二套 WordPress 並存看會不會有更多問題!
後來在 /wpdue/ 下試裝第二套 WordPress 並存也成功了, 不過 Nginx 設定要改一下, location ~ ^/wp/$ 把他暫改成 ^/wp.*/$ 另外多個 WordPress 可統合成 Network, 共享程序資源, 分管 Contnent Data / Attachement 就像建了一個 WordPress.com 網站, 這個還要再試試! http://codex.wordpress.org/Create_A_Network

Regular Expression 喜蝦密?! 來研究一下...

知識參考來源: Introducing Regular Expressions, by Michael Fitzgerald, O’Reilly
現今 Unix 系統及許多程式語言都使用 regular expression (常規表示式?) 當做字串對應或搜尋的 pattern。 pattern 中文不好翻譯, 使用實質上就如字面原意像布料的一小塊花色樣式一樣, 但說成花色, 樣式, 樣版, 模型感覺都不太搭! Regular Expression 範例:
 ^((d{3})|^d{3}[.-]?)?d{3}[.-]?d{4}$
.... 嗯嗯! 目前看起來是火星文  (聽說是北美電話號碼的規則... o_o!!!)
這個網址可以比較資料是否符合指定的 regular expression: regexpal.com
以下 regular expression 範例:
 [0-9]
代表0~9之間的任何單一數字, 其中左右中括號(square bracket) 是 metacharacters, 而 metacharacter 在 regular expression 中是有特殊用法的保留字。範例 [0-9] 在 regular expression 中稱為 character class, 有時也稱做 character set。 由此引申其他用法, 如下例:
 [012589]
代表符合 0,1,2,5,8,9 之中的任一數字的單一數字。 前面講的是單一數字的對應, 那要對應很多數字如電話號碼可能會想到要這樣寫:
 [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9]
此時填入 555-12345 就符合規則了, 不過這樣 regular expression 就變得冗長, 所以又提供一種寫法叫 character shorthand, 可以用 d 來代表 [0-9], regular express 就可改寫為
 ddd-ddddd
對應於 d 代表單一數字, D 被設定為代表單一非數字字元, 如果電話號碼規則寫成
 dddDddddd
那原先 555-12345 是沒問題的, 不過如果輸入 555a12345 也是算是符合規則的而 555812345 就不合規則了。 另外一個常用的特殊字元是句點 . (dot) 代表任合字元 (非特殊情況下通常不包含換行字元 u000A), regluar expression 寫成:
 ddd.ddddd
那不論 555-12345, 555a12345, 555812345, 555%12345, 555|12345, ... 都算符合規則。
Capturing Groups 和 Back References:
 (d)d1
以上寫法, 加了小括號 (parentheses) 的 (d) 為 capturing group; 1 則為 back reference 代表 (d) 所捕獲的數字。 所以 707 符合以上規則, 而 706 因為第三個數字與第一個數字不同所以不符合規則。
Quantifiers:
 d{3}-?d{3}-?d{4}
包了數字的大括號(curly braces) {3} 是一種 quantifier, 代表前面的字元重複3次; 問號 ? 則代表前面的那個字元是 optional 可有可無的。 所以這樣的表示式為334數字組合的電話號碼, 中間有沒有加 - (hyphen) 都沒關係。 其他常用的 quantifiers 還有: +: 加號(plus sign), 代表至少一個 *: 星號(asterisk), 代表沒半個或很多個都可以 應用 quantifier, 以下 regular expression:
 (d{3,4}[.-]?)+
+ 號控制 capturing group (d{3,4}[.-]?) 的內容至少要填入一次, {3,4} 控制 d 要填入最少3字最多4字, ? 號控制僅能填入 . 或 - 字元但不填也可。 以下更複雜的一個例子展示電話區域號碼可加或不加括號的寫法, 也說明特殊保留字元的括號如何當成文字字元處理:
 ^((d{3})|^d{3}[.-]?)?d{3}[.-]?d{4}$
稍微拆開來看 ^ ((d{3})  |  ^d{3} [.-]?)?  d{3}  [.-]?  d{4}  $
最前面的 ^ 號代表只找字串頭符合的, 最後面的 $ 號代表只找字串尾符合的; 兩者並用則表示整個字串要完全符合規則, (...)? 為區域號部份, 其中 ? 號代表區域號可有可無, d{3} 代表區號後要接3個數字, [.-]? 代表3個數字後只能接 . 或 - 字元, 其後的 ? 號代表不填也可, d{4} 代表號碼最後要再填4個數字 區號 capturing group 中間的 | 號代表符合 (d{3}) 或 ^d{3}[.-]? 其中之一即可, (d{3}) 代表用小括號刮起來的3個數字 ^d{3}[.-]? 代表這個 group 內開頭要3個數字,然後可選填 . 或 - 或字元不填
Negated Class 在 character class 的中括號後面第一個字元填入 ^ 號, 表示是要找不符合的, 例如
 [^d] 等同於 [^0-9] 等同於 D

Matching Word and Non-Word Characters Word 的 shorthand 為 w 用起來和 D 似乎有點像, 差別在於 w 只包含大小寫和數字, 而 D 是涵蓋數字以外的所有符號, 連空白字元也算。
 w 等同於 [a-zA-Z0-9]
 W 等同於 [^w] 等同於 [^a-zA-Z0-9]

Character Shorthand 列表
Character Shorthand 說明
aAlert
bWord boundary
[b]Backspace character
BNon-word boundary
cxControl character
bWord boundary
dDigit character
DNon-digit character
dxxxDecimal value for a character
fForm feed character
rCarriage return
nNewline character
oxxxOctal value for a character
sSpace character   (等於[ tnr])
SNon-space character
tHorizontal tab character
vVertical tab character
wWord character
WNon-word character
Null character
xxxHexadecimal value for a character
uxxxxUnicode value for a character

2015年8月28日 星期五

Ubuntu LNAMP 環境下安裝 Discuz! X3.2

Ubuntu LNAMP 環境下安裝 Discuz! X3.2


簡述

Discuz! X3.2 的方便安裝介面讓安裝過程很容易, 要注意的部份大概只有檔案權限是否正確設定, 還有是不是有必需的元件未安裝。在 Ubuntu LNAMP 環境下安裝 Discuz! X3.2 方法和在 LAMP 環境下安裝的過程差不多。


安裝前的設定

Nginx 要添加 index.php 為 index Ubuntu 的 tar 無法像 FreeBSD tar 解開 .zip 檔; Ubuntu 要先安裝  unzip 工具
$ sudo apt-get install unzip

FreeBSD 中若少安裝一些程序會造成安裝或使用時的問題, Ubuntu 的 LAMP tasksel 都有完整安裝, 無此問題, 不過還是記錄一下: FreeBSD:
$ pkg install php56-mysqli   # 安裝過程錯誤: mysqli_connect()           不支持
$ pkg install php56-xml      # 安裝過程錯誤: xml_parser_create()        不支持
$ pkg install php56-mysql    # 安裝過程無提示錯誤,顯示安裝成功, 但訪問主頁面時一片空白
另外不確定安裝 php56-mysql 時會不會自動安裝  php56-mysqli (猜想是會, 因為 mysqli 是 mysql 的子套件吧?!)
安裝步驟如下:
1. wget 下載 Discuz! 3.2 繁體中文 UTF-8 版本
2. unzip 解壓縮, 其中 upload 目錄為 Discuz! X3.2 主目錄, 將其 copy 成 /var/www/html/dz
3. 進入 dz 上層目錄
4. $ sudo chown -R www-data:www-data dz    # 檔案目錄改由 www-data 服務帳號管理
5. $ sudo chmod -R 644 wp                  # (把 dz 及其下所有的檔案及目錄先改成唯讀)
6. $ sudo chmod -R a+X wp                  # (把 dz 及其下所有的目錄加上可執行的權限)
7. 瀏覽器訪問 dz 主頁
8. 執行 Discuz 的安裝程序, 檢查需要開放寫入權限的目錄依序將其權限改為 777
如果安裝畫面提示系統內未安裝 GD 庫, 則先執行以下程序安裝:
$ sudo apt-get install php5-gd

安裝好重啟 apache2 服務
$ sudo service apache2 restart
GD庫安裝好後再繼續 Discuz! X3.2 的安裝。

2015年8月27日 星期四

Ubuntu LAMP 架構轉 LNAMP

Ubuntu LAMP 架構轉 LNAMP


簡述

聽得許多描述: Nginx 處理靜態資料快速又省系統資源; Apache 處理動態 PHP 網頁可靠又效率高, 合併兩者的優點將 Ubuntu LAMP 架構轉 LNAMP 架構也許是高流量動態網頁比較好的選擇。


轉換步驟

將 Nginx 設定為 port 80, Apache 改用8080; Nginx 處理靜態網頁,將動態 PHP 的 request 轉往 Apache 處理。
Ubuntu 的 apache2 設定與之前的有些不同,  Ubuntu 將 apache2 所使用的 ports 定義在 /etc/apache2/ports.conf 這個檔案中; 而每個 ports 應到的 VirtualHost 則定義在 /etc/apache2/sites-enabled/ 之下的設定檔。/etc/apache2/sites-enabled/ 之下的檔案均為 symbolic-link 連結到 ../sites-available/ 之下的同名檔案, 所以要改設定時是要改 /etc/apache2/sites-available/ 之下的檔案; 而要 enable 或 disable 設定時則在 /etc/apache2/sites-enabled/ 之下建立或移除 symblic-links.
根據以上規則, 若要更改 apache2 的預設 port, 就要更動到 /etc/apache2/ports.conf 及 /etc/apache2/sites-available/000-default.conf 兩個檔案。先行對兩個檔案備份再進行以下修改:
修改檔案: /etc/apache2/ports.conf
將檔案中 Listen 80 改為 Listen 8080
修改檔案: /etc/apache2/sites-available/000-default.conf
將 <VirtualHost *:80> 改為 <VirtualHost *:8080>
修改完畢, 重新啟動 apache2
$ sudo service apache2 restart

重新導向 apache2 的 listen port 之後, 接著就安裝 nginx:
$ sudo apt-get update
$ sudo apt-get install nginx -y
Nginx 的安裝過程如下:
Reading package lists...
Building dependency tree...
Reading state information...
The following extra packages will be installed:
fontconfig-config fonts-dejavu-core libfontconfig1 libgd3 libjbig0
libjpeg-turbo8 libjpeg8 libtiff5 libvpx1 libxpm4 libxslt1.1 nginx-common
nginx-core
Suggested packages:
libgd-tools fcgiwrap nginx-doc
The following NEW packages will be installed:
fontconfig-config fonts-dejavu-core libfontconfig1 libgd3 libjbig0
libjpeg-turbo8 libjpeg8 libtiff5 libvpx1 libxpm4 libxslt1.1 nginx
nginx-common nginx-core
0 upgraded, 14 newly installed, 0 to remove and 6 not upgraded.
Need to get 2,656 kB of archives.
After this operation, 8,941 kB of additional disk space will be used.
Get:1 http://us.archive.ubuntu.com/ubuntu/ trusty/main fonts-dejavu-core all 2.34-1ubuntu1 [1,024 kB]
Get:2 http://us.archive.ubuntu.com/ubuntu/ trusty-updates/main fontconfig-config all 2.11.0-0ubuntu4.1 [47.4 kB]
Get:3 http://us.archive.ubuntu.com/ubuntu/ trusty-updates/main libfontconfig1 i386 2.11.0-0ubuntu4.1 [124 kB]
Get:4 http://us.archive.ubuntu.com/ubuntu/ trusty/main libjpeg-turbo8 i386 1.3.0-0ubuntu2 [107 kB]
Get:5 http://us.archive.ubuntu.com/ubuntu/ trusty/main libjpeg8 i386 8c-2ubuntu8 [2,188 B]
Get:6 http://us.archive.ubuntu.com/ubuntu/ trusty-updates/main libjbig0 i386 2.0-2ubuntu4.1 [25.1 kB]
Get:7 http://us.archive.ubuntu.com/ubuntu/ trusty-updates/main libtiff5 i386 4.0.3-7ubuntu0.3 [142 kB]
Get:8 http://us.archive.ubuntu.com/ubuntu/ trusty/main libvpx1 i386 1.3.0-2 [518 kB]
Get:9 http://us.archive.ubuntu.com/ubuntu/ trusty/main libxpm4 i386 1:3.5.10-1 [38.2 kB]
Get:10 http://us.archive.ubuntu.com/ubuntu/ trusty/main libgd3 i386 2.1.0-3 [142 kB]
Get:11 http://us.archive.ubuntu.com/ubuntu/ trusty/main libxslt1.1 i386 1.1.28-2build1 [140 kB]
Get:12 http://us.archive.ubuntu.com/ubuntu/ trusty-updates/main nginx-common all 1.4.6-1ubuntu3.3 [18.1 kB]
Get:13 http://us.archive.ubuntu.com/ubuntu/ trusty-updates/main nginx-core i386 1.4.6-1ubuntu3.3 [322 kB]
Get:14 http://us.archive.ubuntu.com/ubuntu/ trusty-updates/main nginx all 1.4.6-1ubuntu3.3 [5,452 B]
Fetched 2,656 kB in 7s (333 kB/s)
Selecting previously unselected package fonts-dejavu-core.
(Reading database ... 87692 files and directories currently installed.)
Preparing to unpack .../fonts-dejavu-core_2.34-1ubuntu1_all.deb ...
Unpacking fonts-dejavu-core (2.34-1ubuntu1) ...
Selecting previously unselected package fontconfig-config.
Preparing to unpack .../fontconfig-config_2.11.0-0ubuntu4.1_all.deb ...
Unpacking fontconfig-config (2.11.0-0ubuntu4.1) ...
Selecting previously unselected package libfontconfig1:i386.
Preparing to unpack .../libfontconfig1_2.11.0-0ubuntu4.1_i386.deb ...
Unpacking libfontconfig1:i386 (2.11.0-0ubuntu4.1) ...
Selecting previously unselected package libjpeg-turbo8:i386.
Preparing to unpack .../libjpeg-turbo8_1.3.0-0ubuntu2_i386.deb ...
Unpacking libjpeg-turbo8:i386 (1.3.0-0ubuntu2) ...
Selecting previously unselected package libjpeg8:i386.
Preparing to unpack .../libjpeg8_8c-2ubuntu8_i386.deb ...
Unpacking libjpeg8:i386 (8c-2ubuntu8) ...
Selecting previously unselected package libjbig0:i386.
Preparing to unpack .../libjbig0_2.0-2ubuntu4.1_i386.deb ...
Unpacking libjbig0:i386 (2.0-2ubuntu4.1) ...
Selecting previously unselected package libtiff5:i386.
Preparing to unpack .../libtiff5_4.0.3-7ubuntu0.3_i386.deb ...
Unpacking libtiff5:i386 (4.0.3-7ubuntu0.3) ...
Selecting previously unselected package libvpx1:i386.
Preparing to unpack .../libvpx1_1.3.0-2_i386.deb ...
Unpacking libvpx1:i386 (1.3.0-2) ...
Selecting previously unselected package libxpm4:i386.
Preparing to unpack .../libxpm4_1%3a3.5.10-1_i386.deb ...
Unpacking libxpm4:i386 (1:3.5.10-1) ...
Selecting previously unselected package libgd3:i386.
Preparing to unpack .../libgd3_2.1.0-3_i386.deb ...
Unpacking libgd3:i386 (2.1.0-3) ...
Selecting previously unselected package libxslt1.1:i386.
Preparing to unpack .../libxslt1.1_1.1.28-2build1_i386.deb ...
Unpacking libxslt1.1:i386 (1.1.28-2build1) ...
Selecting previously unselected package nginx-common.
Preparing to unpack .../nginx-common_1.4.6-1ubuntu3.3_all.deb ...
Unpacking nginx-common (1.4.6-1ubuntu3.3) ...
Selecting previously unselected package nginx-core.
Preparing to unpack .../nginx-core_1.4.6-1ubuntu3.3_i386.deb ...
Unpacking nginx-core (1.4.6-1ubuntu3.3) ...
Selecting previously unselected package nginx.
Preparing to unpack .../nginx_1.4.6-1ubuntu3.3_all.deb ...
Unpacking nginx (1.4.6-1ubuntu3.3) ...
Processing triggers for man-db (2.6.7.1-1ubuntu1) ...
Processing triggers for ufw (0.34~rc-0ubuntu2) ...
Processing triggers for ureadahead (0.100.0-16) ...
Setting up fonts-dejavu-core (2.34-1ubuntu1) ...
Setting up fontconfig-config (2.11.0-0ubuntu4.1) ...
Setting up libfontconfig1:i386 (2.11.0-0ubuntu4.1) ...
Setting up libjpeg-turbo8:i386 (1.3.0-0ubuntu2) ...
Setting up libjpeg8:i386 (8c-2ubuntu8) ...
Setting up libjbig0:i386 (2.0-2ubuntu4.1) ...
Setting up libtiff5:i386 (4.0.3-7ubuntu0.3) ...
Setting up libvpx1:i386 (1.3.0-2) ...
Setting up libxpm4:i386 (1:3.5.10-1) ...
Setting up libgd3:i386 (2.1.0-3) ...
Setting up libxslt1.1:i386 (1.1.28-2build1) ...
Setting up nginx-common (1.4.6-1ubuntu3.3) ...
Processing triggers for ufw (0.34~rc-0ubuntu2) ...
Processing triggers for ureadahead (0.100.0-16) ...
Setting up nginx-core (1.4.6-1ubuntu3.3) ...
Setting up nginx (1.4.6-1ubuntu3.3) ...
Processing triggers for libc-bin (2.19-0ubuntu6.6) ...
查看 Nginx 預設啟動的程序:
$ ps aux | grep nginx
root      5521  0.0  0.5  14908  2552 ?        Ss   01:03   0:00 nginx: master process /usr/sbin/nginx
www-data  5522  0.0  0.5  15052  2836 ?        S    01:03   0:00 nginx: worker process
www-data  5523  0.0  0.7  15052  3704 ?        S    01:03   0:00 nginx: worker process
www-data  5524  0.0  0.5  15052  2836 ?        S    01:03   0:00 nginx: worker process
www-data  5525  0.0  0.5  15052  2836 ?        S    01:03   0:00 nginx: worker process

修改 Nginx 的設定檔, 設定啟始路徑及設定 .php 導向 apache
修改檔案: /etc/nginx/sites-available/default, 更改 root 位置並增加 index.php 索引檔:
root /var/www/html;
index index.php index.html index.htm;

接著在原來的 location 設定之下新增以下設定, 啟用 php 轉址並轉達原 Host 和 真實 IP 資料
location ~ .php$ {
    proxy_pass  http://localhost:8080;
    include proxy_params; 
    # proxy_set_header Host $http_host;
    # proxy_set_header X-Real-IP $remote_addr;
    # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    # proxy_set_header X-Forwarded-Proto $scheme;
}
設定完後重新啟動 nginx:
$ sudo /etc/init.d/nginx restart 或
$ sudo service nginx restart
完成之後, 基本上外部連接 httpd 的通道就由 Nginx 接管, 且當有 .php 的請求時就會自動導向給 apache 處理!

Ubuntu 安裝 SSH 支援 - OpenSSH

Ubuntu 安裝 SSH 支援 - OpenSSH


簡述

在 VM 中安裝完 Ubuntu Server 後, 原本的 tty 是在英文模式下, 要檢視或是編輯含中文內容或檔名的文件會有問題。在 Ubuntu 安裝 SSH 支援, 讓系統可以從外部透過 ssh 連線工具連線, 不但解決的中文顯示和編輯的問題, 還有可調整大小的純文字視窗環境且不用再按鍵來切換 VM 和 Windows 環境!

安裝指令:

$ sudo apt-get update
$ sudo apt-get install openssh-server -y

安裝過程:

Reading package lists...
Building dependency tree...
Reading state information...
The following extra packages will be installed:
  libck-connector0 ncurses-term openssh-client openssh-sftp-server
  python-requests python-urllib3 ssh-import-id
Suggested packages:
  ssh-askpass libpam-ssh keychain monkeysphere rssh molly-guard
The following NEW packages will be installed:
  libck-connector0 ncurses-term openssh-server openssh-sftp-server
  python-requests python-urllib3 ssh-import-id
The following packages will be upgraded:
  openssh-client
1 upgraded, 7 newly installed, 0 to remove and 6 not upgraded.
Need to get 935 kB/1,280 kB of archives.
After this operation, 3,898 kB of additional disk space will be used.
Get:1 http://us.archive.ubuntu.com/ubuntu/ trusty-updates/main openssh-client i386 1:6.6p1-2ubuntu2.3 [576 kB]
Get:2 http://us.archive.ubuntu.com/ubuntu/ trusty-updates/main openssh-sftp-server i386 1:6.6p1-2ubuntu2.3 [35.6 kB]
Get:3 http://us.archive.ubuntu.com/ubuntu/ trusty-updates/main openssh-server i386 1:6.6p1-2ubuntu2.3 [324 kB]
Preconfiguring packages ...
Fetched 935 kB in 3s (251 kB/s)
Selecting previously unselected package libck-connector0:i386.
(Reading database ... 84931 files and directories currently installed.)
Preparing to unpack .../libck-connector0_0.4.5-3.1ubuntu2_i386.deb ...
Unpacking libck-connector0:i386 (0.4.5-3.1ubuntu2) ...
Preparing to unpack .../openssh-client_1%3a6.6p1-2ubuntu2.3_i386.deb ...
Unpacking openssh-client (1:6.6p1-2ubuntu2.3) over (1:6.6p1-2ubuntu2) ...
Selecting previously unselected package ncurses-term.
Preparing to unpack .../ncurses-term_5.9+20140118-1ubuntu1_all.deb ...
Unpacking ncurses-term (5.9+20140118-1ubuntu1) ...
Selecting previously unselected package openssh-sftp-server.
Preparing to unpack .../openssh-sftp-server_1%3a6.6p1-2ubuntu2.3_i386.deb ...
Unpacking openssh-sftp-server (1:6.6p1-2ubuntu2.3) ...
Selecting previously unselected package openssh-server.
Preparing to unpack .../openssh-server_1%3a6.6p1-2ubuntu2.3_i386.deb ...
Unpacking openssh-server (1:6.6p1-2ubuntu2.3) ...
Selecting previously unselected package python-urllib3.
Preparing to unpack .../python-urllib3_1.7.1-1ubuntu3_all.deb ...
Unpacking python-urllib3 (1.7.1-1ubuntu3) ...
Selecting previously unselected package python-requests.
Preparing to unpack .../python-requests_2.2.1-1ubuntu0.3_all.deb ...
Unpacking python-requests (2.2.1-1ubuntu0.3) ...
Selecting previously unselected package ssh-import-id.
Preparing to unpack .../ssh-import-id_3.21-0ubuntu1_all.deb ...
Unpacking ssh-import-id (3.21-0ubuntu1) ...
Processing triggers for man-db (2.6.7.1-1ubuntu1) ...
Processing triggers for ureadahead (0.100.0-16) ...
ureadahead will be reprofiled on next reboot
Processing triggers for ufw (0.34~rc-0ubuntu2) ...
Setting up libck-connector0:i386 (0.4.5-3.1ubuntu2) ...
Setting up openssh-client (1:6.6p1-2ubuntu2.3) ...
Setting up ncurses-term (5.9+20140118-1ubuntu1) ...
Setting up openssh-sftp-server (1:6.6p1-2ubuntu2.3) ...
Setting up openssh-server (1:6.6p1-2ubuntu2.3) ...
Setting up python-urllib3 (1.7.1-1ubuntu3) ...
Setting up python-requests (2.2.1-1ubuntu0.3) ...
Setting up ssh-import-id (3.21-0ubuntu1) ...
Processing triggers for libc-bin (2.19-0ubuntu6.6) ...
Processing triggers for ureadahead (0.100.0-16) ...
Processing triggers for ufw (0.34~rc-0ubuntu2) ...

Creating SSH2 RSA key; this may take some time ...
Creating SSH2 DSA key; this may take some time ...
Creating SSH2 ECDSA key; this may take some time ...
Creating SSH2 ED25519 key; this may take some time ...
ssh start/running, process 2103
查看執行程序:
$ ps aux | grep ssh
root 2103 0.0 0.9 7804 4968 ? Ss 03:15 0:00 /usr/sbin/sshd -D

安裝後可用 PieTTY 執行 SSH 連線: Ubuntu_SSH_OpenSSH_Install_PieTTY

另外可使用 WinSCP 來執行 SFTP 連線: Ubuntu_SSH_OpenSSH_Install_WinSCP

參考連結:

PieTTY
WinSCP