## 第?23?章?服務器
**目錄**
[](ch23.html#id3095653)
[LAMP](ch23s02.html)
[虛擬主機](ch23s02.html#id3095701)
[Lighttpd](ch23s03.html)
[fastcgi 配置](ch23s03.html#id3096095)
[proxy](ch23s03.html#id3096211)
[CGI](ch23s03.html#server-cgi)
[路徑綁定](ch23s03.html#id3096318)
[虛擬主機](ch23s03.html#id3096354)
[PHP&MySQL](ch23s04.html)
[PureFTPD](ch23s05.html)
## LAMP
`LAMP`是一個縮寫,它包括:Linux 操作系統,Apache 網絡服務器,MySQL 數據庫,Perl、PHP 或者 Python 編程語言。
毫不夸張的說,`LAMP` 是開源世界的“皇家海軍”[[42](ch23s02.html#ftn.id3095666)],正是憑借 LAMP 的力量,開源應用得以在服務器市場稱雄
web 服務器(Apache) 是 LAMP 的核心,幾乎所有遠程訪問都要通過 web 服務器進行。除了 Apache ,web 服務器還有一些其它的開源實現,如:Lighttpd、Tomcat、Zope 等
Perl、PHP、Python 是服務器端腳本語言,web 服務器以擴展的形式支持這些語言作為后端處理器,以獲得強大的可編程能力
數據庫服務器(MySQL)提供數據存儲、檢索支持。除了 MySQL ,還有 PostgreSQL 等開源實現
理論上可以直接通過網絡訪問數據庫服務器,不過出于安全需要,多數 LAMP 應用中,數據庫服務器只能由 web 服務器本地訪問。
也就是說,訪問 web 服務器,產生了數據處理請求,web 服務器把數據請求發送到數據庫服務器,然后將數據庫服務器返回的處理結果發送給訪問者
數據庫服務器接受和返回數據處理請求,要通過 SQL 查詢語言。web 服務器本身不支持 SQL,而服務器端腳本語言可以內嵌 SQL 語句,web 服務器通過腳本語言處理訪問者對數據庫服務器的請求
### 虛擬主機
一臺機器上可能有多個網絡接口:每一塊網卡會分配一個 IP地址;類似 `127.0.0.1` 這樣的回環地址則指向本地機器
網絡接口就像港口,有很多泊位,稱為端口。可以使用不同的協議連接(如 http、ftp、ssh 等)
服務器工作時,會監聽某一地址的固定端口,稱為“綁定”。如果該端口中傳來請求,則進行響應
很多服務器可以針對不同的網絡接口設置不同的響應規則,例如:從內網訪問接口 `192.168.1.2` ,使用 `/home/user` 作為根目錄;從公網訪問接口 `211.148.131.7` 使用 `/var/WWW` 作為根目錄
這就是虛擬主機
* * *
> [[42](ch23s02.html#id3095666)] 或許 Emacs 工具鏈可以算是“太平洋艦隊”
## Lighttpd
`Lighttpd`是一個新興的、輕量級的 web 服務器,它開始越來越多的應用在一些重要場合,如:YouTobe、Sourceforge、豆瓣……
Lighttpd 以安全、快速和內存消耗低著稱,還專門為大型分布式連接環境做了優化,支持 FastCGI, CGI, Auth, 輸出壓縮(output compress), URL重寫, Alias 等重要功能。
Lighttpd 已經進入大多數發行版的軟件倉庫,安裝方式見[表?16.1 “包管理系統”](ch16s03.html#pkg-manage "表?16.1.?包管理系統")
安裝完成后,用啟動腳本啟動:`/etc/init.d/lighttpd start`,見[“手動控制服務”一節](ch15s04.html#init.d "手動控制服務")
`/etc/lighttpd/lighttpd.conf`為 Lighttpd 服務器的配置文件[[43](ch23s03.html#ftn.id3095828)]:
```
## 網站根目錄 映射在機器上的物理路徑
server.document-root = "/home/lighttpd/html/"
## 如果網站目錄中出現以下文件名,不用指定文件名便可直接訪問
index-file.names = ( "index.php", "index.html",
"index.htm", "default.htm" )
## Lighttpd 進程的歸屬用戶
server.username = "nobody"
## Lighttpd 進程的歸屬群組
server.groupname = "nobody"
## 綁定到端口 默認為 80
#server.port = 81
## 綁定到地址 默認為 所有
#server.bind = "127.0.0.1"
## 訪問日志 路徑
accesslog.filename = "/var/log/lighttpd/access.log"
## 錯誤日志 路徑
server.errorlog = "/var/log/lighttpd/error.log"
## 禁止訪問以下文件
url.access-deny = ( "~", ".inc" )
## 與目錄列表相關的設置
#dir-listing.activate = "enable"
#dir-listing.encoding = "utf8"
#dir-listing.show-readme = "enable"
```
配置文件中的`server.modules`字段決定Lighttpd使用哪些擴展模塊:
```
server.modules = ("mod_access","mod_fastcgi","mod_accesslog" )
```
* Lighttpd 通過 `mod_fastcgi` 模塊支持 PHP
* `mod_accesslog` 模塊為訪問紀錄
其實在 `/etc/lighttpd/lighttpd.conf` 文件中,這部分內容寫在多行,方便用 `#` 作注釋,禁用不需要的模塊
```
server.modules = (
## 基礎模塊
"mod_access",
## 訪問紀錄
"mod_accesslog" )
## fastcgi 支持
"mod_fastcgi",
## cgi 支持
# "mod_cgi",
## 路徑綁定
# "mod_alias",
## 代理 (轉發頁面)
# "mod_proxy",
## 虛擬主機
# "mod_evhost",
## 輸出壓縮
# "mod_compress",
## 網址重寫
# "mod_rewrite",
## 用戶認證
# "mod_auth",
# "mod_redirect",
# "mod_cml",
# "mod_trigger_b4_dl",
# "mod_status",
# "mod_setenv",
# "mod_simple_vhost",
# "mod_userdir",
# "mod_ssi",
# "mod_usertrack",
# "mod_expire",
# "mod_secdownload",
# "mod_rrdtool",
```
### fastcgi 配置
在配置文件的`server.modules`字段中啟用`mod_fastcgi`模塊,然后檢查以下內容:
```
### fastcgi 腳本擴展名
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
### fastcgi 服務器設置
fastcgi.server = ( ".php" =>
( "localhost" =>
(
# TCP/IP 接口 (“套接字”)
"socket" => "/tmp/php-fastcgi.socket",
# PHP cgi 模式的可執行文件(PHP 有 cli 和 cgi 兩種模式)
"bin-path" => "/usr/bin/php-cgi"
)
)
)
```
上面例子的第二部分,使用 Lighttpd 轉發規則。大意為: `.php`文件按以下方式處理 => 從`localhost`(本地),發送到`/tmp/php-fastcgi.socket`接口,使用`/usr/bin/php-cgi`處理。寫成一行比較直觀:
```
fastcgi.server = ( ".php" => ( "localhost" => ( "socket" => "/tmp/php-fastcgi.socket", "bin-path" => "/usr/bin/php-cgi" )))
```
如果想要 fastcgi 和 PHP 協同工作,還需要對 PHP 作一些設置,見[“PHP&MySQL”一節](ch23s04.html "PHP&MySQL")
### proxy
該模塊可以將文件轉發到其它服務器進行處理,例如將`.jsp`文件轉發到Tomcat服務器
```
### 首先啟用 mod_proxy 模塊
# += 表示在原來設置上增加
servers.modules +=( "mod_proxy")
### 設置 proxy 服務器轉發規則
proxy.server = ( ".jsp" =>
( "localhost" =>
(
# 將 .jsp 文件發送到 地址“127.0.0.1”的“8080”端口(也就是本機的 Tomcat 服務器)
"host" => "127.0.0.1",
"port" => 8080
)
)
)
```
### CGI
Lighttpd 可以支持 cgi
```
### 啟用 mod_cgi 模塊
server.modules += ("mod_cgi")
### 設置 cgi 解釋器
cgi.assign = ( ".pl" => "/usr/bin/perl",
".cgi" => "/usr/bin/perl",
".py" => "/usr/bin/python" )
```
### 路徑綁定
將一個路徑,映射到網站目錄中
```
## 啟用 mod_alias 模塊
servers.modules +=( "mod_alias")
## 將 /home/lighttpd/html/man 映射到 http://host/docs
alias.url += ( "/docs" => "/home/lighttpd/html/man" )
```
### 虛擬主機
Lighttpd 可以建立多個虛擬主機,綁定在不同的網絡接口
```
### 啟用 mod_evhost 模塊
servers.modules +=( "mod_evhost")
### 虛擬主機綁定的網絡接口
$HTTP["host"] == "192.168.1.2"
{
### 虛擬主機可以使用獨立的選項
dir-listing.activate = "enable"
dir-listing.encoding = "utf8"
dir-listing.show-readme = "enable"
### 虛擬主機根目錄
server.document-root = "/home/user/html"
### 虛擬主機路徑綁定
alias.url = ( "/download/" => "/home/user/downloads/" )
alias.url += ( "/pictures/" => "/home/user/pictures/" )
}
```
* * *
> [[43](ch23s03.html#id3095828)] 查看`/etc/init.d/lighttpd`文件,可以看到類似字句:
> `/usr/sbin/lighttpd -D -f /etc/lighttpd/lighttpd.conf`
**- f** 選項指定配置文件
## PHP&MySQL
PHP 的配置文件為 `/etc/php/php.ini`,如果與 Lighttpd 配合使用,請檢查下面語句
```
cgi.fix_pathinfo=1
```
在 web 服務器根目錄下新建一個 `index.php` 文件,內容如下:
```
<?php phpinfo(); ?>
```
訪問這個頁面,查看本服務器的 PHP 信息
與 Lighttpd 和 PHP 一樣,MySQL 也進入了大多數發行版的軟件倉庫,使用包管系統安裝,參見[表?16.1 “包管理系統”](ch16s03.html#pkg-manage "表?16.1.?包管理系統")
MySQL 安裝后,可能需要重設密碼:
```
## 停止 MySQL 服務器
/etc/init.d/mysqld stop
## 使用單用戶維護模式運行
mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
## 使用 root 身份,進入名為 `mysql` 的數據庫
mysql -u root mysql
## 更新 表`user` 中,`USER`項 值為“root”的行,
## 設定這一行 `Password`項 的值,PASSWORD()函數用來給密碼加密
mysql> UPDATE user SET Password=PASSWORD('這里設置密碼') where USER='root';
mysql> FLUSH PRIVILEGES;
mysql> quit
## 重啟 MySQL 服務器
/etc/init.d/mysqld restart
## 測試 MySQL 是否運行
$ mysqladmin -uroot -pmypasswd ping
mysqld is alive
## 測試 MySQL 密碼
$ mysql -uroot -p
Enter password:
## 如果密碼正確,會輸出以下內容
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.0.44-log Gentoo Linux mysql-5.0.44
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
```
## PureFTPD
相對于ProFTPD、WuFTPD等老牌 ftp 服務器,PureFTPD、vsftpd這些輕量級 ftp 服務器更加實用
PureFTPD 的配置文件通常為 `/etc/pure-ftpd.conf`[[44](ch23s05.html#ftn.id3096652)]
```
## 綁定的地址和端口(默認為所有 IP地址 的 21端口)
# Bind 127.0.0.1,21
## 將所有用戶限制在主目錄中 (不能跳出)
ChrootEveryone yes
## 如果前一個設置為 no,下面組的成員(GID)可以跳出主目錄;其他用戶仍然受限
## 如果想取消所有限制,注釋掉 ChrootEveryone 和 TrustedGID
# TrustedGID 100
## 如果用戶主目錄不存在,自動創建
# CreateHomeDir yes
## 新建目錄及文件的權限掩碼(禁止的權限)。文件掩碼:目錄掩碼
Umask 133:022
## 被動模式響應的端口范圍
# PassivePortRange 30000 50000
## 強制一個 IP地址 使用被動模式
# ForcePassiveIP 192.168.0.1
## 僅允許認證用戶進行 FXP 傳輸 (服務器=>服務器)
AllowUserFXP yes
## 允許匿名 FXP 傳輸
AllowAnonymousFXP no
## 兼容 ie 等山寨 ftp 客戶端
BrokenClientsCompatibility no
## 服務器允許的最大連接數
MaxClientsNumber 50
## 同一 IP 允許的最大連接數
MaxClientsPerIP 8
## 匿名用戶最大帶寬(KB/s)
# AnonymousBandwidth 8
## 所有用戶最大帶寬(KB/s),包括匿名用戶
# UserBandwidth 8
# 匿名用戶的上傳/下載的比率
# AnonymousRatio 1 10
# 所有用戶的上傳/下載的比率
# UserRatio 1 10
## 客戶端的最大空閑時間(缺省15分鐘,無動作將會被踢出)
MaxIdleTime 15
## 不允許認證用戶 (僅作為一個公共的匿名 FTP)
AnonymousOnly no
## 不允許匿名連接,僅允許認證用戶使用 (設置為 no 允許匿名連接)
NoAnonymous no
## 受信地址允許認證用戶,其它地址只能匿名連接
#TrustedIP 10.1.1.1
## 禁止匿名上傳( no = 允許上傳)
AnonymousCantUpload no
## 是否允許匿名用戶創建目錄
AnonymousCanCreateDirs no
## 'ls' 命令的遞歸限制。(文件的最大數目 最大子目錄深度)
LimitRecursion 2000 8
## 保留所有文件(禁止刪除)
# KeepAllFiles yes
## 如果上傳的文件已經存在,自動重命名
AutoRename no
## 禁止重命名
# NoRename yes
## 禁止更改文件權限
# NoChmod yes
## 禁止讀取隱藏文件(如 .history, .ssh 等)
ProhibitDotFilesRead no
## 禁止下載所有者為 "ftp" 的文件 (匿名用戶上傳后未被本地管理員驗證的文件)
AntiWarez yes
## 指定文件內容作為歡迎信息
# FortunesFile /usr/share/fortune/zippy
## 啟用磁盤限額。第一個數字為最大文件數,第二個數字為存儲空間大小(單位:Mb)
## 1000:10 限制每一個用戶只能使用 1000 個文件,共 10Mb
# Quota 1000:10
## 最大可用空間,保證日志文件不會被覆蓋 (默認為 99%)
MaxDiskUsage 99
```
PureFTPD 允許同時使用多種用戶認證方式。以下為關于用戶認證的配置:
```
## LDAP 配置文件
# LDAPConfigFile /etc/pureftpd-ldap.conf
## MySQL 配置文件
# MySQLConfigFile /etc/pureftpd-mysql.conf
## Postgres 配置文件
# PGSQLConfigFile /etc/pureftpd-pgsql.conf
## PureDB 用戶數據庫
# PureDB /etc/pureftpd.pdb
## pure-authd 套接路徑
# ExtAuth /var/run/ftpd.sock
## 啟用 PAM 認證
# PAMAuthentication yes
# 啟用 Unix 系統認證 (/etc/passwd)
# UnixAuthentication yes
```
PureFTPD 可以使用 syslog 生成日志,以下為關于日志的配置:
```
## Syslog 日志 。默認為 "ftp", "none" 禁用日志
SyslogFacility ftp
## 在日志文件中不解析主機名
DontResolve yes
## 在日志中添加 PID
# LogPID yes
## 使用 Apache 格式創建額外日志
# AltLog clf:/var/log/pureftpd.log
## 使用優化格式創建額外日志
# AltLog stats:/var/log/pureftpd.log
## 使用 W3C 格式創建額外日志
# AltLog w3c:/var/log/pureftpd.log
```
* * *
> [[44](ch23s05.html#id3096652)] 查看`/etc/init.d/pure-ftpd`文件,可以看到類似字句:
> `/usr/sbin/pure-config.pl /etc/pure-ftpd.conf`
啟用配置文件
- 開源世界旅行手冊
- 授權
- 致謝
- 序言
- 更新紀錄
- 導讀
- 如何寫作科技文檔
- 部分?I.?氣候
- 第?1?章?GUI? CLI?
- 第?2?章?UNIX 縮寫風格
- 第?3?章?版本號的迷霧
- 第?4?章???Vim 還是 Emacs
- 第?5?章???DocBook 還是 TeX
- 第?6?章?完全用 Gnu/Linux 工作
- 第?7?章?病毒
- 第?8?章?磁盤 分區
- 第?9?章?文件系統
- 第?10?章???發行版介紹
- 第?11?章???編程語言
- 第?12?章?無根的根:無名師的 Unix 心傳
- 部分?II.?地理
- 第?13?章?基礎知識
- 第?14?章?命令系統
- 第?15?章?基本系統
- 第?16?章?軟件管理
- 第?17?章?核心工具集
- 第?18?章?編譯工具鏈
- 第?19?章?圖形界面
- 第?20?章?國際化
- 第?21?章???內核
- 第?22?章?Grub
- 第?23?章?服務器
- 第?24?章?Vim 編輯器
- 第?25?章?Emacs 入門
- 第?26?章?正則表達式
- 第?27?章?docbook 指南
- 第?28?章?Git 版本控制系統
- 第?29?章?ConTeXt 入門指南
- 部分?III.?景觀
- 第?30?章?終極 Shell -- ZSH
- 第?31?章?完美工作站 Archlinux
- 第?32?章?組織你的意念:Emacs org mode
- 第?33?章???Zsh+screen
- 第?34?章???gentoo stage3
- 第?35?章???硬件問題
- 第?36?章???網絡設置
- 第?37?章???自制 LiveCD
- 第?38?章?awesome
- 第?39?章?openbox 工作環境
- 第?40?章???Emacs muse
- 第?41?章???寫作工具鏈
- 第?42?章?使用 lftp
- 第?43?章???Firefox 使用技巧
- 第?44?章???FVWM
- 部分?IV.?地質
- 第?45?章?Unix
- 第?46?章???Gnu
- 第?47?章?軟件業自由之神——Richard Stallman
- 第?48?章?Linux
- 第?49?章?GNOME與KDE的戰爭
- 第?50?章???Vim Emacs
- 第?51?章???年代紀
- 第?52?章?我的選擇
- 第?53?章???補遺