2016年12月28日 星期三

Asuswrt-Merlin SIP單邊通話設定備忘

SIP通話穩定性很重要,尤其是處於NAT環境中,市面上的AP選擇很多,這邊挑了ASUS系列的AP來刷Asuswrt-Merlin韌體實測運行狀況還不賴,做個MEMO。

1.首先...韌體要先拿的到,別傻傻到ASUS官網上抓,那是功能不算多。
韌體下載網站:https://www.mediafire.com/folder/bkfq2a6aebq68/Asuswrt-Merlin

2. 開啟防火牆。這是一定要的...沒必要拿安全開玩笑。

3. 設定虛擬伺服器。實測外網5060對內網5060最穩,可是用了5060那security warring的LOG暴增。

4. 下圖記得設關閉。從字面上來看啟動會減少SIP使用的障礙,ㄚ不知是哪種SIP總之跟ASTERISK不合,不關在NAT環境下可能會有一定機率單向通話狀況。


PS. 為什麼不挑DD-WRT或Tomato哩,實測後均有殘念的地方,而且在AP上架LAMP+PBX系統支援上Asuswrt-Merlin最為激賞(...可惜之前被BOT攻破被當跳板(=.= 接到種花電信的通知,不砍掉就封網),就放棄這條路回到NAT打洞。

2016年11月7日 星期一

CentOS 7 : Install HAProxy Load Balancer by Apache and MariaDB

流程參考網誌

yum install haproxy wget gcc pcre-static pcre-devel mariadb-client -y

#新增相關的電腦名稱及對應IP
vi /etc/hosts

#在目標DB建立使用者_應用於balance source
CREATE USER 'haAccount'@'10.1.0.X';
flush privileges;

vi /etc/haproxy/haproxy.cfg 參考網誌

defaults
    mode                    tcp
    log                     global
    timeout http-request    5s
    timeout queue           1m
    timeout connect         5s
    timeout client          30s
    timeout server          30s
    timeout http-keep-alive 10s
    timeout check           10s

#WebServer
frontend ft_web
  bind 0.0.0.0:80

  # Use General Purpose Couter (gpc) 0 in SC1 as a global abuse counter
  # Monitors the number of request sent by an IP over a period of 10 seconds
  stick-table type ip size 1m expire 10s store gpc0,http_req_rate(10s)
  tcp-request connection track-sc1 src
  tcp-request connection reject if { src_get_gpc0 gt 0 }

  # Split static and dynamic traffic since these requests have different impacts on the servers
  use_backend bk_web_static if { path_end .jpg .png .gif .css .js }

  default_backend bk_web

# Dynamic part of the application
backend bk_web
  balance roundrobin
  cookie MYSRV insert indirect nocache
  # If the source IP sent 10 or more http request over the defined period,
  # flag the IP as abuser on the frontend
  acl abuse src_http_req_rate(ft_web) ge 10
  acl flag_abuser src_inc_gpc0(ft_web)
  tcp-request content reject if abuse flag_abuser

  server WWW1 10.1.0.1:80 check cookie TibSrv maxconn 100
  server WWW2 10.1.0.2:80 check cookie SNS maxconn 100

# Static objects
backend bk_web_static
  balance roundrobin
  server WWW1 10.1.0.1:80 check maxconn 1000
  server WWW2 10.1.0.2:80 check maxconn 1000

#DB Server
listen garlera 0.0.0.0:3306
     balance leastconn
     mode tcp
     option tcpka
     option mysql-check user haAccount
     server DB1 10.1.0.3:3306 check weight 1
     server DB2 10.1.0.4:3306 check weight 1

## HAProxy stats web gui running on port 9000 - username and password: howtoforge.
## url http://X.X.X.X:9000/stats
listen stats 0.0.0.0:9000
        mode http
        stats enable
        stats uri /stats
        stats realm HAProxy\ Statistics
        stats auth howtoforge:howtoforge
        stats admin if TRUE

設定開機啟動
systemctl enable haproxy

啟動服務
systemctl start haproxy

檢查服務狀態
systemctl status haproxy

#備忘...

1. 防火牆記得開
systemctl start firewalld
firewall-cmd --permanent --add-port=9000/tcp
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload

2. 檢查Selinux設定
特徵~CI連線時只有localhost可連其餘的都被擋掉就是它的關係了...
暫時關閉指令 setenforce 0
永久關閉就去改成disable即可

3. 目標電腦連線檢查
ssh account@IPAddr

4. 服務是否運作
netstat -ant

5. 時區...將資料匯入後發現都差8小時,要記得改timezone
指令 timedatectl set-timezone Asia/Taipei



2016年11月4日 星期五

CentOS 7 YUM 安裝 MariaDB 10.01 Galera Cluster Server

1. 安裝MariaDB ,相關參考的網頁 1, 2, 3, 4,

※mysql_secure_installation 要記得允許root從Remote Login

2 .安裝其他套件(可能會用到的)
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
yum install -y percona-xtrabackup-24 yum rsync nmap lsof perl-DBI nc galera socat jemalloc

如果要使用RSYNC,可以設定SSH KEY
ssh-keygen -t rsa
cat /var/lib/jenkins/.ssh/id_rsa.pub >> “other db server” /root/.ssh/authorized_keys

如果只是要測安裝,可以先關閉firewall與selinux ,正式環境還是乖乖啟動吧。
systemctl disable firewalld
systemctl stop firewalld

vim /etc/sysconfig/selinux set disable

3. 啟動DB,設定帳號
service mysql start
GRANT ALL PRIVILEGES ON *.* TO 'sync'@localhost  IDENTIFIED BY 'Password' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'sync'@'10.1.0.%' IDENTIFIED BY 'Password' WITH GRANT OPTION;
flush privileges;

4. 關閉DB,設定環境Node 1環境
service mysql stop

Node 1.
vim /etc/my.con.f/server.cnf
[mysqld]
innodb_use_sys_malloc = 1
event_scheduler = ON
max_connections = 1024
log-bin-trust-function-creators = 1
default-time-zone = '+8:00'
character-set-server=utf8

wsrep_sst_auth=sync:Password
wsrep_sst_method=rsync
#wsrep_sst_method=xtrabackup

[galera]
wsrep_on=ON

binlog_format=ROW
default_storage_engine = innodb
innodb_autoinc_lock_mode = 2
innodb_buffer_pool_size = 122M
query_cache_type = 0

wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name='mycluster'
wsrep_cluster_address='gcomm://'
wsrep_node_name='DB-1'
wsrep_node_address='192.168.1.1'

bind-address=0.0.0.0

啟動First DB
galera_new_cluster

service mysql start  --wsrep-new-cluster

6. Node N的部分,重新處理1~4的步驟,差異點如下
Node N.
vim /etc/my.con.f/server.cnf
[mysqld]
innodb_use_sys_malloc = 1
event_scheduler = ON
max_connections = 1024
log-bin-trust-function-creators = 1
default-time-zone = '+8:00'
character-set-server=utf8

wsrep_sst_auth=sync:Password
wsrep_sst_method=rsync
#wsrep_sst_method=xtrabackup

[galera]
wsrep_on=ON

binlog_format=ROW
default_storage_engine = innodb
innodb_autoinc_lock_mode = 2
innodb_buffer_pool_size = 122M
query_cache_type = 0

wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name='mycluster'
wsrep_cluster_address='gcomm://192.168.1.1:4567,192.168.1.N:4567(看有幾台都設上去)'
wsrep_node_name='DB-N'
wsrep_node_address='192.168.1.N'

bind-address=0.0.0.0

啟動Node N DB
service mysql start

7. 當第2台DB同步後,記得回到第一台設定
wsrep_cluster_address='gcomm://192.168.1.1:4567,192.168.1.N:4567(看有幾台都設上去)'

啟動Node 1 DB
service mysql start 

8. 檢查狀態
netstat -ant ...  注意3306與4567是否有啟動
mysql -u root -p -e "show status like 'wsrep%'" ... 檢查相關的Node是否有上線


2016年11月2日 星期三

How to Test SMTP AUTH using Telnet

新的SERVER常發現無法寄信的狀況,往往顯示permission denied或time out的回覆就沒ㄌ,測試過程MEMO一下,不然每次GOOGLE都要再篩選解答...

telnet mailsrv.domain.name 25
[enter]
ehlo mailsrv.domain.name
[enter]
auth login
[enter]
先輸入帳號的base64碼
[enter]
再輸入密碼的base64碼
[enter]

之後就看結果囉...

第一步,如果telnet無法連線,表示是mail server的問題,可能是PORT可能是防火牆
第二步,如果認證失敗,就表示是帳號問題;另外要注意如果有開啟SELinux務必檢查httpd_can_sendmail是否為OFF。




2016年10月27日 星期四

在CentOS 7 架設互為備援的MariaDB設定

Azure上新增的VM選CentOS 7安裝完畢以後~

安裝MariaDB...就參閱之前的文章步驟不變。

設定DB
vim /etc/my.cnf.d/server.cnf

[mysqld]
# Replication Setting
server-id=1  <- 為數字,每台不重複即可
log-bin=mysql-bin

新增同步帳號
CREATE USER 'backup'@'Remote_IP_Addr' IDENTIFIED BY 'key in password';
GRANT REPLICATION SLAVE ON *.* TO 'backup'@'Remote_IP_Addr';
FLUSH PRIVILEGES;

接著做一次 MariaDB 異地備援不同步時的處理,只需要DB SYNC一次即可,任選一邊當MASTER。

兩邊均設定主從
STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='Remote_IP_Addr', MASTER_PORT=3306, MASTER_USER='backup', MASTER_PASSWORD='key in password';
START SLAVE;

檢查雙邊機制是否正常運作,若沒有ERROR就是了。
show slave status \G;



MariaDB : Failed Registration of InnoDB as a Storage Engine

昨晚DB顯示GG了,早上追了一下貌似自建Function沒設Read Only造成Log塞爆導致Slave DB LOG同步異常,然後自我修復重啟失敗所致。

做個MEMO囉...不經一事不長一智。
ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL,
or READS SQL DATA in its declaration and binary logging is enabled
(you *might* want to use the less safe log_bin_trust_function_creators
variable)
參考官方文件中的描述,在建立FUNCTION時,要增加READS SQL DATA否則在Recovery或Replicatioin時會出現unsafe的error message,這message多了就會塞爆LOG...
CREATE FUNCTION f1(i INT)
RETURNS INT
DETERMINISTIC
READS SQL DATA
BEGIN
  RETURN i;
END;

無法啟動的LOG類似以下這個...只需要把/var/lib/mysql/下的ib_logfileXX跟ibdataX搬移開來(要移除也行~不過個人習慣是下MV指另,RM下好離手就回不來了。

101003 18:37:27 [Note] Plugin 'FEDERATED' is disabled.
InnoDB: Error: log file .\ib_logfile0 is of different size 0 40894464 bytes
InnoDB: than specified in the .cnf file 0 536870912 bytes!
101003 18:37:27 [ERROR] Plugin 'InnoDB' init function returned error.
101003 18:37:27 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
101003 18:37:27 [ERROR] Unknown/unsupported table type: InnoDB
101003 18:37:27 [ERROR] Aborting

接者下service mysql start 或 systemctl start mariadb.service 啟動即可。

  • Slave DB 出現 Could not initialize master info structure 時,下reset slave; 清一下LOG
  • 出現 Error : Tablespace for table '`database`.`table-temp`' exists. Please DISCARD the tablespace before IMPORT.
    這個卡麻煩~畢竟DB不是都自己在處理的,其他人刪除Table沒下Drop指令而是使用...時,就會造成此錯誤,請將該table-temp.idb搬移出目錄即可。
  •  







2016年10月19日 星期三

在 Windows 7 上安裝 Apache + PHP +MySQL

務必注意作業系統是32還是64位元的,因為選錯了安裝會跳異常但不會跟你說是XX位元問題。

Apache 2.4 Install
下載網址:http://www.apachelounge.com/download/
安裝在C更目錄下,命名為Apache24

增修 ./Apache24\conf\httpd.conf 
LoadModule php5_module "c:/php/php5apache2_4.dll"
AddHandler application/x-httpd-php .php
# configure the path to php.ini
PHPIniDir "C:/php"

#Find Directory index and add index.php
DirectoryIndex index.html index.php

Microsoft Visual C++ 2012 Runtime
下載網址 https://support.microsoft.com/en-us/kb/2977003 ...不裝的話會跳錯誤訊息...

PHP 5.6.12  Install
下載網址  https://support.microsoft.com/en-us/kb/2977003 ... 下載套件VC14表示是利用哪個版本的Visual Studio編譯,所以下載的套件必須搭配相對的Runtime才能使用。

安裝在C更目錄下,命名為php
增修php.ini
extension_dir = "ext"

extension=php_mysql.dll
extension=php_mysqli.dll
extension=php_bz2.dll
extension=php_fileinfo.dll
extension=php_gd2.dll
extension=php_gettext.dll
extension=php_gmp.dll
extension=php_mbstring.dll

使用php -m 檢視載入模組是否正確,也可以使用phpinfo();來看。

在系統環境變數下
新增;c:\php;c:\Apache24;c:\Apache24\bin

命令提示字元操作
安裝Apache  c:\apache24\bin\httpd -k install
開機啟動        c:\sc config Apache2.4 start=auto

其他
網站預設路徑 C:\Apache24\htdocs

2016年10月5日 星期三

codeigniter csrf機制設定

串接金流後...想找些避免被有心人士誤用的頁面稽核機制,除了原有的那些措施之外,有文章推薦可啟用在 CI 2.0的 csrf(Cross Site Request Forgery) protection 功能。

設定 application\config\config.php將csrf打開

$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 7200;

接著在View中如果有需要提交的Form則使用form_open(action, variable array)來寫就會直接產生相關的Code,真方便。

不過...如果有接收金流的Return Url時,會出現不給接收的Message(謎之聲~當然因為金流公司不會送相關的稽核Code過來。
解法:

設定 application\config\config.php中改寫為

if (stripos($_SERVER["REQUEST_URI"],'controler name/function name') === FALSE) {
  $config['csrf_protection'] = TRUE;
else 
  $config['csrf_protection'] = FALSE; 

這樣就能有例外情況了。

另外如果不想使用form_open()要手動來的話~找到的範例如下。
$(function(){
    $('#btn').click(function(){
        $.ajax({
            type:'POST'
            ,url:'/ajax' //ajax接收的server端
            ,data:$('#form').serialize()+'&csrf_test_name='+ getCookie('csrf_test_name')
            ,success:function(data){
            alert(data.msg);
            }
            ,dataType:'json'
        });
    });
});

function getCookie(name){
    var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)"));
    if(arr != null) return unescape(arr[2]); return null;

}

RHEL / CentOS 安裝 APC 加速 PHP

APC (Alternate PHP Cache) 是一套 PHP 快取系統, 它可將沒改變 PHP Code 情況下, 將已編譯結果緩存下來, 下次需要使用時就可節省重新編譯的時間。

因為CentOS之前手動升級成PHP 5.6所以指令要小修一下才能裝。

所需套件
yum install php56w-pear php56w-devel httpd-devel pcre-devel
安裝套件
yum install php56w-pecl-apcu

在Ubuntu使用
apt-get install php-apc

重啟服務

service httpd restart

最後檢查 APC 是否正確安裝, 使用 phpinfo()去觀看是否有APCU的套件,若有則表示完成了。


2016年9月1日 星期四

MariaDB 異地備援不同步時的處理

1.於Slave DB : stop slave;
   --停止Slave的同步

2.於Master DB: mysqldump --user=root -p --master-data --all-databases > /tmp/mysql_full.sql
   --做全DB備份,注意 --master-data 一定要加

3.於Master DB : RESET MASTER;
--清除Master的Log

4.於Master DB : scp -pr /tmp/mysql_full.sql tibtrade@10.1.0.5:/tmp/
   --將Master備份的資料傳到Slave機器上

5. 於Slave DB : mysql -u root -p --default-character-set=utf8 < /tmp/mysql_full.sql
   --將全DB備份還原至Slave DB

6. 於Slave DB : RESET SLAVE;
--清除Slave Log

7. 於Slave DB : start slave;
   --啟動同步機制

8. 於Slave DB : show slave status \G; 
   --檢查是否有ERROR




2016年8月25日 星期四

phpmailer 無法寄信狀況排除的備忘

首先...先測試伺服器連線是否正常

yum install telnet <- 安裝telnet套件

telnet DomainName 25 ... 要有回應,輸入Quit跳開

其次可能是SELinux擋掉,所以使用

getsebool httpd_can_sendmail ... 必須是ON

如果是OFF則使用 setsebool httpd_can_sendmail=1

貌似歧途...
有網友提到可能是openssl造成,前提必須是認證使用TLS或SSL
透過php -i檢查是否有支援openssl,如果沒有就安裝並將openssl.so enable.

CodeIgniter 網址列 index.php去除備忘

之前嘗試失敗的今天成功了,備忘一下...主要差別在httpd.conf AllowOverride沒設成 ALL所致。現在URL看起來清爽多了。

1. ../.htaccess增加
DirectoryIndex index.php
RewriteEngine on
RewriteCond $1 !^(index\.php|images|css|js|robots\.txt|favicon\.ico)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]

2. 在../application/config/config.php
$config['index_page'] = ''; 原:'index.php'

3. vim httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so => 去掉#
AllowOverride None=> AllowOverride All

At Ubuntu 16.04

aptitude reinstall apache2.2-common
a2enmod headers
sudo a2enmod rewrite
service apache2 restart

2016年8月19日 星期五

抓MariaDB slow query log 的設定備忘

昨晚DB無法啟動,先REBOOT後恢復早上又掛了,使用檢查錯誤LOG指令
#mysqld --help --verbose | grep 'log-error' | tail -1

[Note] Plugin 'FEEDBACK' is disabled.
[ERROR] mysqld: unknown option '--log-long-format'
[ERROR] Aborting

看來是之前埋入的儲存Long Query的設定出問題,不過會觸發到又發生失敗還是因為MySQL 5.6 -> MariaDB 10.1之後,又適巧某事主開發時使用到慢吞吞的SQL Query等連鎖反應造成的。

my.cnf的設定為

[mysqld]
feedback=ON       <-  少加這行所以回 Plugin 'FEEDBACK' is disabled.
slow_query_log
slow_query_log_file = /var/log/mysql-slow.log
long_query_time = 10
#log-long-format  <-多了這行所以出現unknown option 'log-long-format' 


FEEDBACK用處請參考本篇 


2016年8月9日 星期二

Ubuntu 14.04 Upgrade to 16.04

昨天發現Ubuntu 14.04安裝MariaDB10.01後,在InnoDB的Table無法設定FULLTEXT...所以救昇版囉!! 不過之前在Ubuntu 16.04的PHP 7在CI舊版支援上不得不Down到PHP 5,過渡時期就先這樣吧。

參考此網址

  1. sudo apt-get update
  2. sudo apt-get upgrade
  3. sudo apt-get dist-upgrade
  4. sudo apt-get install update-manager-core
  5. sudo do-release-upgrade

接下來就等...期間會有些地方需要確認打Y/N...

2016年7月29日 星期五

On Ubuntu 16.04 downgrade from php 7 to php 5

話說Azure新的Ubuntu可以挑16.04版本,可內建式PHP 7 ... 目前開發用的CI是2.X版,貌似在SESSION操作上有問題回500錯誤(屬於系統錯誤~Error Log無),急件還沒空Debug~先備註降版的過程!

引用來源
  1.   安裝套件
  2. apt-get install software-properties-common
    add-apt-repository ppa:ondrej/php
    apt-get update
    apt-get install php7.0 php5.6 php5.6-mysql php-gettext php5.6-mbstring php-xdebug libapache2-mod-php5.6 libapache2-mod-php7.0 php5.6-curl php5.6-mcrypt php5.6-xml   
  3.  切換版本

    php 5 to 7
      a2dismod php5.6
      a2enmod php7.0
      service apache2 restart
      ln -sfn /usr/bin/php7.0 /etc/alternatives/php

    php 7 to 5
      a2dismod php7.0
      a2enmod php5.6
      service apache2 restart
      ln -sfn /usr/bin/php5.6 /etc/alternatives/php
  4. 檢查

    php -v  看版本
    php -m 看module
備忘: CI 3.1版發布了~熊熊回去看開發版本與最新版版的差異有點大...等Ubuntu 16.04跑穩後在動手吧。不過DB Drive在php 7已不支援mysql而要改成mysqli就先行處理,在php 5.X跑mysqli尚未發現異常。

2016年7月26日 星期二

CodeIgniter套用language備忘

在CI預設FrameWork是沒加上語系表,不過語系表方便多國語言套用~這很好用就Memo一下!!

在language新增相關語系資料夾 etc: en, zh ...

在config
  : autoload
  $autoload['model'] = array('Appconfig', ...

  :config
  $config['language'] = 'zh';

  :hooks
  $hook['post_controller_constructor'] = array(
                                'class'    => '',
                                'function' => 'load_config',
                                'filename' => 'load_config.php',
                                'filepath' => 'hooks'
                                );

在hook
  新增load_config.php

function load_config(){
    $CI =& get_instance();
    foreach( $CI->Appconfig->get_all()->result() as $app_config )
    {
        $CI->config->set_item( $app_config->key, $app_config->value );
    }
    
    //Set language from config database
    //Loads all the language files from the language directory
    
    if ( $CI->config->item( 'language' ) )
    {
        $CI->config->set_item( 'language', $CI->config->item( 'language' ) );
        
        $map = directory_map('./application/language/' . $CI->config->item( 'language' ));

        foreach($map as $file)
        {
            if ( substr(strrchr($file,'.'),1) == "php")
            {
                $CI->lang->load( str_replace( '_lang.php', '', $file ) );    
            }
        }
    }
    
    //Set timezone from config database
    if ( $CI->config->item( 'timezone' ) )
    {
        date_default_timezone_set( $CI->config->item( 'timezone' ) );
    }
    else
    {
        date_default_timezone_set( 'America/New_York' );
    }
}
  
在model
  新增appconfig.php

class Appconfig extends CI_Model {
function exists($key)
{
$this->db->from('app_config');
$this->db->where('app_config.key',$key);
$query = $this->db->get();

return ($query->num_rows()==1);
}

function get_all()
{
$this->db->from('app_config');
$this->db->order_by("key", "asc");
return $this->db->get();
}

function get($key)
{
$query = $this->db->get_where('app_config', array('key' => $key), 1);

if($query->num_rows()==1)
{
return $query->row()->value;
}

return "";

}

function save($key,$value)
{
$config_data=array(
'key'=>$key,
'value'=>$value
);

if (!$this->exists($key))
{
return $this->db->insert('app_config',$config_data);
}

$this->db->where('key', $key);
return $this->db->update('app_config',$config_data);
}

function batch_save($data)
{
$success=true;

//Run these queries as a transaction, we want to make sure we do all or nothing
$this->db->trans_start();
foreach($data as $key=>$value)
{
if(!$this->save($key,$value))
{
$success=false;
break;
}
}

$this->db->trans_complete();
return $success;

}

function delete($key)
{
return $this->db->delete('app_config', array('key' => $key)); 
}

function delete_all()
{
return $this->db->empty_table('app_config'); 
}
}

2016年7月20日 星期三

WordPress 的 WP-Mail-SMTP設定

針對Contact Form 7需要所以得開通SMTP服務。

1. WordPress安裝WP MAIL SMTP 的PlugIn,用搜尋外掛即可找到。

2. WIN SERVER安裝hmailserver並完成相關安全性設定,參考此篇... 避免被當跳板所以SMTP認證都得開啟,同時關閉外部至外部郵件的路由。

3. 自WordPress設定項找到EMail進入,設定參考此篇... 原則上這樣就行了,不過測試信一直失敗,顯示權限不足~

補充:
(1). vim /etc/selinux/config 將 SELINUX=disabled ,不過關掉有些冒險...但是習慣透過IPtables來管理所以沒差。

(2). 調整Code ... 實測影響不大!

第一步:找到 wp-includes/pluggable.php 這個文件,將 262 行的 
    $phpmailer->IsMail(); 
    改為 
    $phpmailer->IsSMTP(); 

第二步:修改 wp-includes/class-phpmailer.php 這個文件裡的 SMTP 參數 
    var $Host = "smtp.server.com"; 
    var $SMTPAuth = true; 
    var $Username = "mail address"; 
    var $Password = "security";

(3) 將密碼的明碼顯示改掉,把smtp_pass的 type="text" 換成 type="password" 即可
 vim wp-content/plugins/wp-mail-smtp/wp_mail_smtp.php

2016年6月16日 星期四

BootStrap + 流瀑設計 ...

套用BootStrap的版型設計優點在於可支援RWD的設計,不過使用時發現若干客戶所上傳的圖片長寬比例不一,難以嚴格規範(要透過程式來裁切至合適比例但客戶又OOXX),因此造成版面檢視上無法對齊有留白空格情況發生,所以要加上流瀑設計感覺就好多了。

1. 下載 masonry.pkgd.js,也可以使用mini版...

2.  在頁面加上以下的JavaScript,放置在$(windows).load(){}而不放在$(document).ready(){}下,其原因在於BootStrap設計的 class="img-responsive",這CSS會在$(document).ready()觸發後才啟動,所以頁面呈現會有重疊的情況發生。

$(window).load(function() {
  function masonry() {
    //masonry
var container = document.querySelector('.js-masonry');
var msnry = new Masonry( container, {
 percentPosition: true,
 itemSelector: '.grid-item'
});
  };

  masonry();
});

3. 套用處...
 <div class="row js-masonry" >
  <div class="grid-item col-md-4 col-sm-6 ">
    ...
  </div>
</div>

後記:在Chrome, FireFox, IE 環境運行完美,不過跟Opera就悲劇ㄌ...

2016年6月4日 星期六

將正在運行的 MySQL 5.1 Server 換成 MariaDB 10.1

這陣子觀察全文檢索的需求看來越來越必要,MySQL 5.1貌似只有MyISAM支援但因為交易使用InnoDB較穩定所以Database得換換,裝完後第一時間感受是變快許多...反正交由測試人員去感受等回覆囉...若一切無異常下個大工程就是把正式環境的DB通通替換成MariaDB 10.1。

CentOS卡熟所以先拿來開刀,Ubuntu環境就先等等。

1. 設定 mariadb yum

在 MariaDB 下載頁面中有 LINK 列出了各種 Linux 套件的安裝法,選擇"Download"需要的版本後再點選 Repository configuration tool 進入環境選擇,我的版本是CentOS 6.7 64位元所以選了10.1版本(10.2是beta),底下會秀出 MariaDB 的 yum repository 的資料,整段都複製起來吧。
然後在 /etc/yum.repos.d 這個文件夾下建立一個 mariadb.repo,然後把剛剛複製下來整段內容,通通寫到 mariadb.repo 這個文件並存檔就行了,這樣以後就可以用 yum 取得官方的 MariaDB 相關套件。

2. 備份 mysql data

不論如何,一定要把 mysql server 先停掉的,保險點可以先用 mysqldump 備份完整資料先...啟動備份用的backup.sh儲存當下完整備份跟單DB備份檔。
接者 service mysqld stop 後再下 mv /var/lib/mysql /var/lib/mysql.bak 
3. 移除舊的 MySQL 套件
直接下指令 yum remove mysql-server mysql-libs 這指令主要移除 MySQL 的 server 和動態連結套件,所以可能會列出一些相關套件會一併被移除,我的截圖畫面如下,需記得甚麼東西被移除就是到時候得再裝回去,否則若干服務會異常

4. 安裝 MariaDB Server

直接下指令 yum install MariaDB-server MariaDB-client 完成後先不要啟動MariaDB Service

5. 還原舊資料

在步驟 2 的地方,原本舊的 MySQL Server 資料被修改路徑,所以現在舊資料是在 /var/lib/mysql.bak,此時會發現到 MariaDB Server 安裝完畢後,/var/lib/mysql 也被建立了,所以 mv /var/lib/mysql.bak /var/lib/mysql 置換回來。

6. 升級資料表

由於 MySQL Server 內各表格的內容多少會和 MariaDB 不同,所以還是得升級一下,剛剛也還沒有啟動 MariaDB Server,所以現在就啟動並且升級資料庫。
service mysql start
chkconfig mysql on
mysql_upgrade -p

7. 把被移除的相關套件還原

同步驟3有那些被移掉的就再裝囉,以此案例只需要 yum install php56w-mysql 即可。

PS. 以上內容引用自https://www.pigo.idv.tw/archives/2120 ,感謝大大的分享...

2016年5月30日 星期一

Cenet OS 6.X 預設 php 5.3 提升至 5.6版備註

緣由是CentOS 6 預設的5.3.3無法使用 mcrypt_encrypt ,因此需要提升PHP版本。過程如下:

1. 先移除原先的PHP,貌似移除這幾個其他有關聯的會一併移除。
  yum remove php php-common php-mysql  ...

2. 新增yum repository information
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm

3. 安裝 php 5.6w 底下是會用到的套件
yum install php56w php56w-common php56w-mbstring php56w-mcrypt php56w-mysql php56w-opcache php56w-xml php56w-gd ...

On ubuntu:
sudo apt-get install php5-mcrypt
sudo php5enmod mcrypt
sudo service apache2 restart


PHP簡單的加解密如下,不過在加密結果傳遞時%20會造成CI在URL傳遞參數辨識上異常,需要特別置換處理以免失敗,目前還沒想到更好的方式就盡量選擇不易出現的字元組合即可。

function encrypt_key($str, $key)
{
  $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
  $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);  
  return base64_encode(trim(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB, $iv)));  
}

function decrypt_key($str, $key)
{
  $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
  $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
  return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($str), MCRYPT_MODE_ECB, $iv));  
}

