2014年11月27日 星期四

MySQL 的備份與還原

1.
透過指令一次備份所有資料庫:
mysqldump -u bkupuser -p密碼 --all-database --events --ignore-table=mysql.event > dbbackup.sql
(--all-databases 也可用 -A 替代)
附註:還原所有資料庫方式:
mysql -u root -p < dbbackup.sql

若是要備份、還原單一資料庫:
備份questionpaper :
mysqldump -u bkupuser -p questionpaper > questionpaper.sql

還原questionpaper :
mysql -u bkupuser -p questionpaper < questionpaper .sql

注意bkupuser的權限要調整:


































因為是備份用的,新、刪、改的權限可以關掉

2.
備份之後可以加密壓縮

#壓縮打包並加密
#tar -cpz 原檔案 | openssl enc -e -aes256 -k 密碼 -out 新檔案
tar -cpz dbbackup.sql | openssl enc -e -aes256 -k abcde1234 -out dbbackup.sql.tar.gz

解密格式:
 openssl enc -d -aes256 -k 密碼 -in 原檔案 -out 新檔案
如剛剛加密壓縮的dbbackup.sql.tar.gz要解回來的話:
 openssl enc -d -aes256 -k 密碼 -in dbbackup.sql.tar.gz -out dbbackup.sql.tar.gz
接著在tar -zxvf dbbackup.sql.tar.gz 解開資料

參數說明:
-d : 解密
-aes256:因為當初是用aes256加密的
-k 密碼: 當初加密的密碼
-in:輸入要解密的檔案
-out:輸出解密的檔案

3.
異地備援:
通常我們會寫一個script來自動把備份出來的檔案丟到另一部server,
通常是透過scp的指令
如何做到不需要輸入密碼自動上傳備份檔
透過ssh-keygen來達成

ssh-keygen -t rsa 或 ssh-keygen -d (dsa) => 產生出 id_rsa, id_rsa.pub
將產生的id_rsa.pub傳到要登入的遠端主機
登入到遠端主機後,將剛剛上傳的id_rsa.pub 內容加到.ssh/authorized_keys中
cat id_rsa.pub >> .ssh/authorized_keys 即可
這樣子就可以 key 認證登入, 不需輸入密碼.

4.可以撰寫Script來達成異地備援

cd /home/dbackup
SQL_File=/home/dbackup/mysql`date +%Y%m%d%H%M`.sql
mysqldump -u 資料庫帳號 -p密碼 要備份的資料庫 --single-transaction > $SQL_File
#透過scp丟到備援主機
scp -pq -P ssh_port $SQL_File dbackup@備援主機IP:丟到哪一個目錄
rm -f $SQL_File #傳送後清掉本機的備份資料









2014年11月25日 星期二

安裝 Laravel On Centos 6.5

最近因為專案要用到laravel這個Framework,所以就去學習了一下如何安裝

1.
laravel 4.2需要PHP版本為5.4以上,一般來說CentOS6.5 PHP 版本是PHP 5.3.3,用一般的yum安裝或是update也上不去,所以要先解決這個問題
可參考以下的做法
-------------------------------------------------------------------------------
CentOS 6 系統 PHP 預設只能更新到 5.3.3,可另外新增 remi repository 安裝較新的 PHP
安裝 remi repository
rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
說明:
http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm => 64 bit
http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm => 32 bit
安裝 apache、mysql、php
yum --enablerepo=remi install httpd
yum --enablerepo=remi install mysql-server
yum --enablerepo=remi install php
yum --enablerepo=remi install php-mysql

其他,安裝 php-mbstring
yum --enablerepo=remi install php-mbstring
若不想每次都輸入 --enablerepo=remi,可修改 /etc/yum.repos.d/remi.repo,將 remi 開啟
vi /etc/yum.repos.d/remi.repo
將 enabled=0 改為 enabled=1
---------------------------------------------------------------------------------------
順利update到5.4後,因為laravel會用到mcrypt,所以記得還要裝一下php-mcrypt
yum install php-mcrypt

