2010年12月25日
#
啟動slapd
不論是包安裝還是編譯安裝的OpenLDAP服務,啟動LDAP服務通常使用類似這樣的方式運行:
/usr/sbin/slapd -h ldap:/// ldapi:/// -g openldap -u openldap -F /etc/ldap/slapd.d/
如果沒有任何的配置是否可以啟動slapd呢?
$mkdir ldap_slapd.d
$/usr/sbin/slapd -d 65535 -h ldap://localhost:3890 -F ldap_slapd.d
系統提示沒有配置目錄中沒有 cn=config.ldif 文件
最簡單的配置
現在在配置目錄中寫一個最簡單的配置:
$cat ldap_slapd.d/cn=config.ldif
dn: cn=config
objectClass: olcGlobal
cn: config
$/usr/sbin/slapd -d 65535 -h ldap://localhost:3890 -F ldap_slapd.d

成功啟動!在ldap_slapd.d下生成了cn=config 目錄并且將基本的schema自動的導入了,從運行日志中也可以看到這些。
通過這個例子可以看到slapd運行的過程,但這樣一個沒有實際Backend數據庫的slapd實例是沒有實際意義的。
配置
slapd的配置就是運行的關鍵,在新版OpenLDAP中,LDAP配置不再是slapd.conf,而是一系列的配置文件,放置在一個配置目錄下。LDAP將這個目錄看成一種Backend,也就是config backend。配置目錄中是若干的ldif文件,然后通過子目錄的方式表現樹形結構,以文件名表示配置節點的名稱。
slapd.d 目錄
LDAP的配置Backend包含3個內容:Schema、Backend、Database,都以ldif方式直接寫在配置文件中。backend和database配置相對較小可直接編輯,而schema比較復雜,如有外部定義的schema更是麻煩,如果直接編輯很麻煩也容易出錯。好在可以使用slaptest將舊式的.conf文件生成新配置。
實際上,slaptest的功能還不止這個,它還負責創建基本的數據庫文件。最新版的OpenLDAP在安裝后還是使用slapd.conf作為配置文件,然后在運行前創建配置Backend。
slapd.conf
slapd.conf由2個部分,先include schema文件,然后配置database。要注意后面database內容的語法是依賴core.schema的,所以沒有 include core.schema,后面的內容是不符合語法的。
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/inetorgperson.schema
include /user/defined/special.schema


database bdb
suffix "dc=example,dc=com"
rootdn "cn=admin,dc=example,dc=com"
rootpw secret
directory /ldap/data/dir
index objectClass eq

slaptest
運行:
$sudo /usr/bin/slaptest -f schema.conf -F /etc/ldap/slapd.d
slaptest要完成2個工作:將按schema生成schema.ldif配置,然后在指定的目錄下初始化bdb文件。
2010年2月20日
#
那天用Cron配置了一個MySQL數據庫自動備份。幾天下來才發現沒有運行。瞎搞了半天,沒有結果。最后在需要執行的命令下加個 > /tmp/b.log 2>&1。一看錯誤日志。哦,原來找cron不知道mysqldump在哪兒?;腥淮笪?。
cron在運行的時候可能PATH變量沒有那么多,所以好多命令需要在腳本中加入完整的路徑。其實我已經是第2次遇到這個問題了!真是不長記性啊,所以一定要記下!!
還有怎么沒有一開始就把日志輸出。UNIX管理員不看日志,看什么呢?這兩天過年肥肉吃多了說。日志!切記啊!
2009年12月2日
#
OpenSSH網站上那只SSH刺河豚將FTP埋葬
有關sftp有人推薦www.ssh.com的實現,不過我更喜歡開源的產品,特別是Open系列的安全產品。
需求
首先我們明確我們的目標,我們是希望通過SFTP代替FTP,需求是這樣的:
- 這些用戶只能通過SFT訪問服務器
- 用戶要鎖定在相應的目錄下
我想通常的思路是這樣的:
- 打開OpenSSH的SFTP
- 將這些用戶設置在一個組中
- 讓OpenSSH識別這個組,只允許這些用戶使用SFTP
- 最后系統要自動的將用戶chroot在用戶目錄下
配置
我開始都覺得是不是要求太高,不過OpenSSH可以解決以上所有問題。話說回來,如果不能解決怎么可以把FTP埋葬呢。
SSHD_CONFIG
sshd通常是打開了sftp的,不過我們應該使用
internal-sftp在sshd_conf中作如下配置:
1 # Subsystem sftp /usr/lib/openssh/sftp-server # 注釋掉
2 Subsystem sftp internal-sftp
3
4 ##
5 Match group sftponly
6 ChrootDirectory /sftphome/%u
7 X11Forwarding no
8 AllowTcpForwarding no
9 ForceCommand internal-sftp
10
解釋一下:當sshd匹配到sftponly組中的用戶,就會強制使用sftp(ForceCommand的作用),并將用戶限定在/sftphome/下相應用戶的目錄下(ChrootDirectory的作用)。
創建用戶
我們需要創建相應的用戶了:
#useradd -G sftponly -d /sftphome/sftpuser -s /usr/sbin/nologin sftpuser
#tail /etc/password