在$str傳入的資料中,若干字元組合會造成無法解密回來的困境,例如裡面有ll. ii 的組合,最後使用的呼叫法為
加密
$security = encrypt_key(base64_encode($str), md5($key));
解密
$rtnstr = decrypt_key(base64_decode($security), md5($key));

2016年5月24日 星期二

Jenkins + TortoiseSVN + RYNC 機制

Jenkins 很方便,公司使用SVN不是GIT所以跟在保哥課程提到的方式不一樣,當然環境也是相異的(保哥是以MSBuild環境介紹),在LAMP中套用也沒有太多相異點,以此做個紀錄...

PS. 在Azure基本型A0安裝Jenkins貌似會自己Shutdown,改成A1後就正常了~很傻眼但正常就好,不曉得是1/4 CPU關係還是750M記憶體太少,總之改了很多地方都沒改善,機器等級提升就FIX囉。

Installation

wget -q -O - https://jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -

sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'

sudo apt-get update

sudo apt-get install jenkins

Upgrade

sudo apt-get update

sudo apt-get install jenkins

Plugin

Once installed like this, you can update to the later version of Jenkins (when it comes out) by running the following commands:

install Subversion Plug-in

Authorized

sudo su jenkins -s /bin/bash

ssh-keygen -t rsa

 scp /var/lib/jenkins/.ssh/id_rsa.pub account@remoteServer:jenkins.pub

 cat /home/account/jenkins.pub >> /root/.ssh/authorized_keys

 chmod 600 /root/.ssh/authorized_keys