2.
安裝composer,可以參考composer網站的安裝方式(https://getcomposer.org/doc/00-intro.md)
curl -sS https://getcomposer.org/installer | php
curl 是類似wget抓取檔案的指令,-s:silence安靜模式, -S:show-error
執行之後你會發現多了一個composer.phar







你可以將這個composer.phar加到你的環境變數去,以利於執行
可以透過以下指令去看PATH所在
echo $PATH






我是直接將他移到 /usr/local/bin/底下,並改名叫做composer
 mv composer.phar /usr/local/bin/composer



這樣就比較方便來執行composer
你可以直接下composer來看看有沒有成功



3.
透過composer來安裝laravel,

       (Composer你可以看作是一個套件管理器,類似 PEAR 的作用)          

可以參考lavarel網站的做法(http://laravel.com/docs/4.1/installation#install-laravel)
方式如下:
composer create-project laravel/laravel 你的專案名稱 --prefer-dist
記得中間要加入你的專案名稱







我先切到apache的資料夾裡面,然後直接用composer的指令建立一個blog的專案
這步驟會非常久,我第一次執行時以為是當掉了!!其實是時間花比較長而已..























等到執行完畢後,你會發現多了一些資料夾























4.
修改apache根目錄,指到專案資料夾的public
vi /etc/httpd/conf/httpd.conf
找到 DocumentRoot 修改指到專案資料夾的public







5.
安裝完 Laravel 後直接用Web開啟可能會出現Error in exception handler.的訊息
必須修正 app/storage 的權限


chmod -R 777 app/storage



修改public/.htaccess

# 將^ 改成 ^(.+)$

# RewriteRule ^ index.php [L]


改為 RewriteRule ^(.+)$ /index.php [L]



6. laravel的控制器 artisan ,
你可以在每個專案資料夾中看到 artisan ,


透過 php artisan up 可以將專案發布,同樣的 php artisan  down 就是把專案下架

安裝完畢後開啟瀏覽器,應該可以看到以下畫面


CentOS6 安裝 PHP 5.4

資料來源:http://xyz.cinc.biz/2014/04/centos6-php-54.html


CentOS 6 系統 PHP 預設只能更新到 5.3.3,可另外新增 remi repository 安裝較新的 PHP
安裝 remi repository
rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
說明:
http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm => 64 bit
http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm => 32 bit
安裝 apache、mysql、php
yum --enablerepo=remi install httpd
yum --enablerepo=remi install mysql-server
yum --enablerepo=remi install php
yum --enablerepo=remi install php-mysql

其他,安裝 php-mbstring
yum --enablerepo=remi install php-mbstring
若不想每次都輸入 --enablerepo=remi,可修改 /etc/yum.repos.d/remi.repo,將 remi 開啟
vi /etc/yum.repos.d/remi.repo
將 enabled=0 改為 enabled=1



2014年11月23日 星期日

MySQL 限定帳號能夠處理的資料庫

今天剛好有遇到一個需求,需限制一個登入MySQL的帳號只允許他針對某個資料庫去異動,

首先必須先在 資料庫: mysql 中的 資料表: user,新增此使用者的登入帳號與密碼。





然後將該USER帳號的所有權限設定為N
























接著在 資料庫: mysql 中的資料表: db ,設定該帳號的資料







如此一來該帳號就只能依據db給的權限限定可以處理的資料庫。

今天這樣實驗後,我歸納MySQL的權限設定,user-->db-->tables_priv 一層一層賦予權限
1.
首先會由user表去調出帳號密碼,如果符合再去調是否有足夠的權限(這邊的權限是全域的,假設說設定允許SELECT,即便你在mysql 中的資料表: db,設定只允許處理某個資料庫,該帳號還是可以看到其他的資料庫內容)
2.
如果user表內無其他權限,再到db去調相關資料(如上面的例子)

3.如果db內無相關權限,再到 mysql 中的 資料表: tables_priv去調權限(限定該帳號只能針對那些TABLE去做處理)

2014年10月17日 星期五

網站連線速度慢

今天在切換網頁主機,移到新的主機後一切正常,

但是出現點選連結回應速度慢的情況...

在設定HostName時( vi /etc/sysconfig/network)
 無意間發現 NETWORKING_IPV6=yes ...
因為網路都是走 IPV4,應該是上一位管理員忘了設定回來








這樣大致方向就確定了....
接著繼續去查 網卡的設定 (vi /etc/sysconfig/network-scripts/ifcfg-eth0)
果然有關IPV6的設定都被打開了!!
趕緊調回來



之後再將網路重啟後,網頁連線速度有明顯的提升....

2014年9月15日 星期一

CentOS 6.5 安裝MRTG

因為之前工作用的MRTG掛了,所以重新安裝一部

1.首先安需要的套件

yum  -y  install  gcc  perl  gd  libpng  zlib  mrtg

























因為MRTG是走SNMP協定,所以SERVER需要安裝SNMP套件,
我先用 rpm -qa | grep snmp 來查一下是否有安裝,















我這部SERVER是有安裝snmp的,如果沒有,
可以下 yum install net-snmp net-snmp-utils 來安裝

再來設定snmp,vi /etc/snmp/snmpd.conf
在該檔案加入這兩行
view systemview included .1.3.6.1.2.1.2.2.1.10
view systemview included .1.3.6.1.2.1.2.2.1.16
#附註說明 
1.3.6.1.2.1.2.2.1.10.2 是 eth0 流入量
1.3.6.1.2.1.2.2.1.16.2 是 eth0 的流出量



之後重啟snmp
service snmpd restart

#附註說明 如果偵測設備時出現錯誤,可以考慮將snmpd.cfg 裡面的內容置換成 以下
####
# First, map the community name "public" into a "security name"

#       sec.name  source          community
com2sec notConfigUser  default       public

####
# Second, map the security name into a group name:

#       groupName      securityModel securityName
group   notConfigGroup v1           notConfigUser
group   notConfigGroup v2c           notConfigUser

####
# Third, create a view for us to let the group have rights to:

# Make at least  snmpwalk -v 1 localhost -c public system fast again.
#       name           incl/excl     subtree         mask(optional)
view    all           included   .1 80
view    systemview    included   .1.3.6.1.2.1.2
view    systemview    included   .1.3.6.1.2.1.1
view    systemview    included   .1.3.6.1.2.1.25
view    systemview    included   .1.3.6.1.4.1.2021

####
# Finally, grant the group read-only access to the systemview view.

#       group          context sec.model sec.level prefix read   write  notif
access  notConfigGroup ""      any       noauth    exact  systemview none none

# -----------------------------------------------------------------------------

# Here is a commented out example configuration that allows less
# restrictive access.

# YOU SHOULD CHANGE THE "COMMUNITY" TOKEN BELOW TO A NEW KEYWORD ONLY
# KNOWN AT YOUR SITE.  YOU *MUST* CHANGE THE NETWORK TOKEN BELOW TO
# SOMETHING REFLECTING YOUR LOCAL NETWORK ADDRESS SPACE.

##       sec.name  source          community
com2sec local     localhost       COMMUNITY
com2sec mynetwork 203.68.102.0/24      COMMUNITY

##     group.name sec.model  sec.name
group MyRWGroup  any        local
group MyROGroup  any        mynetwork
#
#group MyRWGroup  any        otherv3user
#...

##           incl/excl subtree                          mask
view all    included  .1                               80

## -or just the mib2 tree-

view mib2   included  .iso.org.dod.internet.mgmt.mib-2 fc


##                context sec.model sec.level prefix read   write  notif
access MyROGroup ""      any       noauth    0      all    none   none
access MyRWGroup ""      any       noauth    0      all    all    all


###############################################################################
# Sample configuration to make net-snmpd RFC 1213.
# Unfortunately v1 and v2c don't allow any user based authentification, so
# opening up the default config is not an option from a security point.
#
# WARNING: If you uncomment the following lines you allow write access to your
# snmpd daemon from any source! To avoid this use different names for your
# community or split out the write access to a different community and 
# restrict it to your local network.
# Also remember to comment the syslocation and syscontact parameters later as
# otherwise they are still read only (see FAQ for net-snmp).
#

# First, map the community name "public" into a "security name"
#       sec.name        source          community
com2sec notConfigUser   default         public

# Second, map the security name into a group name:
#       groupName       securityModel   securityName
group   notConfigGroup  v1              notConfigUser
group   notConfigGroup  v2c             notConfigUser

# Third, create a view for us to let the group have rights to:
# Open up the whole tree for ro, make the RFC 1213 required ones rw.
#       name            incl/excl       subtree mask(optional)
view    roview          included        .1
view    rwview          included        system.sysContact
view    rwview          included        system.sysName
view    rwview          included        system.sysLocation
view    rwview          included        interfaces.ifTable.ifEntry.ifAdminStatus
view    rwview          included        at.atTable.atEntry.atPhysAddress
view    rwview          included        at.atTable.atEntry.atNetAddress
view    rwview          included        ip.ipForwarding
view    rwview          included        ip.ipDefaultTTL
view    rwview          included        ip.ipRouteTable.ipRouteEntry.ipRouteDest
view    rwview          included        ip.ipRouteTable.ipRouteEntry.ipRouteIfIndex
view    rwview          included        ip.ipRouteTable.ipRouteEntry.ipRouteMetric1
view    rwview          included        ip.ipRouteTable.ipRouteEntry.ipRouteMetric2
view    rwview          included        ip.ipRouteTable.ipRouteEntry.ipRouteMetric3
view    rwview          included        ip.ipRouteTable.ipRouteEntry.ipRouteMetric4
view    rwview          included        ip.ipRouteTable.ipRouteEntry.ipRouteType
view    rwview          included        ip.ipRouteTable.ipRouteEntry.ipRouteAge
view    rwview          included        ip.ipRouteTable.ipRouteEntry.ipRouteMask
view    rwview          included        ip.ipRouteTable.ipRouteEntry.ipRouteMetric5
view    rwview          included        ip.ipNetToMediaTable.ipNetToMediaEntry.ipNetToMediaIfIndex
view    rwview          included        ip.ipNetToMediaTable.ipNetToMediaEntry.ipNetToMediaPhysAddress
view    rwview          included        ip.ipNetToMediaTable.ipNetToMediaEntry.ipNetToMediaNetAddress
view    rwview          included        ip.ipNetToMediaTable.ipNetToMediaEntry.ipNetToMediaType
view    rwview          included        tcp.tcpConnTable.tcpConnEntry.tcpConnState
view    rwview          included        egp.egpNeighTable.egpNeighEntry.egpNeighEventTrigger
view    rwview          included        snmp.snmpEnableAuthenTraps

# Finally, grant the group read-only access to the systemview view.
#       group          context sec.model sec.level prefix read   write  notif
access  notConfigGroup ""      any       noauth    exact  roview rwview none



###############################################################################
# System contact information
#

# It is also possible to set the sysContact and sysLocation system
# variables through the snmpd.conf file:

syslocation Unknown (edit /etc/snmp/snmpd.conf)
syscontact Root  (configure /etc/snmp/snmp.local.conf)

# Example output of snmpwalk:
#   % snmpwalk -v 1 localhost -c public system
#   system.sysDescr.0 = "SunOS name sun4c"
#   system.sysObjectID.0 = OID: enterprises.ucdavis.ucdSnmpAgent.sunos4
#   system.sysUpTime.0 = Timeticks: (595637548) 68 days, 22:32:55
#   system.sysContact.0 = "Me "
#   system.sysName.0 = "name"
#   system.sysLocation.0 = "Right here, right now."
#   system.sysServices.0 = 72


###############################################################################
# Logging
#

# We do not want annoying "Connection from UDP: " messages in syslog.
# If the following option is commented out, snmpd will print each incoming
# connection, which can be useful for debugging.

dontLogTCPWrappersConnects yes

# -----------------------------------------------------------------------------


###############################################################################
# disk checks
#

# The agent can check the amount of available disk space, and make
# sure it is above a set limit.  

# disk PATH [MIN=100000]
#
# PATH:  mount path to the disk in question.
# MIN:   Disks with space below this value will have the Mib's errorFlag set.
#        Default value = 100000.

# Check the / partition and make sure it contains at least 10 megs.

disk / 10000

# % snmpwalk -v 1 localhost -c public .1.3.6.1.4.1.2021.9
# enterprises.ucdavis.diskTable.dskEntry.diskIndex.1 = 0
# enterprises.ucdavis.diskTable.dskEntry.diskPath.1 = "/" Hex: 2F 
# enterprises.ucdavis.diskTable.dskEntry.diskDevice.1 = "/dev/dsk/c201d6s0"
# enterprises.ucdavis.diskTable.dskEntry.diskMinimum.1 = 10000
# enterprises.ucdavis.diskTable.dskEntry.diskTotal.1 = 837130
# enterprises.ucdavis.diskTable.dskEntry.diskAvail.1 = 316325
# enterprises.ucdavis.diskTable.dskEntry.diskUsed.1 = 437092
# enterprises.ucdavis.diskTable.dskEntry.diskPercent.1 = 58
# enterprises.ucdavis.diskTable.dskEntry.diskErrorFlag.1 = 0
# enterprises.ucdavis.diskTable.dskEntry.diskErrorMsg.1 = ""

# -----------------------------------------------------------------------------





搞定SNMP後,接下來處理MRTG的設定...

有兩種方式可以產生cfg檔案:
方法1.使用cfgmaker 自動產生檔案 (強烈推薦!!)
若要針對大量的網路設備去偵測的話,建議使用cfgmaker來自動產生 cfg檔案
方法如下:
cfgmaker SNMP Community String@L2_Switch_IP --output=產生cfg檔案的路徑


cfgmaker Dorm@140.129.88.7 --output=/etc/mrtg/dorm.cfg
以上的意思是說 我針對140.129.88.7這台網路設備(通常是 Switch)去執行cfgmaker,
產生出來的檔案為/etc/mrtg/dorm.cfg,

而140.129.88.7 這台設備的SNMP Community String是Dorm (我用的SNMP Community String是Dorm,預設通常為public(因 SNMP是標準協定,所有的網路設備商通用的SNMP Community String為public),但是一般的網管人員會將網路設備的SNMP Community String改掉(像我們為了資安理由,就將public改了,避免有心人進去查到設備資訊))

方法2.自行編輯 MRTG 設定檔

編輯 /etc/mrtg/mrtg.cfg , 內容只要有下面即可

Target[eth0]: 2:public@127.0.0.1
MaxBytes[eth0]: 1250000
Options[eth0]:growright, bits  #(用在網路流量中)
Title[eth0]: Traffic Analysis  
PageTop[eth0]:<h1> 127.0.0.7</h1>

如果要新增其他設備,就繼續編輯mrtg.cfg

Target[Dorm]: Switch_Port:SNMP Community String@L2_Switch_IP
MaxBytes[Dorm]: 1250000
Options[Dorm]:growright, bits
Title[Dorm]: Traffic Analysis
PageTop[Dorm]: <H1>學生宿舍</H1>

#參數說明: 其中Target 的參數主要是說要針對哪一個設備去抓資料,
上述設定的Target[eth0]: 2:public@127.0.0.1 是說我針對本機端的第2Port(即網路卡)去抓流量,
像宿舍流量: Target[Dorm]: 4:Dorm@140.129.88.7 這一段的意義是:我針對140.129.88.7這部設備的第4Port去抓資料,用的 SNMP Community String 是當初我所設定的 Dorm...


同時修改一下工作網頁,因為我預設的網頁路徑是 /var/www/html/mrtg ,所以要找到
HtmlDir 與 ImageDir改為以下

HtmlDir: /var/www/html/mrtg
ImageDir: /var/www/html/mrtg

Refresh: 300                              #網頁設定每300秒更新一次
Interval: 10                               #每10秒讀取設定檔
Language: big5                        #語系big 5
Options[ _ ]: growright           #由右邊畫起 
這兩個照預設值就可以了
其他參數說明:


#附註:
1.如果沒有mrtg的目錄,請記得先用mkdir /var/www/html/mrtg 來生成該目錄
2.如果Apache 重新啟動後發現mrtg網頁進不去,請確認一下/etc/httpd/conf.d/mrtg.cfg中的
Alias /mrtg /var/www/html/mrtg 路徑是否有誤!!! 更改後記得重啟Apache






public 前面的數字可用下面偵測, 一般 eth0 代號是 2

ip  link








執行 3 次下面指令, 產生基本網頁

代碼:

env LANG=C /usr/bin/mrtg /etc/mrtg/mrtg.cfg
env LANG=C /usr/bin/mrtg /etc/mrtg/mrtg.cfg
env LANG=C /usr/bin/mrtg /etc/mrtg/mrtg.cfg

產生網頁,產生在 /var/www/html/mrtg/ 下

indexmaker /etc/mrtg/mrtg.cfg > /var/www/html/mrtg/index.html




 



透過cronatb設定每2分鐘跑一次上一個指令
crontab -e

*/2 * * * * root env LANG=C /usr/bin/mrtg /etc/mrtg/mrtg.cfg  > /dev/null 2>&1

產生之後,可以透過Winscp 來看一下工作目錄

你會發現其實他是透過剛剛我們寫的croontab 來將設備流量產生成圖片,eth0.html這個網頁就是將圖片資料顯示出來的頁面而已,如果要修改成自己的網頁,那就自己寫html,把圖片帶進去就可以了...







2014年7月29日 星期二

MySQL 調教--Run OPTIMIZE TABLE to defragment tables

寫在前面:
--------------------------------------------------------------------------------------------------------
如果對於設定不熟的話,其實MySQL以經內建幾個文件可以使用,
路徑在/usr/share/mysql 下,  差異性在於機器的記憶體大小...

my-innodb-heavy-4G.cnf (4GB的記憶體)
my-huge.cnf (1~2GB的記憶體)
my-large.cnf (128~512MB的記憶體)
my-medium.cnf (64~128MB的記憶體)
my-small.cnf (小於64MB的記憶體)

--------------------------------------------------------------------------------------------------------
在執行MySQL的校正工具-mysqltuner.pl ,出現以下的報告

 Run OPTIMIZE TABLE to defragment tables for better performance
 Reduce your overall MySQL memory footprint for system stability
 Increase table_cache gradually to avoid file descriptor limits
 Read this before increasing table_cache over 64: http://bit.ly/1mi7c4C
 Optimize queries and/or use InnoDB to reduce lock wait...

處理方式:
執行以下命令 
mysqlcheck -u root -p --auto-repair --check --optimize --all-databases

(若出現以下錯誤:Error:  mysqlcheck doesn't support multiple contradicting commands.
可改用以下方式試試看:
mysqlcheck --auto-repair --optimize --all-databases -uroot -p
)


-------------------------------------------------------------------------------------------------

Add skip-innodb to MySQL configuration to disable InnoDB

處理方式:
編輯 /etc/my.cnf

在 [mysqld]下增加 skip-innodb 

記得重啟mysql

-------------------------------------------------------------------------------------------------
  Enable the slow query log to troubleshoot bad queries
處理方式:
系統建議可開啟slow query log 之功能來記錄執行特別久的 SQL,以供後續的分析,方法為增加兩行設定到 /etc/my.cnf
log_slow_queries= mysqld-slow.log
long_query_time= 10
設定後一樣需重新啟動 MySQL。

log_slow_queries 指定 slow query log 存放之檔名,預設存在 /var/lib/mysql/ 目錄下。
long_query_time 設定超過幾秒之 SQL Query 會被記錄在 log_slow_queries 之log 檔中,系統預設值為 10秒。


2014年7月28日 星期一

Apache 效能調教

0. Linux Kernel 若是 2.4,最好升到在2.6.18,可以透過uname -a  來查看,許多效能有提升..
1.編輯   /etc/httpd/conf/httpd.conf
1.關閉DNS 查詢: ,找到HostnameLookups 設為Off
2.設定 Timeout 60
3.設定 KeepAlive on
4.設定KeepAliveTimeout 15
5.設定 MaxKeepAliveRequests 為 5000 (同時最大可允許的KeepAlive數量)
6.如果未架設虛擬主機,則建議UseCanonicalName On

2. 伺服器中關閉不必要的服務,儘量簡單輕量化
1. 可以透過chkconfig 設定開機時不啟動 ,以MySQL資料庫為例子,可以透過命令 chkconfig mysqld off ,如果已經運行中的可以透過service mysqld stop 將服務停止

3. Apache 運作是採用MPM(multi-processing modules),目前有perfork 、worker 、event三種,其中以perfork 運作間容性與可靠性較佳,
透過httpd -l 可以看目前運作的何種模式
調整perfork的相關參數 編輯   /etc/httpd/conf/httpd.conf ,找到prefork的區塊,可調整為

StartServers       20
MinSpareServers    20
MaxSpareServers   50
ServerLimit      500
MaxClients       500
MaxRequestsPerChild  4000







2014年7月22日 星期二

apache 2.2.15 升級2.2.3

因為資安的問題,所以強制要將apache升級,首先可以先透過命令列看一下apache 的版本
httpd -v





可以看到apache版本為2.2.15,
先透過yum remove httpd 將apache 移除
































請留意一下,移除httpd時同時把php都移掉了,
所以記得待會要重新安裝一下(我卡在這個地方好久........@@!)

接下來安裝apache,
請下命令 yum install httpd







安裝完後重新啟動服務,你會發現apache無法解析php網頁,
原因如剛剛所說的,你在卸載apache時,yum一併把php給卸載,
記得重新安裝php












yum install php
安裝完畢後記得重新啟動apache,
另外要注意的是,因為是重新安裝,所以之前apache的設定都變成初始值,
記得到 /etc/httpd/conf/httpd.conf 去做調整
下面是我PHP網頁回復正常了...



2014年6月23日 星期一

Mysql 主從式主機自動同步 (MySQL Replication)

上級長官交代要研究一下MySQL 主從式資料庫自動同步的方式,找了一下網路上的資料並實際實作OK,特別紀錄一下流程

參考資料:

  1. MySQL設定Replication (Master - Slave) http://blog.longwin.com.tw/2008/03/mysql_replication_master_slave_set_2008/
  2. How to Set Up Replication
    http://dev.mysql.com/doc/refman/5.0/en/replication-howto.html
流程:

1. 設定Master主機,找到 /etc/my.cnf,找到[[mysqld]加入以下兩行 
log-bin=mysql-bin
server-id=1

並且重啟資料庫。


2. mysql -u root -p # 進入 mysql
加入連線主機的使用者,可利用以下指令去做
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'140.129.X.X' IDENTIFIED BY '123456';
#這段指令是說要加入一個user叫做repl,來源的IP為140.129.X.X,密碼為 123456
如果有安裝phpMyAdmin,可以在資料庫中的資料庫 mysql - 資料表 user 發現新增了一個user 叫repl
3. FLUSH TABLES WITH READ LOCK; # 先讓 DB 不要再寫資料進去
4.SHOW MASTER STATUS; 記好框起來的資料 


5. 至此大致上Master的資料庫設定完畢,接下來把Master的資料庫的資料倒出來,因為我是測試用的,所以我透過phpMyAdmin的介面把資料倒出來,如果資料量比較大我才考慮用Command Line的方式來做

接下來是設定Slave資料庫
6. 設定Slave DB,找到 /etc/my.cnf,找到[[mysqld]加入 server-id=2

加入後記得重新啟動MySQL

7.把Master資料庫的資料倒進去,方法不贅述...

倒完資料後,記得把Master 主機唯讀的Table解除唯讀
在Master的資料庫中下以下命令: UNLOCK TABLES;
8.資料寫入完畢後,再下Command, 
     CHANGE MASTER TO
     MASTER_HOST='140.129.X.X',  //Master IP
     MASTER_USER='repl', //剛剛新增的USER
     MASTER_PORT=3306, //MySQL的阜號,如果沒改阜號的話此參數不用加
     MASTER_PASSWORD='123456', //密碼
     MASTER_LOG_FILE='mysql-bin.000001', //用剛剛抄下的資料
     MASTER_LOG_POS=3518; //用剛剛抄下的資料

9. START SLAVE; # 開始 Replication

10.注意!!如果Master主機有開啟防火牆, 請記得開放Mysql連接阜 3306 ,否則Slave 主機連線時會被防火牆擋住...

附註說明:
1. 兩部資料庫的版本最好一樣,上述測試的過程都是透過MySQL  version  5.1.73,而我在工作上的主機卻是 4.0.23,
兩者差異太大會出現以下的問題而無法進行同步..

2.如果發現無法同步,可以在/var/log/mysqld.log 去查詢原因



2014年5月21日 星期三

php 版本升級 語法錯誤問題與處理

目前將就有程式碼轉至PHP 5.4版,程式碼中的部分函式需要做調整:

  1. ereg('^[0-9]+$',$ParkingOener) 會出現Deprecated: Function ereg() is deprecated 的警告, 新版的PHP已經將 ereg()移除,修改方式改為:preg_match("/^[0-9]+$/",$ParkingOener)
  2. 目前版本針對seesion的處理更加簡單,早期使用前還需要session_register()...等,現在是直接宣告session就直接使用,所以就得程式碼移到新主機後,會出現Call to undefined function session_is_registered() ... 如
    if (!session_is_registered('ParkingSelYearSem'))
        session_register('ParkingSelYearSem');
    }
    則改寫為
    if (!isset($_SESSION['ParkingSelYearSem'])) {
       $_SESSION['ParkingSelYearSem'] = 'XXX';
    }
  3. date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Chongqing' for 'CST/8.0/no DST' instead in /var/www/html/cis/stucis/include/initialize.php on line 7,
    處理方式:
    設定 php.ini,加入 date.timezone = "Asia/Taipei"
  4. short tag 問題,一般來說 與 都能表示是PHP程式碼的區段,不過先決條件是 php.ini 中的 short_open_tag=On ,如果移轉到新的SERVER發現有問題,請先查看此選項。

2014年5月14日 星期三

PHP 套印 rtf (UTF8中文亂碼)

今天在處理網頁程式由Big5轉到UTF-8,資料庫與程式字碼編碼都弄得差不多沒問題,在測試使用者套印出WORD 的rtf 格式時居然出現文件毀損無法開啟的大問題...

或者是出現文字亂碼

我印象中有看過一篇文章,記得說過Windows 的系統預設都是Big5編碼的模式,所以我試著將UTF-8的字碼又轉回Big5編碼來測試看看是不是可以回復正常...
測試結果正常...

是否此法可以解決開啟WORD中文編碼UTF-8的問題可能還需觀察一下...

2014年5月13日 星期二

透過 command line 測試 mysql 連線

目前架設伺服器的規畫都是網頁與資料庫分開,有時候會遇到網頁無法連結資料庫的問題,曾遇到過是DNS queryg 失敗導致網頁伺服器找不到DB位址,或是被自己的防火牆擋住了...

有時可以在網頁SERVER透過Command line的方式 來測試可不可以連線到DB SERVER,來排除掉一些可能因素,對於找出問題有一些幫助....

mysql  -h 資料庫IP -P 資料庫阜號 -u 資料庫使用者帳號 -p

參數說明 :
    -h :資料庫IP
    -P:資料庫MySQL的阜號(如果沒改阜號就不用此參數,我基於安全性都會把MySQL的阜號改掉)
    -u:登入的使用者帳號
    -p: 可以留空白待會需要你輸入


2014年4月29日 星期二

openssl加解密

加密並壓縮:
tar -cpz 原檔案 | openssl enc -e -aes256 -k 密碼 -out 新檔案
參數說明:
tar :
-c:建立壓縮檔案
-p:使用原來屬性
-z:產生gzip
openssl:
-e:加密
-aes256:加密方式
-k 密碼: 加密的密碼
-out:輸出加密的檔案

解密格式:
 openssl enc -d -aes256 -k 密碼 -in 原檔案 -out 新檔案
參數說明:
-d : 解密
-aes256:因為當初是用aes256加密的
-k 密碼: 當初加密的密碼
-in:輸入要解密的檔案
-out:輸出解密的檔案

解密後再解壓縮
tar -zxvf 新檔案

2014年4月27日 星期日

利用7zip做自動壓縮...

今天在弄MSSQL資料庫的備份,發現資料庫備份的磁碟已經滿了,因為每天的備份檔大概是6G,
所以想說透過7-zip來做壓縮
因為每天備份檔產生的格式以日期為主,如TTUDB_db_201404280330.BAK (0330是因為執行備份是早上3:30),
所需步驟如下:
1.先安裝7.zip
2.撰寫以下的bat檔,
先說明一下7.zip的參數格式:
 a 是說要執行壓縮 ,
-tzip 是說要壓成zip,如果要壓成7z 就要寫成-t7z,
-mx=9 是說壓縮比例,不寫的話預設是5,數字越高壓得越小,最大到9
寫的格式大概是 7.zip程式位置 參數 產生的壓縮檔 要壓縮的資料來源
---------------------------------------------------------------------------------------------
#以下是壓縮的bat內容:
#先壓縮後再把原來的檔案刪除以節省硬碟空間
set dd=%date:~8,2%
set dm=%date:~5,2%
set dy=%date:~0,4%
set zipdate=%dy%%dm%%dd%

"C:\Program Files\7-Zip\7z.exe" a -tzip -m9 "E:\TTUDB_Backup\TTUDB_db_%zipdate%.7z" "E:\TTUDB_Backup\TTUDB_db_%zipdate%0330.BAK"

del "E:\TTUDB_Backup\TTUDB_db_%zipdate%0330.BAK"
---------------------------------------------------------------------------------------------
如此在透過Windows的排程去每天執行(資料庫備份檔產生是上午3:30,產生備份檔我抓40分鐘時間,為保險起見,我執行壓縮是上午4:50 ),這樣就可以省下許多的硬碟空間...

2014年3月25日 星期二

Linux CentoOS SSH回應時間慢

最近剛剛安裝完CentOS 6.5,發現遠端透過putty要連線時回應時間很慢,大概要等個3秒鐘才回應,原本以為是網路的問題,後來在網路文獻裡發現了解決方式

編輯 /etc/ssh/sshd_config,將UseDNS 設為no


(附註:我試過後還是沒有明顯改善,且原始檔案是將此項目註解掉的,所以我想該預設值是no)

編輯 /etc/ssh/sshd_config,將 GSSAPIAuthentication 設定為no,原始的設定是開啟的












這個設定後重新開啟sshd,連線速度明顯回復正常,

這個在網路上的說明是 伺服器端啟用了GSSAPI。登入的時候用戶端需要對伺服器端的IP位址進行反解析,如果伺服器的IP位址沒有配置PTR記錄,那麼就容易在這裡卡住了。 
對於這種情況,就有必要禁用GSSAPI認證以加速SSH登陸。


2014年3月10日 星期一

Linux 硬碟空間不足問題

今天遇到同事反映某系統異常,查了一下原因,發現是硬碟滿了,導致後面的資料寫不進去,

用df -h 查目前硬碟使用情況,以下是已經處理過的空間大小,尚未處理前是卡在 var  與 home這兩個目錄的Use%都達到100%

home 目錄還好處理,裏頭有個備份資料夾,每周定期會壓資料進來做備份,所以我把資料拉回來本機端後就把這些備份資料移除

var是影響的關鍵,因為資料庫與記錄檔都放在這目錄,我進到每個目錄下用du -sh * 指令一個一個去看,以下是已經處理過的..未處理前,除了log過大外,我還發現mail也是大的離譜..

刪除一些不必要的log後,我轉到mail 的資料夾,裡面的root也是大得離譜,應該是系統每做一個動作就會寄mail通知root..我決定把它清掉  cp /dev/null /var/spool/mail/root 
還有另外一個就是spool裡面的clientmqueue資料夾, 這是啟動cront後會產生的紀錄
我也一併把它清了 rm * -rf
清理完之後資料可以正常寫入運作了


2014年1月7日 星期二

增加 Apache 安全性..

有鑑於最近遠通電收的網頁被人撈出了 /etc/passwd的檔案公布在網路上,
所以就去網路上研究了一下如何增加apache的security...

1.取消ServerSignature:    預設的狀態是開啟的









開啟的狀態下,如果USER輸入的錯誤的網頁,他會連同Apache與OS版本一併秀出來!!

當然顯示的資訊越少越安全,所以編輯 /etc/httpd/conf/httpd.conf,將ServerSignature Off




2.修改權限,編輯 /etc/httpd/conf/httpd.conf
將原本的

    Options FollowSymLinks
    AllowOverride None

改為

   Options None
   Order deny,allow
   Deny from all















3.關閉FollowSymLinks以及CGI execution 
依據鳥哥網站的說明:
FollowSymLinks:這是 Follow Symbolic Links 的縮寫, 字面意義是讓連結檔可以生效的意思。我們知道首頁目錄在 /var/www/html,既然是 WWW 的根目錄,理論上就像被 chroot 一般! 一般來說被 chroot 的程式將無法離開其目錄,也就是說預設的情況下,你在 /var/www/html 底下的連結檔只要連結到非此目錄的其他地方,則該連結檔預設是失效的。 但使用此設定即可讓連結檔有效的離開本目錄。
所以為了安全起見還是關閉他!!
























4.


將Apache Test Page 移除
找到welcome.conf的文件,一般在/etc/httpd/conf.d
把這個文件的所有行都注解掉,即前面加上#,就可以隱藏起來Test Page。
(也可以直接把該文件改名稱  mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.bak)