2015年3月29日 星期日

[Linux]透過Memcached做跨網站的Memcache及Session存取

上一篇"CentOS上安裝memcached"已經安裝好及設定好Memcached
在單一台主機上已經能利用Memcached做第三方的資料存取
但是如果要利用Memcached做SSO(Single sign-on)單一登入機制
還需要在Apache做額外的設定(有要用到此功能的web server都需要設定)

設定步驟如下

1.先將SERVER1和SERVER2設定相同Domain HostName

hostname [ServerName].[DomainName]

2.設定/etc/php.ini
開啟/etc/php.ini

vi /etc/php.ini

修改以下值(原本的設定可在最前面用;做註解)

session.save_handler = memcached
session.save_path="[Memcached IP]:11211"
session.cookie_domain=.[DomainName]

存檔

以下用兩個測試程式做測試
一、利用Memcached做資料相互存取

SERVER1 TestCode
memcache_put.php



//Server1存入值給Server2讀取
$memcache = new Memcache();  //宣告一個Memcache
$memcache->connect('23.101.8.62', 11211); //連線到Memcache主機
$memcache->set('server1_date', 'Memcache test OK!', 0, 60); //將值存入命名為server1_date
$result = $memcache->get('server1_date'); //取出存入的值
echo $result;

?>

SERVER2 TestCode
memcache_get.php



//Server2只讀取Server1存入的資料
$memcache = new Memcache();  //宣告一個Memcache
$memcache->connect('23.101.8.62', 11211) or die ("Could not connect");  //連線到Memcache主機
$result = $memcache->get('server1_date'); //取出值
echo $result;

?>

二、利用Memcached存取Session
SERVER1 TestCode
session_put.php



//-----初始化設定Start
//如果無權限修改php.ini請做以下初始化設定
$host = '[Memcached IP]';
$port = '11211';
$session_save_path = "tcp://$host:$port?persistent=1&weight;=2&timeout;=2&retry;_interval=10, ,tcp://$host:$port";
ini_set('session.save_handler', 'memcache');
ini_set('session.save_path', $session_save_path);
ini_set("session.cookie_domain", ".[DomainName]");
//------初始化設定End

session_start();
session_register('login_name');
$_SESSION['login_name'] = 'HI I am server01';
print_r($_SESSION);

?>

SERVER2 TestCode
session_get.php



//-----初始化設定Start
//如果無權限修改php.ini請做以下初始化設定
$host = '[Memcached IP]';
$port = '11211';
$session_save_path = "tcp://$host:$port?persistent=1&weight;=2&timeout;=2&retry;_interval=10, ,tcp://$host:$port";
ini_set('session.save_handler', 'memcache');
ini_set('session.save_path', $session_save_path);
ini_set("session.cookie_domain", ".[DomainName]");
//------初始化設定End

session_start();
echo $_SESSION['login_name'];

?>

透過測試就可以完整的利用Memcached做多網站間的資料交換
不過因為Memcached是有開特別的port以及會做到第三方資料的存取
所以之後還需要真對Memcached server上的主機做更詳細的防火牆設定
EX:限定固定的web server IP才能存取

[Linux]CentOS上安裝memcached

Memcached是一個linux下的快取服務機制
根據Wiki介紹
=======================
memcached是一套分布式的快取系統,由LiveJournal的Brad Fitzpatrick開發,但目前被許多網站使用。
這是一套開放原始碼軟體,以BSD license授權釋出
memcached缺乏認證以及安全管制,這代表應該將memcached伺服器放置在防火牆後

memcached的API使用三十二位元的循環冗餘校驗(CRC-32)計算鍵值後,將資料分散在不同的機器上。當表格滿了以後,接下來新增的資料會以LRU機制替換掉。由於memcached通常只是當作快取系統使用,所以使用memcached的應用程式在寫回較慢的系統時(像是後端的資料庫)需要額外的程式碼更新memcached內的資料。

=======================
雖然這個memcache服務是在linux上開發的,但是目前也有提供給win環境IIS上支援
但IIS的機制上還需要再找時間研究,目前先在linux上做架設動作

OS:CentOS 6.3 + LAMP
WebServer:Apache
測試語言:PHP
透過SSH登入後直接先透過指令安裝memcached
1.
yum install memcached
還有安裝支援php的extension <<這個套件是要在執行PHP的主機上安裝
yum install php-pecl-memcache
然後就會開始安裝所需要的套件了

2.安裝完成後檢查一下php上是否已經支援memcached模組
php -m|grep memcache

如果成功會顯示memcache
3.設定memcached服務開機時自動啟動
chkconfig memcached on

4.檢查memcached是否啟動正常
chkconfig --list memcached
成功的話2~5項會顯示on