TEST

rsync -vzucPrl --delete-after -e ssh /SourcePath/ account@remoteServerIP:/TargetPath/

最近的雲端主機認證改成pem檔,所以rsync指令得改改如下,好處是上述的Authorized的程序可以免了
:

rsync -vzucPrl -e "ssh -i 'remoteserver.pem' -o 'StrictHostKeyChecking=no'" /SourcePath/ account@remoteServerIP:/TargetPath/

補充: 執行後發現若檔案存在但變更資料是少量的RSYNC會跳過該檔,所以加上-c做checksum雖然會比較慢但總比沒更新到好,畢竟FIX Bug有時候改的只是幾個BYTE而已。

2016年5月20日 星期五

awesomium 自建瀏覽器備忘 ...

Resource URL:http://www.awesomium.com/download/

備註:使用這核心封裝出來的安裝檔,在Windown 10中的Windows Defender會警示有"Trojan: Win32/Fathale.B!plock"或"Trojan: Win32/Gatrid.E!cl"兩種...XD哩,拿了PCCillin、ESET、AVG跟spyhunter掃描都顯示無異常,結果爬文估狗大師說問題出在awesomium這個OpenSource包的Dll上面,看來它的若干行為跟特洛伊很像吧,被封鎖ㄌ...

Visual Studio 2015 Memo:
  1. 將下載回來的執行檔安裝。
  2. 於Visual Studio "選擇工具箱項目"將awsomium開頭的打勾,有Core Windows.Controls Windows.Forms。
  3. 新增一個Form,然後加入一個TabControl,其餘的背景Code參考如下。
  4. Sample Code可以參考 Awesomium_in_WF 專案。
