2017年12月14日 星期四

啟用 OCSP 加快Apache速度

最近做壓測結果瓶頸點首先出現在SSL上面,想說透過HAProxy來處理443 frontend to 80 backend,不過測試上還需要些時間(也不確定穩定與否),爬到這篇文章參考網誌貌似能改善些,留存備忘嚕...

1. 檢查你的 OCSP 是否有開啟,在下列網站輸入網址查詢 https://www.digicert.com/help/

2. 啟用 OCSP on Apache Server,httpd.conf新增設定,然後重啟服務。

OCSP httpd.conf
  1. <IfModule ssl_module>
  2. SSLUseStapling on
  3. SSLStaplingResponderTimeout 5
  4. SSLStaplingReturnResponderErrors off
  5. SSLStaplingCache shmcb:/var/httpd/stapling_cache(128000)
  6. </IfModule>

2017年11月9日 星期四

[CentOS7] Ngnix 搭配 PHP-FPM + APACHE 設定SSL

CentOS 7下(包含安裝EPEL)

wget http://dl.fedoraproject.org/pub/epel/ ... l-release-7-11.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
rpm -Uvh remi-release-7*.rpm epel-release-7*.rpm

首先移除舊的
yum remove php-common

安裝相關套件
yum install php56w php56w-mysql php56w-gd php56w-ldap php56w-odbc php56w-pear
php56w-xml php56w-xmlrpc php56w-mbstring php56w-snmp php56w-mcrypt php56w-common php56w-opcache php56w-fpm php56w-imap


設定 PHP 設定檔
vim /etc/php.ini
session.save_handler = files
session.save_path = "/var/lib/php/session" 
 date.timezone = "Asia/Taipei" 
error_reporting = E_ALL & ~E_NOTICE 
display_errors = On 
magic_quotes_gpc = Off
post_max_size = 8M


設定 PHP-FPM 設定檔
vim  /etc/php-fpm.conf
include=/etc/php-fpm.d/*.conf 

 [global]
 pid = /var/run/php-fpm/php-fpm.pid 
 error_log = /var/log/php-fpm/error.log


設定 PHP-FPM 的 POOL 設定檔 
vim /etc/php-fpm.d/www.conf
[www] 
 listen = /var/run/php-fpm/php-fpm.sock
 listen.owner = nobody
 listen.group = nobody
 user = nginx
 group = nginx
 pm = dynamic
 pm.max_children = 50
 pm.start_servers = 5
 pm.min_spare_servers = 5
 pm.max_spare_servers = 35
 slowlog = /var/log/php-fpm/www-slow.log
 php_admin_value[error_log] = /var/log/php-fpm/www-error.log 
 php_admin_flag[log_errors] = on
 php_value[session.save_handler] = files
 php_value[session.save_path] = /var/lib/php/session

預設 Log 檔的權限
#chown -R nginx:nginx /var/log/php-fpm

預設 PHP SESSION 檔的權限
#mkdir /var/lib/php/session 
#chmod 766 /var/lib/php/session
#chown -R nginx:nginx /var/lib/php

啟用 php-fpm 
#systemctl start php-fpm 
#systemctl enable php-fpm


安裝 Apache mod_ssl

首先用 YUM 安裝 mod_ssl:
# yum install mod_ssl

取得憑證的CSR CRT跟CA檔

# vim /etc/httpd/conf.d/ssl.conf
DocumentRoot “/var/www/html”
ServerName www.yourdomain.com

SSLCertificateFile /ssl/ca.crt
SSLCertificateKeyFile /ssl/myserver.key
SSLCACertificateFile /ssl/ca_myserver.crt

因為使用 SSLv3 或以下有安全問題, 需要關閉 SSLv3, 找到以下一行:
SSLProtocol all -SSLv2
改為:
SSLProtocol all -SSLv2 -SSLv3

儲存檔案後離開, 並重新啟動 Apache:
# systemctl restart apache

若出現 php5-fpm.sock failed (13: Permission denied) 解法

2017年10月18日 星期三

CKEDITOR在Bootstrap Model中功能視窗跳到背景的FIX

套用RWD頁面很方便,但有些眉眉角角就得特別處理,CKEDITOR很好用兩個勾稽在一起,熊熊發現不是那麼的圓滿,當然官方也是都有解的,要找而已...Memo囉。

大體來講這個問題出在版面上,所以調整上還是不脫CSS跟JS的配合。
解決方式:
CSS
<style type="text/css">
    /* (style-metronic)modal conflict with popup of ckeditor (fix) */
