企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## 第 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`文件按以下方式处理 =&gt; 从`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` 启用配置文件