Awesomium.Windows.Forms.WebControl myBrowser;
#region TabControl 增加 Browser
private void createNewTab() {

 this.SuspendLayout();
 var ws = WebCore.CreateWebSession(new WebPreferences() { Javascript = true });
 myBrowser = new Awesomium.Windows.Forms.WebControl() { WebSession = ws };
 myBrowser.Dock = DockStyle.Fill;
 page.Controls.Add(myBrowser);
 tabControl1.TabPages.Add(page);

 myBrowser.LoadingFrameComplete += new Awesomium.Core.FrameEventHandler(LoadingFrameComplete);
 myBrowser.Source = new Uri("https://www.google.com");
 myBrowser.Update();
 this.ResumeLayout(false);
}

private void LoadingFrameComplete(object sender, Awesomium.Core.FrameEventArgs e) {
  if (myBrowser.IsLoading || !myBrowser.IsLive)
    return;
  this.tabControl1.TabPages[tabControl1.SelectedIndex].Text = "   " + myBrowser.Title;                          
  myBrowser.LoadingFrameComplete -= new Awesomium.Core.FrameEventHandler(LoadingFrameComplete);
}

#endregion

#region TabControl 增加 Close Button
private void tabControl1_DrawItem(object sender, DrawItemEventArgs e) {
  Rectangle r = e.Bounds;
  r = tabControl1.GetTabRect(e.Index);
  r.Offset(2, 2);
  r.Width = 5;
  r.Height = 5;
  Brush b = new SolidBrush(Color.Black);
  Pen p = new Pen(b);
  e.Graphics.DrawLine(p, r.X, r.Y, r.X + r.Width, r.Y + r.Height);
  e.Graphics.DrawLine(p, r.X + r.Width, r.Y, r.X, r.Y + r.Height);
  string titel = this.tabControl1.TabPages[e.Index].Text;
  Font f = this.Font;
  e.Graphics.DrawString(titel, f, b, new PointF(r.X + 5, r.Y));
}
private void tabControl1_MouseClick(object sender, MouseEventArgs e) {
  Point p = e.Location;
  for (int i = 0; i < this.tabControl1.TabPages.Count; i++)  {
     Rectangle r = tabControl1.GetTabRect(i);
     r.Offset(2, 2);
     r.Width = 5;
     r.Height = 5;
     if (r.Contains(p)) {
       CloseTab(i);
     }
   }
}
private void CloseTab(int i) {
  this.tabControl1.TabPages.Remove(this.tabControl1.TabPages[i]);
}
#endregion