.modal-backdrop {
    z-index: 1040 !important;
}
.modal {
    z-index: 1050 !important;
}
</style>

JS
<script>
// CKEditor Link input not working in bootstrap modal (fix)
$.fn.modal.Constructor.prototype.enforceFocus = function () {
    var $modalElement = this.$element;
    $(document).on('focusin.modal',
        function (e) {
            var $parent = $(e.target.parentNode);
            if ($modalElement[0] !== e.target &&
                !$modalElement.has(e.target).length &&
                !$parent.hasClass('cke_dialog_ui_input_select') &&
                !$parent.hasClass('cke_dialog_ui_input_text')) {
                $modalElement.focus();
            }
        });
};
</script>

2017年9月12日 星期二

很棒的註解,分享自鍾興叡老師(老師全盲)


●胸口摸得著的尺寸叫---胸圍;胸口摸不到的尺寸叫---胸襟。

●眼睛看得到的地方叫---視線;眼睛看不到的地方叫---視野。

●嘴裡說得出來的話叫---內容;嘴裡說不出來的話叫---內涵。

●手上比劃出來的動作叫---手勢;比劃不出來的動作叫---手段。

●腦子裡測的出的東西叫---智商;腦子裡測不出的東西叫---智慧。

●耳朵聽得到的動是---聲音;耳朵聽不到的動是---聲譽。

●証件上印出來的叫---文憑;証件上印不出的叫---文化。

●溫度計量出的熱呼叫---溫度;溫度計量不出來的熱呼叫---溫暖。

●手指寫得出的文字叫---文章;手指寫不出的文字叫---生命。

●鏡子裡看得到的是---自己;鏡子看不到的是---自我。

●金錢衡量出的是---價格;金錢衡量不出的是---價值。

●存款顯示的出來的叫---財產;顯示不出來的叫---財富。

●牽掛在嘴上的叫---情話;牽掛在心裡的叫---情感。

2017年7月31日 星期一

Unexpected inconsistency; run fsck manually. 處理備忘

昨天颳颱風早上發現服務沒運行,聽說當天電力不穩頻頻跳電約十餘次,不過當下沒有去關機所以當UPS扛不住的時候就重啟再重啟...造成的吧?





處理方式:
1. 畫面顯示要先輸入ROOT密碼,輸入完成後會進入Repair filesystem模式
2. 依照畫面顯示錯誤的磁碟位置,輸入 fsck -y /dev/mapper/vg_crm-lv_root 依照畫面指示進行(如下圖所示)


備忘:
在維護模式下,如果要管理相關的資料夾或檔案,輸入指令時會告知為 read-only file system,可使用mount -o remount,rw / 去改變設定。

2017年6月29日 星期四

刪除Linux上中文亂碼檔案/資料夾

1. 透過 ls -i 找到檔案/資料夾代表的編號
ls -i       //查看檔案代表的編號
2. 再用 find 去找這個編號的檔案後刪除
//刪除單一檔案
find -inum 檔案編號(數字) -delete 

//刪除整個資料夾
find -inum 檔案編號(數字) -exec rm -rf {} \; 

PHP的file_get_contents 逾時操作

在PHP中file_get_contents蠻常用到的,需要注意的地方大概就是在php.ini裡需要將allow_url_fopen = on,還有就是User Agent偽裝一下

ini_set('user_agent','Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0')

不過最近發現到如果呼叫的url過大,就有一定的機率回500錯誤  Orz...

解決方法:
GET:

  $opts = array(  
     'http'=>array(  
          'method'=>"GET",  
          'timeout'=>600,  
       )  
   );  
  $context = stream_context_create($opts);  
  file_get_contents($target_url, false, $context);

POST:

function Post($url, $post = null)  
{  
    $context = array();  
   
    if (is_array($post)) {  
        ksort($post);  
   
        $context['http'] = array (  
            'timeout'=>600,  
            'method' => 'POST',  
            'content' => http_build_query($post, '', '&'),  
         );  
    }  
   
    return file_get_contents($target_url, false, stream_context_create($context));  
}  
   
$data = array (  
    'name' => 'test',  
    'email' => 'test@gmail.com',  
    'submit' => 'submit',  
 );  
