第 23 章 服务器

目录

LAMP

虚拟主机

Lighttpd

fastcgi 配置

proxy

CGI

路径绑定

虚拟主机

PHP&MySQL

PureFTPD

LAMP

LAMP是一个缩写,它包括:Linux 操作系统,Apache 网络服务器,MySQL 数据库,Perl、PHP 或者 Python 编程语言。

毫不夸张的说,LAMP 是开源世界的“皇家海军”[42],正是凭借 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] 或许 Emacs 工具链可以算是“太平洋舰队”

Lighttpd

Lighttpd是一个新兴的、轻量级的 web 服务器,它开始越来越多的应用在一些重要场合,如:YouTobe、Sourceforge、豆瓣……

Lighttpd 以安全、快速和内存消耗低著称,还专门为大型分布式连接环境做了优化,支持 FastCGI, CGI, Auth, 输出压缩(output compress), URL重写, Alias 等重要功能。

Lighttpd 已经进入大多数发行版的软件仓库,安装方式见表 16.1 “包管理系统”

安装完成后,用启动脚本启动:/etc/init.d/lighttpd start,见“手动控制服务”一节

/etc/lighttpd/lighttpd.conf为 Lighttpd 服务器的配置文件[43]:

## 网站根目录 映射在机器上的物理路径
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”一节

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] 查看/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 “包管理系统”

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]

## 绑定的地址和端口(默认为所有 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] 查看/etc/init.d/pure-ftpd文件,可以看到类似字句:

/usr/sbin/pure-config.pl /etc/pure-ftpd.conf

启用配置文件