2016年5月6日 星期五

OrangeHRM 3.1.1 Upgrade to 3.3.2 備忘

1. 下載3.3.2的SourceCode並安裝...
2. 修改 config_databases.yml.php 設定原3.1.1的DB
3. 執行底下的SQL

如果有變更資料夾路徑時,需調整 Catch中的
1. config_factories.yml.php
2. config_autoload.yml.php

2016年4月29日 星期五

MySQL備忘 ... CREATE TEMPORARY TABLE


    Temporary Table語法 
CREATE TEMPORARY TABLE tmp_name (
        id int(10) NOT NULL ,
        name VARCHAR(10) NOT NULL
ENGINE=InnoDB DEFAULT CHARSET=utf8;

建立Temppry Table:
        也可使用ENGINE = MEMBORY來做儲存.

    使用說明 
    建立Temporary Table僅有該連線可使用,其它連線無法使用(table不存在,table內資料也查詢不到)
    不同的連線,可建立相同名稱的temporary Table!
    Show Tables看不到Temporary table出現
    可使用index / PK / Unique

    應用 
    Session如果是以資料庫儲存的,可用temporary table來作儲存,登出後此table就drop。
    購物車的暫存機置,如無需保存到下次登入,可用Temporary table。
    大量資料的子集處理
在大的資料量下讓資料庫不斷的排序搜尋,非常影響資料庫效能的,這時可以建立小的temporary table
用複合語法來建立的資 料,例如將:
insert into tmp_data (data_id , data_name)
select data_id , data_name from data where data_id >1000 ;

    跨Table的合併資料查詢處理
以往對於跨table的索引方式,例如有CUSTOMER_A和CUSTOMER_B兩個table都有NAME和TIME欄位,如果要查詢NAME並用TIME排序也可用! 

2016年4月26日 星期二

Fail2ban 安裝與設定

apt-get update
apt-get install fail2ban
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
vim /etc/fail2ban/jail.conf

[asterisk-iptables]
# if more than 4 attempts are made within 6 hours, ban for 24 hours
enabled  = true
filter   = asterisk
action   = iptables-allports[name=ASTERISK, protocol=all]
              sendmail[name=ASTERISK, dest=dest@email.here, sender=fail2ban@address.here]
logpath  = /var/log/asterisk/security
maxretry = 4
findtime = 21600
bantime = 86400


vim /etc/fail2ban/filter.d/asterisk.conf
# Fail2Ban configuration file
#
# $Revision: 251 $
#

[INCLUDES]

# Read common prefixes. If any customizations available -- read them from
# common.local
before = common.conf


[Definition]

#_daemon = asterisk

# Option:  failregex
# Notes.:  regex to match the password failures messages in the logfile. The
#          host must be matched by a group named "host". The tag "<HOST>" can
#          be used for standard IP/hostname matching and is only an alias for
#          (?:::f{4,6}:)?(?P<host>\S+)
# Values:  TEXT
#
# Asterisk 1.8 uses Host:Port format which is reflected here

failregex = NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Wrong password
            NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - No matching peer found
            NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - No matching peer found
            NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Username/auth name mismatch
            NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Device does not match ACL
            NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Peer is not supposed to register
            NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - ACL error (permit/deny)
            NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Device does not match ACL
            NOTICE.* .*: Registration from '\".*\".*' failed for '<HOST>:.*' - No matching peer found
            NOTICE.* .*: Registration from '\".*\".*' failed for '<HOST>:.*' - Wrong password
            NOTICE.* <HOST> failed to authenticate as '.*'$
            NOTICE.* .*: No registration for peer '.*' \(from <HOST>\)
            NOTICE.* .*: Host <HOST> failed MD5 authentication for '.*' (.*)
            NOTICE.* .*: Failed to authenticate user .*@<HOST>.*
            NOTICE.* .*: <HOST> failed to authenticate as '.*'
            NOTICE.* .*: <HOST> tried  to authenticate with nonexistent user '.*'
            VERBOSE.*SIP/<HOST>-.*Received incoming SIP connection from unknown peer
  


service fail2ban start