Post('http://www.example.com', $data);  

加上TimeOut時間就能避免了,不過就是等久了些使用者會不耐煩。在JQuery的非同步執行下~等久了有若干機會造成DB的Deadlock狀態(透過呼叫API同步資料再搭配系統操作...)。

PS. 建議使用curl或fsockopen來處理,file_get_contents用起來簡單但是其缺點也是挺無奈地,萬一主機商不給改php.ini 或是資料量大或運算/執行較久的頁面,那Debug起來不方便。



2017年6月28日 星期三

在IIS上套用htaccess設定

在Linux上給Apache很好用的.htaccess ~ 移植到Windows + IIS環境理論上應該可行吧,試出來後就備忘一下囉,免得過些日子又忘光了。

1. 首先開啟Microsoft Platform installer,用關鍵字url去篩選會看到Url Rewrite這產品~點選新增後慢慢下一步下一步安裝,安裝完成後重啟IIS。


2. IIS重啟完成後,若安裝成功就可以看到URL Rewrite這元件,勇敢地點下去吧。


3. 點選"匯入規則"後點選要匯入的.htaccess檔案,完成後會看到匯入的規則X...




後記: 請務必確認.htaccess內規則是正確的,不然Debug上會花費不少功夫,畢竟那是在LAMP環境下很好用的設計,移到WIN平台上可能支援性上也不能要求完美。




2017年6月12日 星期一

mariadb 大小寫敏感性的設定

登入 mariadb 後


show variables like 'lower%'

windows 預設是 1 不區分大小寫
unix 預設是 0 有區分大小寫

修改...
vim /etc/my.sql.d/server.cnf

在[mysqld]下新增
lower_case_table_names = 1

重啟mariadb 指令 service mysql restart  即可

缺點...若是既成的Database那麼若有Table Name使用到大小寫的就會讀不到,需要匯出Database整理成小寫後再匯回。

2017年5月15日 星期一

將DNS移轉到Azure DNS備忘

這些天在搬移DNS SERVER,因為IP可能換了所以要改的設定很多,不過其中發現最大的問題是架設在Azure VM中的DNS服務無法有效的被Hinet DNS連線,後來就有了此篇文章...

天下沒白吃的午餐,計價請參閱官方網站,不過不貴就是了。
https://azure.microsoft.com/zh-tw/pricing/details/dns/

Azure的VM可以指派公用IP使用,不過從內部檢視網路設定還是只配送Intranet IP,使用dig DomainName @公用IP 均回復Time out再對照使用者回報無法開啟各個服務所以問題大概是確認,參考此篇網址進行改修順利套用...但有些畫面不一下面是目前所使用的步驟。

1. 在Azuer的網路中找到DNS區域,新增此應用程式。


2. 開始設定A, CName, MX紀錄,右上角反白區域是等等設定要用的。


3. 將反白區域的DNS Server name去PING,取到相對應的IP


4. 因為網域是透過Hinet購買的,所以得至DNS異動與設定告知目前使用轉譯服務的設定,將Azure的那幾個DomaneName與透過命令提示字元ping到的IP輸入上去。


5. 完成後點確認看到下面的訊息,就等囉...




2017年4月19日 星期三

SSH與VirtualBox的錯誤紀錄

近期某個雲端伺服器要連線時回傳Write failed: Broken pipe

方法一:如果您有多台服务器,不想在每台服务器上设置,只需在客户端的 ~/.ssh/ 文件夹中添加 config 文件,并添加下面的配置:
ServerAliveInterval 60
方法二:如果您有多个人管理服务器,不想在每个客户端进行设置,只需在服务器的 /etc/ssh/sshd_config 中添加如下的配置:
ClientAliveInterval 60
方法三:如果您只想让当前的 ssh 保持连接,可以使用以下的命令:
$ ssh -o ServerAliveInterval=60 user@sshserver

恩恩...因為伺服器在雲端,曾經發生改了防火牆或SSH就再也失聯的窘境,所以就下次小心別遺忘伺服器太久沒去關心,放大絕重開機解決無法連線的問題,還好有規劃Load Balance環境!! 有驚無險地排除~~

另一個狀況是,VM做了快照之後~重開機完顯示cannot be closed because it is still attached to 1 virtual machines ... 
解決方式

