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