sftpuser:x:1000:1000::/sftphome/sftpuser:/usr/sbin/nologin
#passwd sftpuser
你可以在其他機器上用sftp登錄試試了。你的連接將會被reset!去看看sshd的日志,你會發現pam.d的認證是通過了的,但是chroot失敗了。按網絡上的說法
#chown root /sftphome/sftpuser
#chmod 755 /sftphome/sftpuser
再試,可以登錄。新的問題是不能在此目錄下寫入。對的嘛,755對于組用戶是不能寫啊。再試試775,剛才的問題就來又了,chroot失敗。
以上內容網絡上一google一大把。可以登錄不能寫這個問題真讓人困惑!后來我想可能應該這樣理解:既然要chroot,那個目錄不屬于root肯定是不行的(說錯了,猛拍磚)。那我們就不能為用戶提供完整的sftp服務了嗎?我想可以這樣
#mkdir /sftphome/sftpuser/space
#chown sftpuser.sftpuser /sftphome/sftpuser/space
由系統管理員為sftp用戶提供一個目錄,并設置其用戶屬性,用戶在這個目錄下用戶是可寫的。當然可以創建很多個。
這樣算不算解決這個問題呢?暫且如此吧。如果您有好方法,一定告知哦。
2009年8月14日
#
本文記錄如何給一臺應用中的MySQL服務器部署Replication。
安裝環境
現有MySQL
現有MySQL服務器的特點:
- 沒有專門為Replication環境配置
- MySQL為編譯安裝
- MySQL處于運行狀態,不可長時間停機
目的
將現有服務器作為Master服務器,配置并運行一臺新的MySQL服務器作為Slave服務器
準備
- 服務器硬件
- 現有主服務器的安裝代碼包(mysql-5.x.xxx.tar.gz)
主服務器的配置和數據準備
Master服務器的必須配置
要使用Replication必須將Master的binlog打開,并設置服務器ID。最簡單的配置如下:
log-bin = mysql-bin
server-id = 1
當然關于MySQL Bin Log的配置還有很多設置,可以參考相關手冊
數據備份
現在需要將Master的數據備份出來要注意的是要記住
備份點的binlog日志和postion 。Master數據備份的方式可以是停機冷備份,如果安裝了LVM可以使用LVM的Snapshot。下面使用mysqldump 導出數據。在導出數據之前我們應該Flush表,并鎖住表,比允許數據寫入。
mysql> FLUASH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000157 | 18757860 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
使用mysqldump導出數據
mysql:~# mysqldump -uroot -p --all-databases > dump.sql
解鎖
mysql> UNLOCK TABLES;
安裝參數的提取
需要在Slave主機編譯安裝MySQL要了解Master安裝時的編譯參數,可以通過如下方式獲得:
mysql:~# cat /usr/local/mysql/bin/mysqlbug | grep CONFIGURE
repl用戶創建
在Master服務器中創建repl用戶,用于在Slave 數據庫中訪問Master數據
mysql> GREANT REPLICATION SLAVE ON *.* to 'repl'@'IP.SLAVE.SERVER' identified by 'repl_passwd';
Slave服務器的安裝
MySQL的安裝
- 按前面提取的configure參數對源代碼進行編譯(
./configure; make; make install;
)
- 安裝初始化數據庫:
#mysql_install_db --datadir=/data --user=mysql
- 參照@{mysql-src}/support-files/
目錄中my.cnf文件在
/etc/下創建@my.cnf
- 參照@{mysql-src}/support-files/mysql.server@文件在@/etc/init.d/
下配置@mysqldb
- 可嘗試啟動mysql。
/etc/init.d/mysqldb start
數據的導入
mysql# mysql -uroot -p < dump.sql
如果導入出現超出最大數據包錯誤可以嘗試修改my.cnf中的max_allow_packet
在my.cnf中配置slave
在my.cnf中配置:
server-id = 2
master-host = master_ip
master-user = repl
master-password = repl_passwd
在Slave服務器上啟動Slave
mysql> STOP SLAVE;
mysql> CHANGE MASTER TO
MASTER_HOST='masterip',
MASTER_USER='repl',
MASTER_PASSWORD='repl_passwd',
MASTER_LOG_FILE='mysql-bin.000157',
MASTER_LOG_POS=18757860 ;
mysql> START SLAVE;
2009年3月20日
#
大輝推薦了一個網站www.wikimatrix.org。去看了看雖然一直用Wiki進行一些文檔的協作,但那么多Wiki還是第一次哈。于是想找一個用Python開發的wiki(wikimatrix上面有一個Wizard可以幫助您找到想要的)。除了老牌的plone,著名的MoinMoin,還發現了一個叫
hatta的。安裝了一下,真還不錯。
hatta的實現就一個python文件,功能簡單,沒有權限管理,沒有用戶管理,作者認為Wiki就是要歡迎天南地北的兄弟都可以修改。hatta的使用簡單,按照語法編輯,然后提交了事。中文化也非常簡單,Wiki內容本身就可以輸入中文,如果覺得頁面也應該是中文的也很簡單,改改po文件即可。我覺得如果您對Wiki的需求如下就可以考慮使用:
- 內部使用。如果部署在外網,好事者亂改一氣還是比較麻煩的,特別是放一些不該放的。
- 需要版本控制的文檔協作
- 要在文檔中嵌入程序代碼,代碼需要高亮
- 需要在文檔中嵌入數學公式。hatta使用latex語法輸入公式,生成的公式非常漂亮
2008年11月20日
#
今天維護服務器。一查看/var/log/auth.log,哦!天南地北的朋友都想登錄到我們的破服務器。雖然都未成功,但動物兇猛啊。現實殘酷,黑客無情,安全第一。還是安裝個rootkit檢查工具為妙:
#aptitude install chkrootkit rkhunter
#chkrootkit
.....
#rkhunter -c -sk
.....
還好。
2008年5月28日
#
最近一直在試用Jazz。IBM宣傳Jazz是下一代的軟件交付平臺,IBM開發者網站上一大堆的文檔,看來IBM對這個軟件還是非常重視的。試用體會:
- IBM或者說Rational對軟件工程的研究是非常深入的,IBM Rational系列軟件可以充分體現IBM對軟件過程的理解。Jazz中集成了各種軟件開發過程(時下流行的Srcum也在其中)。Jazz充分認識到了敏捷的重要性,所以敏捷的思想貫穿整個軟件。
- 雖然IBM提供的比較豐富的文檔,學習曲線還是有些陡峭。特別對于沒有使用過Rational軟件的開發人員。推薦初學者先看看這個文檔
- Jazz的版本控制源于CC不是很喜歡,如果可以用SVN代替就好了。
- Jazz的客戶端是開源的,但服務端只有90天試用。具體的價格也要6月份才出來。
2008年5月19日
#
還是記錄在這吧。
現在在Debian下安裝tex很方便了。如果一些宏包沒有下載下來可以安裝在系統上。步驟:
- 在/usr/share/texmf/tex/latex下建一個目錄mkdir xxpackage
- 把宏包解壓在這里
- texhash
2008年4月19日
#
又是Python。呵呵。誰叫人家帥呢
Quixote的部署
在Quixote官方白皮書中已經詳細描述了Quixote的工作模式。Quixote可以使用Python自代的http_server(主要用于開發調試)和與Apache(或lighttpd)配合使用。
Quixote與Apache配合使用方式如下:
- 使用CGI,文檔中稱為egular CGI。被認為效率最低的一種方式,因為每一個請求都會創建一個新的進程。
- 使用fastCGI,CGI可以運行fastCGI一定是可以應用的。這也是豆瓣采用的方式。在Quixote作者的一個PPT中,他認為fastCGI是buggy的。哦:(也不至于啊。我們正在尋找使用fastCGI的部署經驗。
- 使用mod_python,將python代碼嵌入到Apache中。
- 使用SCGI,這是作者推薦的。使用Apache SCGI module scgi_mod將遵循SCGI協議Apache將請求發送到相應的Socket如localhost:3001。而這個Socket由本地運行的一個 Python程序打開。這個Python程序將處理請求,并返回結果。
SCGI的配置
Quixote的網站上對SCGI的描述:SCGI協議是CGI協議的替代。它是一種應用程序與HTTP服務接口標準。它有些像FastCGI但他的設計更容易實現。
配置SCGI過程如下:
- 安裝各個模塊不在話下,debian讓程序員有了懶惰的美德:
#aptitude install libapache2-mod-scgi python-scgi python-quixote
- Apache的配置,添加配置到apache.conf。(有些教程中加入了SetHandler scgi-handler ,但這個加上就很本不會和3000通信??赡苁前姹镜膯栴}。最好不用。)
<Location "/qx">
SCGIServer localost:3000
SCGIHandler On
</Location>
配置完成。SCGI的好處在于,修改了Python程序,不用重啟Apache,只要重啟SCGI就可以了。
第一個Quixote程序
一切就緒,我們來一次Quixote的完整之旅。
- scgi程序要求有一個服務打開3000端口。啟動scgi的程序如下:
1
2 #!/usr/bin/python
3 # -*- coding: utf-8 -*-
4
5 from scgi.quixote_handler import QuixoteHandler, main
6 from quixote import enable_ptl
7 from quixote.publish import Publisher
8 enable_ptl() #啟動PTL
9
10 def create_publisher():
11 from ourroot import RootDirectory
12 return Publisher(RootDirectory(), display_exceptions='plain')
13
14 if __name__ == '__main__':
15 from quixote.server import scgi_server
16 scgi_server.run(create_publisher, port=3000, script_name="/qx")
17
- 程序結構是比較簡單的,使用的是scgi_server的run方法。要注意的是run方法中的script_name和前面apache 的配置Location是一樣的。程序的關鍵是導入了ourroot這樣一個ptl 。下面是我們的第一個ptl程序。
1
2 # -*- coding: utf-8 -*-
3 """這個是我們第一個例子的根目錄
4 """
5 from quixote.directory import Directory
6
7 class RootDirectory(Directory):
8 _q_exports = [""]
9 def _q_index [html] (self):
10 print "debug message from the index page"
11 """
12 <html>
13 <head>
14 <meta http-equiv="Content-Type" content="text/html charset=UTF-8" />
15 <title>第一個例子</title>
16 </head>
17 <body>
18 <h1>第一個例子有中文!</h1>
19 </body>
20 </html>
21 """
22
- 現在在瀏覽器中輸入http://localhost/qx就可以看到結果了。
- 除了運行上面的python腳本,也可以采用這樣的方式運行scgi:
python /var/lib/python-support/python2.5/quixote/server/scgi_server.py \
--factory=FirstApp.create_publisher \
--script-name=/qx --port=3000
Quixote 中文化的要點
Quixote的中文設置好像很麻煩。其實隨著python、Quixote版本的推進,現在這個問題已經很簡單了。字符集使用的是utf-8。使用gb2312可能也是可以的。
- 所有源代碼使用utf-8在程序的開始加上# -*- coding: utf-8 -*-
- ptl的html模板加上content="text/html charset=UTF-8"
- 關鍵:在quixote的安裝路徑下有__init__.py,將其中的DEFAULT_CHARSET = 'iso-8859-1'改成 'utf-8'
- 也可以不修改__init__.py,使用Publisher的時候把Publisher擴展一下:
1 class UTF8Publisher(Publisher):
2 quixote.DEFAULT_CHARSET = "utf-8"
2008年4月18日
#
很久沒有更新了。
敏捷時代似乎已經到了,將更多的時間花在了Python和Ruby上。C++好些地方使不上勁呢:(。
前段時間研究了一下boost.python,還真不錯,就是文檔太少啊。有時間將其整理一下。
pongba的這個
論壇還真不錯。天天在上面泡著。