1. 先卸載 vdi
代碼: [選擇]
$ VBoxManage storageattach $VM --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium none
2. 關閉 vdi
代碼: [選擇]
$ VBoxManage closemedium disk /path_to/xxx.vdi
$ VBoxManage showhdinfo /path_to/xxx.vdi
UUID:                 08bdda17-96f9-4363-a9bb-0807686fd0a8
Accessible:           yes
Logical size:         122880 MBytes
Current size on disk: 43279 MBytes
Type:                 normal (base)
Storage format:       VDI
Format variant:       dynamic default
Location:             /path_to/xxx.vdi
Accessible 狀態 yes


3. 重新掛載 vdi
代碼: [選擇]
$ VBoxManage storageattach $VM --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium /path_to/xxx.vdi
4. 啟動 vm
代碼: [選擇]
$ VBoxHeadless -s $VM &
恩恩...認真的依據提示做了一輪,還是GG沒有FIX。依舊是放大絕去改XXX.vbox檔案~把異常的部分砍掉再重開機解決順利開機,不過這部分之前曾經有過許多血淚經驗,沒把握別去動.vbox設定檔,最低限度記得備份原始檔,以免還原時找不到下手處。

2017年4月14日 星期五

wildcard 的 apache 與 DNS Srv 設定

*.domainName.xxx 的設定首次看到愣了一下,在DNS伺服器設定後去Ping結果都得不到回應,近日才發現誤會了它,做個MEMO...

DNS Srv setting

vim /etc/bind/db.domainName.xxx  中新增DomainName與IP的對應設定
*.domain.Name.xxx.  IN  a   10.0.0.1
最後重啟服務後,去ping OOO.domainName.xxx若有回應則表示完成,最後就是等待24小時生效。

Apache Srv setting

vim /etc/httpd/conf/httpd.conf 中於Virtual host設定中加入
ServerAlias *.domainName.xxx

服務重啟後,於網址列輸入https://OOO.domainName.xxx/ 有回應的話則表示設定正確。

2017年4月7日 星期五

Apache 中設定SSL及申請使用免費的SSL教學註記



  1. 輸入網址:OOO.net

3. 選擇手動模式
 
     4. 將檔案下載並放置網站更目錄,點選驗證的URL確認讀取的到。



      5. 下載取得相關的SSL檔案

  1. 安裝Apache SSL模組
    yum install mod_ssl
  2. 修改Apache設定
Vim /etc/httpd/conf/httpd.conf
紅色為新增置Apache Server的設定,完成後請重啟服務。
NameVirtualHost *:443

<VirtualHost *:80>
  DocumentRoot /var/www/html/XXX/
  ServerName hrm.tibtrade.net
  ErrorLog logs/dummy-XXX.net-error_log
  CustomLog logs/dummy-XXX.net-access_log common
  RewriteEngine on
  RewriteCond %{SERVER_PORT} !^443$
  RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
</VirtualHost>

<VirtualHost *:443>
   DocumentRoot "/var/www/html/XXX"
  ServerName hrm.tibtrade.net
  SSLEngine on
  SSLCertificateFile /etc/httpd/ssl/xxx.crt
  SSLCertificateKeyFile /etc/httpd/ssl/xxx.key
  SSLCACertificateFile /etc/httpd/ssl/ca-xxx.crt
</VirtualHost>

2017年3月24日 星期五

工商服務: 攤友APP 體驗分享

APP Store有個免費的APP,傳說中免費的最貴...恩恩...繼續看下去

安裝好APP後,一開啟會先要求簽到/打卡開工,看來是要求需要裝置是處於線上狀態才能使用,非離線可用軟件對於沒買吃到飽的偶來說小小雞肋。


快速的建立些商品訂定價格,這部分還挺簡單易用的算加分吧。
隱藏技:常駐在商品上拖曳可以改變排序。


統計報表與銷售紀錄來看,銷售單、銷售商品清單、餅圖...大致需要的都有了,沒啥好挑骨頭的。



後記: 隔一天後開啟APP,結果銷售紀錄清空嚕 =.= 這...只有一天好活的資料。後來看到如果個人資料註冊了email後,隔天會收到前一天的銷售報表EXCEL檔案,取得小小安慰一下。

評價:
很簡單直白的軟體,已CP值來算因為免費所以分母是 0 結果就是無限大。

