顯示具有 LNAMP 標籤的文章。 顯示所有文章
顯示具有 LNAMP 標籤的文章。 顯示所有文章

2015年9月14日 星期一

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月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


2015年9月4日 星期五

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 常用設定

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

從 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 就沒問題了!

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

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 處理!