5.檢查一下是否正確的Listen,預設會是port 11211
netstat -ntulp | grep 11211

6.memcached設定檔的位置會在/etc/sysconfig/memcached
可以透過vi去開啟看一下
vi /etc/sysconfig/memcached

PORT="11211"           #設定memcached使用的port
USER="memcache"         #配置啟動時使用的用戶
MAXCONN="1024"     #最大連接數
CACHESIZE="64"      #最大使用暫存,預設是64M
OPTIONS=""          #其它設定,EX:有兩台以上的memcached主機就要設定這個。
(OPTIONS目前用不到之後再研究有什麼其他設定)

7.設定好後就可以啟動Memcached
service memcached start

服務其他指令
*service memcached start 啟動
*service memcached stop 停止
*service memcached restart 重新啟動
*service memcached status 啟動狀態
**service可替代成/etc/init.d/**

8.重新啟動httpd
service httpd restart

####目前memcached server都已經設定完成了#####
再來就是利用PHP測試
用PHP要使用memcached有兩種做法
一、修改php.ini讓session預設就放在memcached上
二、要用memcached功能時才call function

先做第一種方式
1.修改php.ini
vi /etc/php.ini

2.找到以下兩行,建議將原本的session.save_handler和session.save_path 在最前面加上;
然後再輸入下面的設定
session.save_handler = memcached
session.save_path = "127.0.0.1:11211"

session.save_path="tcp://127.0.0.1:11211?persistent=1&weight=1&timeout=1&retry_interval=15

*save_path是指定session存放的位置因為這裡是在同一台server上所以是127.0.0.1

3.然後在往下找display_errors,並改如下設定
display_errors = on 

*display_errors = on是當PHP程式執行有錯誤時是否顯示在畫面上
*這功能可以幫忙等下測試的除錯,但網站正式上線記得要關掉

4.離開php.ini設定
ESC  >> : >> wq!

5.重新啟動httpd
service httpd restart

以上就是設定php預設session存放位置
接下來放程式,查看設定並測試memcached怎麼做
Apache預設的網站目錄為/var/www/html
一、查看PHP當下所支援的模組
1.新增一個檔案phpinfo.php
vi /var/www/html/phpinfo.php

2.輸入以下程式
  phpinfo();
?>

3.存檔離開
ESC  >> : >> wq!

4.開啟網頁檢視模組是否有成功
*有改session存放的位置多看第二張圖

























二、直接呼叫memcached的功能使用
$memcache = new Memcache();
$memcache->connect('127.0.0.1', 11211) or die ("Could not connect");
$memcache->set('mdata', 'Memcache test OK', 0, 60);
$result = $memcache->get('mdata');
unset($memcache);
echo $result;
?>


清除memcached的暫存
nc localhost 11211
flush_all
exit

如果第二程式執行時出現Permission denied
是因為SELinux這個安全機制把權限鎖住了
就用以下指令解開應該就可以了
setenforce 0

監控 memcache 的工具:
1.memcached-tool 查看memcached的資源
memcached-tool 192.168.1.216:11211 stats

完成



2015年3月26日 星期四

[Linux]使用yum install發生錯誤

初次在安裝gcc的時候發生了一個詭異的錯誤
指令是yum install gcc
但是執行了一下最後跳出兩個錯誤造成gcc安裝失敗
後來知道原來是這個部份因為kernel的版本跟即將要安裝gcc其他程式所需要的最低版本不一樣

也就是當下OS的kernel版本太過老舊必須要先更新kernel head才能正確安裝gcc
所以需要先執行以下指令以更新kernel head版本

yum install kernel-headers --disableexcludes=all

更新後

yum install gcc

安裝gcc檔案也就成功了
這個問題可能不只會發生在gcc這個程式上,其他程式如果有kernel版本需求也會有機會發生
在此筆記一下




[Linux]SELinux安全性的關閉

一開始在設定FTP Server時發生了不論權限如何設定 都無法上傳檔案到設定的資料夾內
 總是出現錯誤訊息
553 Could not create file 
或者
550 SITE CHMOD command failed. 
經過多番查找資料,原來在CentOS內預設是有SELinux這個機制並且預設還是開啟的
鳥哥的網站這篇也有介紹到這個功能 http://linux.vbird.org/linux_basic/0440processcontrol.php#selinux

以及Wiki上的介紹
http://en.wikipedia.org/wiki/Security-Enhanced_Linux

SELinux全名是 Security Enhanced Linux是一個針對檔案權限限制更嚴謹的模組......
詳細介紹就此省略了

紀錄一下
關掉 SELinux
vi /etc/sysconfig/selinux

SELINUX=enforcing 改成 SELINUX=disabled 

存檔
重新開機
完成!!

2015年3月25日 星期三

[Azure]Azure VM設定Public IP (PIP)

最近在研究MS Azure上的VM
利用Azure裡面market提供的CentOS with LAMP的映像檔建立了一個vm在上面
因為此映像檔建立後就自動將LAMP給安裝好了
但是要上下傳資料的FTP卻沒有安裝
這個部分需要自己手動將vsftpd給安裝上去

當FTP Server安裝設定完成後發現被動模式pasv的部份無法透過Azure VM預設給的IP從外部連線進去
錯誤紀錄是連線都正常但是最後會卡住造成連線失敗

經過上MSDN官網查了相關文件說明後發現這篇
https://msdn.microsoft.com/zh-tw/library/azure/dn690118.aspx

這個PIP全名是Instance-level Public IP Address (PIP)
用途是
"執行個體層級公用 IP (PIP) 是您可以直接指派給 VM 的 IP 位址,而不是指派給您 VM 所在之雲端服務的 IP 位址"
然後還有這張架構圖





















原來是這個
這篇文件裡面還說明了如何在VM上面建立一個PIP
不過目前PIP的設定還沒在網頁的操作介面上有看到此設定
文件也指出需要透過Azure PowerShell下指令的方式去處理
==============
Azure PowerShell工具可以透過以下連結下載,同時支援多種OS
http://azure.microsoft.com/zh-tw/downloads/
的命令列工具

==============
建立的方式有幾個情況
1.在新建VM的時候就加入了PIP

New-AzureVMConfig -Name "FTPInstance" -InstanceSize Small -ImageName $images[50].ImageName | Add-AzureProvisioningConfig -Windows -AdminUsername narayan -Password abcd123 | Set-AzurePublicIP -PublicIPName "ftpip" | New-AzureVM -ServiceName "FTPinAzure" -Location "North Central US"


2.在現有的VM上加入PIP

Get-AzureVM -ServiceName FTPInAzure -Name FTPInstance | Set-AzurePublicIP -PublicIPName ftpip | Update-AzureVM

*關於參數-ServiceName後面要接什麼名稱,可以先下這個指令,在照列出來的資訊輸入
Get-AzureVM

建立完成後要查看VM的PIP資訊可以透過以下指令
Get-AzureRole -ServiceName FTPInAzure -Slot Production -InstanceDetails



如果要移除VM的PIP,透過以下指令
Get-AzureVM -ServiceName FTPInAzure -Name FTPInstance | Remove-AzurePublicIP | Update-AzureVM
設定完成後再回Azure的操作畫面去增加pasv需要用到的port就可以正常連線了

[Linux]CentOS vsftp 增加安全性設定

使用root登入是有一定程度的安全性問題,因為FTP傳輸時預設並沒有加密
上網查到有以下幾個方法能增加FTP存取時的安全性

1.限制FTP使用者

如果要新增adminuser這個帳號而且將目錄固定在/var/www/html/adminuser/user_html這個目錄中,但無法使用SSH登錄系統

指令
adduser -d /var/www/html/adminuser/user_html -g ftp -s /sbin/nologin adminuser
passwd adminuser
輸入登入時的密碼

如果要使只有adminuser可以切換目錄
要修改vsftpd.conf並加上以下設定
指令
vi /etc/vsftpd/vsftpd.conf

chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

然後
vi /etc/vsftpd/chroot_list
把adminuser這個帳號加入到此文件內存檔就完成了

更進一步的限制:限制連線來源IP

設定只允許 192.168.0.0/24 的主機能登入 FTP Server
請修改 /etc/hosts.allow

vi /etc/hosts.allow
在裡面加入
vsftpd: 192.168.0.x

以及修改 /etc/hosts.deny
vi /etc/hosts.deny
在裡面加入
vsftpd: ALL 

[Linux]CentOS vsftp登入時發生錯誤 [500 OOPS:cannot change directory]

剛設定好的FTP Server在登入時可能會出現這樣的錯誤
500 OOPS:cannot change directory












這個問題原因找了好久也檢查過/home目錄下確實是有[AccountName]目錄的
後來發現原來是SELinux 的問題,又加上有開防火牆
解決的方法有兩個
1.關閉 SELinux
vi /etc/selinux/config
在裡面把
SELINUX=enforcing
改成
SELINUX=disabled

重新開機即可
reboot
****但是不建議使用這種方式****

2.查看SELinux設定中有關於ftp的權限設定
sestatus -b | grep ftp

會出現以下訊息
allow_ftpd_anon_write                       off
allow_ftpd_full_access                      off
allow_ftpd_use_cifs                         off
allow_ftpd_use_nfs                          off
ftp_home_dir                                off
ftpd_connect_db                             off
ftpd_use_fusefs                             off
ftpd_use_passive_mode                       off
httpd_enable_ftp_server                     off
tftp_anon_write                             off
tftp_use_cifs                               off
tftp_use_nfs                                off

發現ftp_home_dir預設是off的,所以把ftp_home_dir打開
指令
setsebool -P ftp_home_dir on

如果要給user有完整的存取權限另外要再把allow_ftpd_full_acces給打開
setsebool -P allow_ftpd_full_access  on


重新啟動FTP Server
service vsftpd restart

完成

[Linux]CentOS vsftpd的安裝與設定

CentOS安裝完成後FTP server的功能基本上是沒有的
但是要將檔案送到主機上,FTP倒是一種經常用的途徑之一
因此使用FTP server當做檔案接收的服務,有需要用時開啟用完則關
因為指令太多了在此紀錄一下
首先先切換到root權限(這樣指令可以少打sudo :p)
安裝 vsftpd:
yum -y install vsftpd
touch /etc/vsftpd/chroot_list
chkconfig vsftpd on

設定防火牆開通Port 21 :
防火牆iptables位置在 /etc/sysconfig/iptables
可透過指令直接新增
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
service iptables save

編輯 "/etc/vsftpd/vsftpd.conf"
vi /etc/vsftpd/vsftpd.conf
設定
anonymous_enable=YES
改成
anonymous_enable=NO

限制用戶只能在自己的用戶目錄"/home/[Account]"則在裡面加入:
限制用戶只能在家目錄 (/etc/vsftpd/chroot_list 的用戶可不受限制)
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

將 ftp 的檔案列表能看到跟 Server 上同樣的時間,在檔案加入:
# 使用本地時區
use_localtime=YES

重新啟動 vsftpd:
service vsftpd restart

以上設定就初步架好FTP Server了,但如果使用root登入FTP 出現會回傳530 Permission denied.
原因是安全性的關係vsftp預設會將系統一些特殊的帳號設定為封鎖
訊息大概如下
ftp 192.168.0.118

Connected to 192.168.1.100 (192.168.1.100).
220 Welcome to [computer name] FTP Server.
Name (192.168.1.100:root): root
530 Permission denied.
Login failed.
ftp>
如果要使用root登入FTP,要修改以下檔案

vi /etc/vsftpd/ftpusers


找到root 前面加上#號註解(清單內的帳號都是一些可能會被拿來亂用的)
vi /etc/vsftpd/ftpusers

# Users that are not allowed to login via ftpbin
#root
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody


之後再移除user_list裡面的帳號vi /etc/vsftpd/user_list
找到root前面加上#號註解

# vsftpd userlist

# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.bin
#root
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody


重新啟動vsftpd /etc/init.d/vsftpd restart

service vsftpd restart

2015年3月24日 星期二

[Linux指令]Linux刪除資料夾下所有資料夾和檔案

rm 是刪除資料夾指令
但是如果要刪除的資料夾內還有其他的東西,則直接執行會發生錯誤
這時候就要搭配其他的參數,才能一起刪除
從網路上找到的rm指令的參數
-i prompt before every removal -I prompt once before removing more than three files, or when removing recursively. Less intrusive than -i, while still giving protection against most mistakes -r, -R, --recursive remove directories and their contents recursively

所以要完成刪除整個資料夾(包含裡面的檔案)指令應該是
rm -rI 資料夾名稱

2015年3月22日 星期日

[JavaScript]檢查瀏覽器版本

以前在判斷瀏覽器版上會用到userAgent來判斷內容文字為何已作為瀏覽器的版本判斷
但是到了IE11版本後開始,卻會經常使之前的判斷程式失效
原因就是IE11開始對於userAgent開始做了一些偽裝?修改

使用以下的javascript來測試瀏覽器

<script type="text/javascript">
    document.write(navigator.userAgent);
</script>

IE11回傳的值為(測試環境為x64的OS)

Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; InfoPath.3; rv:11.0) like Gecko


判斷IE的版本是32 bit或是64 bit:
各個版本回傳的UserAgent:
在x64的OS下:
32位元的IE:有WOW64;
64位元的IE:有x64;

在32bits的OS下:
只會有32bits的IE,不會有WOW64;或x64;

所以UserAgent中帶有x64就一定是x64的IE,沒有x64就是32bits的IE
WOW64就一定是x64的OS
沒有WOW64和x64就一定是32bits的OS

另外此問題在MSDN的官方部落格上有篇這樣的資料在講述此問題
http://blogs.msdn.com/b/ie/archive/2014/07/31/the-mobile-web-should-just-work-for-everyone.aspx