可是使用中若是離線就無法結帳;
銷售單只存一天得在去處理每日報表檔才能核算周、月...等業績還是卡麻煩;
打卡? 要幹嘛呢?? 敬請期待就是了吧???


2017年3月23日 星期四

Asterisk check file exist example

之前透過 system() 來判斷,結果若單一資料夾內有多個符合條件的檔案則不回覆success造成誤判,其實system()的回覆狀態success也只是表示執行成功。

節錄:
FAILURE Could not execute the specified command
SUCCESS Specified command successfully executed
APPERROR Triggered for example when you try to delete a file but the file was not there.
NOTE - not documented, but can also return APPERROR
NOTE - I don't seem to be able to create a situation when FAILURE will be returned. 
※當然他在已知具體檔名的狀態下,確實能有判斷檔案是否存在的功用在。

之前的寫法...
exten => _99888,1,System(test -e /tmp/*87${EXTEN:3:3}*.call)
exten => _99888,n,NoOp(${SYSTEMSTATUS})
exten => _99888,n,GotoIf($["${SYSTEMSTATUS}" = "SUCCESS"]?start:end)

現在的寫法...

exten => _99888,1,Set(result=${SHELL(ls -rt /tmp/*87${EXTEN:2:3}*.call | head -1)})
exten => _99888,n,NoOp(${result})
exten => _99888,n,GotoIf($["${result}" = ""]?end:start)

若是有檔案存在result會存有檔案路徑,所以判斷是否為空值就可以了。

補充說明...
SYSTEM() 跟 SHELL()都有其方便的地方,看所需的功能用哪個比較不會出錯即可。

2017年2月14日 星期二

刪除硬碟裡的EFI分割區~~

在windows的磁碟管理中,會有些磁區無法被刪除的狀況,可用指令方式處理,步驟如下:

1. 窗窗鍵+R叫出命令提示字元,輸入diskpart執行

2. 輸入list disk列出所有硬碟

3. 輸入select disk N選擇目標硬碟

4. list partition 觀看該硬碟內的所有分割區

5. 確認是目標後輸入clean就會清除所有分割區了(不可逆~所以要確認後行事)。

6. 輸入exit後離開程式。

2017年1月5日 星期四

用資料用JSON編碼搭配POST方式的交換機制~備忘

與異質平台整合(如金流)碰上資料交遞上的方法,有時資料封裝得做JSON編碼不是直接參數名送出,因此寫個MEMO幫助記憶...

傳送時...

1. 首先是資料傳遞的FUNC ,$Url是目的地、$post就是交換的資料,若要改成GET則調整CURLOPT_CUSTOMREQUEST設定即可。timeout時間故意調長,因為碰上timeout錯誤時很殘念的。

function PostData($Url, $post){
 $ch = curl_init($Url);
 $headers = array(
   'Content-Length:'.strlen($post),
   'Content-type: application/json'
 );
 //print_r($headers);
 $options = array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => 1,
CURLOPT_CUSTOMREQUEST=>"POST", 
CURLOPT_POSTFIELDS=> $post,
CURLOPT_HTTPHEADER=> $headers,
CURLOPT_TIMEOUT=>500,
CURLOPT_CONNECTTIMEOUT=>5
 );
 curl_setopt_array($ch, $options);
 $result = curl_exec($ch);
 if(curl_errno($ch)!=0){
  trigger_error(curl_error($ch));
 }
 curl_close($ch);
 return $result;
}

2. 傳遞參數封裝,做成陣列即可...弄複雜些給個陣列包陣列的sample

$params_data = array( 
 'order_no' =>  $order_no,
 'amt' =>  $amt,
 'result_url' =>  $result_url
);

$order_data = array (
 'sender' => "rest",
 'ver' => "1.0.0",
 'tx_type' => 1,
 'params' => $params_data 
);

3. 開始傳遞
PostData($URL, json_encode($order_data));

接收時....

1. 首先...因為不知道傳回來的是啥變數名,只知道是個JSON串,所以通通一起收php://input是蠻方便的方式。
$post_data = file_get_contents("php://input");

2. 拆解JSON取得資料,原則上卡關較久的是array裡面的array資料讀取。
$j_result = json_decode($post_data);
$data = array(
   'order_no'=> $j_result->params->order_no,
   'sender'=> $j_result->sender,
 );