在Linux上搭建WEB服务器:基本概念

来源:互联网 发布:淘宝小婷电玩 编辑:程序博客网 时间:2024/04/24 19:27

一、 WWW与HTTP

  WWW(World Wide Web)服务,现在是网络应用中最热门的技术。无论是人们在Internet中浏览、搜索、共享信息,还是企业内部的管理组织与服务宣传,都和这种简单的交互式图形界面的网络服务有着不可分割的关系。

  由于WWW的用户可以获得没有时间、地域的限制的各种信息服务,这对一个企业(尤其是跨地区的企业)来说,有着非常大的价值。利用Web页面每天24小时向全世界提供宣传服务,和客户网上交易的电子商务,企业内部信息时刻同步共享……尤其是Application Server技术逐渐取代以往的C/S对等模型,WWW更是全面进军商业应用。

  WWW是基于客户机/服务器模式的信息发现技术和分布式超媒体技术的综合。超媒体扩展了传统的超文本系统,把多媒体内容引入到web中。由于每一个超媒体文档仍采用超文本标记语言(HyperText Markup Language,HTML)来组织表示,习惯上,我们仍称之为超文本技术。每一个超媒体文档在网络中都必须也必然只有一个标识,这种标识技术人们称之为统一资源定位(Uniform Resource Locator,URL)。URL通常的形式为:

Protocal://Computer_Name:Port/Document_Name


  其中Protocal为访问文档所采用的协议名,Computer_Name为文档所在网络计算机的域名,Port为可选的协议端口号,Document_Name为在指定计算机中的文件名。例如URL:

http://www.linuxaid.com.cn/bbs/index.jsp


  指明http协议,计算机www.linuxaid.com.cn,文件bbs/index.jsp。

  http协议,全名叫超文本传输协议(HyperText Transport Protocol),是专门用来传送超媒体文档所制定的协议。原则上,HTTP是直接的:它允许浏览器请求一个指定的项,然后服务器返回该项。为了确保浏览器和服务器能够明确地互相操作,HTTP定义了浏览器发送到服务器的请求格式与服务器返回的应答格式,并对传输的内容进行了保证。

  本文主要介绍使用Linux系统实现网络服务器的WWW服务功能。

  在UNIX/Linux系统中,我们常用的单独的WWW服务器主要有三种:

  1、CERN httpd

  这是最早期的WWW服务器软件,特点主要就是古老啦。有兴趣的话可以在ftp://ftp.w3.org/pub/www/bin中找到它。

  2、NCSA httpd

  这是美国国家超级计算机应用中心(NCSA)在1995年创建的WWW服务器。C语言开发,程序小、速度快,但已经不再升级了。但由于它与众不同的出身,相信对它感兴趣的人还不少,可以在ftp://ftp.ncsa.uiuc.edu找到它。

  3、Apache

  举世闻名的服务器你不会不知道吧?据说全世界50%以上的WWW服务器都是它。它是在NCSA的基础上开发出来的,并一直高速发展着。

  Apache的主要特征是:

  ·可以在任何计算机平台上运行。

  ·支持http1.1。

  ·简单而强有力的基于文件的配置。

  ·支持通用网关接口(CGI)。

  ·支持虚拟主机。

  ·支持HTTP认证。

  ·集成Perl脚本编程语言。

  ·集成的代理服务器。

  ·具有可定制的服务器日志。

  ·支持服务器端包含命令(SSI)。

  ·支持安全Socket层(SSL)。

  ·用户会话过程的跟踪能力。

  ·支持FastCGI。

  ·支持Java Servlets和JSP。

  当然,随着IBM、Oracle等大公司开始加入推进linux的计划,它们的应用服务器也开始有了For Linux的版本。这也使我们有了更多的选择的机会。不过,基于Apache无可否认的王牌地位,我们还是以Apache为核心来提供流行的WWW服务器架构。

二、Linux+Apache+PHP+MySQL的WEB服务解决方案

  作为时下流行的服务器配置方案,Linux+Apache+PHP+MySQL这一套全部免费的解决方案还是比较受人亲睐。也许你会觉得MySQL是不是难以支撑你的网络负载,我可以告诉你个小秘密,中华网等比较大的网站也在使用这个小巧而高效的数据库服务器。提醒你一点,整个安装过程需要root权限。

  1、软件包的获取

  apache 可以从http://www.apache.org获得

  mysql 可以从http://www.mysql.com获得

  php可以从http://www.php.net获得

  Apache建议选择源代码包下载,而不要下载其他人准备的二进制文件。如果使用二进制文件包的话,则web服务器四旁包含的模块以及功能特性,就是取决于别人而非你自己了。有时,下载的二进制文件可能根本无法在你的系统上运行,这通常是因为二进制文件所需要的函数库与系统中已经有的函数库不兼容而导致的。如果你一定要下载二进制包的话,请确认在知名站点下载(最好是源站点)。我们假设要处理的对象是源代码。我们将以如下几个软件包做为讲解的例子:


apache_1.3.14.tar.gz
php-4.0.4pl1.tar.gz
mysql-3.22.30.tar.gz



  实际上,它们并非你在看见这篇文章时的最新版本,所以,我们将也会讨论如何从软件包本身获得帮助,定制我们所需要的功能。

  2、解压源代码包

  将源代码包拷贝到合适的目录下。例如,我们把它放在/server下。执行命令:


[root@localhost]# mkdir /server
[root@localhost]# cp * /server/
[root@localhost]# cd /server
[root@localhost]# tar zxvf apache_1.3.14.tar.gz
[root@localhost]# tar zxvf php-4.0.4pl1.tar.gz
[root@localhost]# tar zxvf mysql-3.22.30.tar.gz



  之后,使用ls查看可以看见软件包解压后生成三个子目录:pache_1.3.14、php-4.0.4pl1和mysql-3.22.30。

  3、编译安装MySQL

  请注意,我们需要先安装MySQL,这样PHP才能利用有关MySQL的一些本地资源。不少人都是因为忽略了这一点,所以导致MySQL可以用它自己的客户端访问,却不能和PHP连接。


[root@localhost]# cd mysql-3.22.30
[root@localhost]# mkdir /server/mysql-----建立mysql的安装目录
[root@localhost]# ./configure --prefix=/server/mysql
-----配置mysql的安装(指定了安装目录)
[root@localhost]# make
[root@localhost]# make install



  完全符合GNU软件发布的规范三部曲:)——configure、make、make install。可以使用configure --help来获得它其它的编译配置参数,可以用 configure --help>~/mysql.txt 把所有参数输出到文本文件~/mysql.txt里打印出来仔细看:)。接下来我们需要使用源代码包提供的脚本来初始化数据库。


[root@localhost]# ./scripts/musql_install_db



  将MySQL的启动命令添加到系统的/etc/rc.d/rc.local文件中,这样每次启动都会自动启动mysql。


[root@localhost]# echo "/server/mysql/bin/safe_mysqld>
/dev/null &">>/etc/rc.d/rc.local



  启动MySQL守护进程

[root@localhost]# safe_mysqld&


  使用/server/mysql/bin/mysql命令看看,屏幕输出“mysql>” 提示符,连接成功。敲入exit退出mysql客户端。准备进入下一步安装。

  实际上,在linux编译mysql的难度还是相当高的。无论是内存容量、mysql的历史版本(在你的系统中已有的mysql)、GCC的版本等等,都可能导致编译出错。甚至需要手工修改它的config.h文件。所以,更好的解决办法是在你确认你的系统支持rpm包的情况下,取得mysql的RPM包来安装。在最新的redhat 7.1的光盘里就有新版本的RPM包。安装RPM包的一般方法是:


[root@localhost]# rpm -Uvh MySQL-3.xx.xx.i385.rpm
[root@localhost]# rpm -Uvh MySQL-client-3.xx.xx.i385.rpm



  注意,我们这里安装了俩软件包,一个是MySQL的服务器包,一个是它的客户端,你可以认为这是必须的。在RH linux里使用RPM安装后可以直接通过控制台的setup命令来设置System Service中的mysqld服务器守护进程是否随系统一起启动。你也可以使用命令/etc/rc.d/init.d/mysql stop来停止服务,用/etc/rc.d/init.d/mysql start来启动服务。

  4、编译安装Apache和PHP

  我们把PHP作为Apache一个模块来安装,而不用传统的CGI模式,可以获得更多有用的功能和更安全的执行方式。


[root@localhost]# mkdir /server/apache
[root@localhost]# cd /server/apache_1.3.14
[root@localhost]# ./configure --prefix=/server/apache
------对apache进行预配置,如果没有这个,PHP的编译会出错



  开始编译PHP模块:


[root@localhost]# cd ../php-4.0.4pl1
[root@localhost]# ./configure --with-apache=../apache_1.3.14
--with-mysql=/server/mysql --enable-track-vars --with-config-file-path=/etc



  在这里为了讲解方便,我们使用了最简单的安装配置。--with-apache表示和apache一起编译,提供apache的源目录;--with-mysql表示支持mysql,需要提供mysql的安装目录;--enable-track-vars允许自动提取cookie和跟踪用户提交的变量;--with-config-file-path指定其配置文件php.ini所在的目录。同mysql的安装一样,你可以通过./configure --help来获得参数说明,并根据需要来定制你需要的功能。

  例如,RedHat7.1自己提供的PHP的编译参数为:--prefix=/usr --with-config-file-path=/etc --disable-debug --enable-pic --enable-shared --enable-inline-optimization --with-apxs=/usr/sbin/apxs --with-exec-dir=/usr/bin --with-regex=system --with-gettext --with-gd --with-jpeg-dir=/usr --with-png --with-zlib --with-db2 --with-db3 --with-gdbm --enable-debugger --enable-magic-quotes --enable-safe-mode --enable-sockets --enable-sysvsem --enable-sysvshm --enable-track-vars --enable-yp --enable-ftp --enable-wddx --without-mysql --without-oracle --without-oci8 --with-xml 。你也可以参考它配置你的安装。实际上,出于安全考虑,我们总是试图找到一个支持功能模块最小的集合,就如同服务器本身也力求功能单一一样,够用就行了,就算以后要升级,那也可以很方便的重新编译。当然它这个安装参数和我们现在要做的没有关系。


[root@localhost]# make
[root@localhost]# make install
[root@localhost]# cp ./php.ini-dist /etc/php.ini
--------将php的配置文件拷贝到先前我们指定的目录。



  开始编译APACHE:


[root@localhost]# cd ../apache_1.3.14
[root@localhost]# mkdir /var/www
[root@localhost]# ./configure --htdocsdir=/var/www/
--prefix=/server/apache --activate-module=src/modules/php4/libmodphp4.a
-------不同的版本提供的模块名称不一样,建议查证一下,就在./src/modules目录下
[root@localhost]# make
[root@localhost]# make install



  修改apache的配置文件。和IIS不一样,apache的配置主要是通过它的配置文件httpd.conf的修改来完成的。在这里,我们需要做的只是把ServerName行前的注释符号“#”去掉就可以了。


[root@localhost]# cd /server/apache/conf
[root@localhost]# vi httpd.conf----------修改完以后保存
[root@localhost]# cd /server/apache/bin
[root@localhost]# apachectl start ----------启动apache服务器



  系统会输出apache守护进程启动成功的信息。然后我们需要把它加到系统启动时启动的服务中去。


[root@localhost]# cp ./apachectl /etc/rc.d/init.d/httpd



  系统提示是否覆盖,选Y覆盖。

  最后,我们只需要在/var/www/目录下建立一个新的php文件包括如下内容:


<?
phpinfo();
?>



  打开浏览器访问它,就可以看见我们的成果了:)。

  在这里,我们成功的建立了一套Linux+Apache+PHP+MySQL完全免费(或者叫0成本?呵呵)的WEB服务解决方案。需要提醒您一下的是,在本文完成以前,apache的最新稳定版本是1.3.19,php的最新稳定版本是4.0.5,mysql的最新稳定版本是3.23.38,您可以去下载回来在自己的机器上尝试一下他们的最新特性。下面,我们进一步讲解如何将当前被认为执行效率最高的JSP服务器端脚本语言支持集成到我们的服务器中去。

  附录:建立一个安全的WWW服务器的一些建议

  (Unix_guo的一些建议,仅供参考)

  ◇尽量让一个主机投入Web服务器之中,不允许无理由的交互式登录。删除Web管理员帐号之外的其他用户

  ◇从/etc/inetd.conf中禁止不需要的服务。如果站点需要ftp功能,那么让另外一台主机作为ftp服务器。其他服务应该被禁止或者限制,包括telnet、finger、netstat/systat、echo等等。

  ◇删除不需要的shell和解释器。如果不运行Perl CGI脚本,就删除Perl

  ◇不支持自动列目录、符号链跟随和服务器端包含这样的选项

  ◇不要使Web上的日志文件可以被访问

  ◇当日志文件不再需要时删除他们

  ◇必要的时候使用SSL

  ◇允许匿名ftp访问http目录,给用户提供了在任何Web服务器上限制对文件的访问的办法。因此,如果在你的Web服务器上有机密文件长久使用这个办法,可能失去文件的机密性。

  ◇如果一个攻击者能下载你的CGI脚本,他可以搜索出攻击的路径。

  ◇你必须完全的确保非WWW管理员的ftp用户无法上载一个能在你的服务器上运行的脚本

  ◇显示给你的/etc/passwd文件也可能被用WWW服务的人见到,从而导致它的内容受破坏。

  ◇不要安放NFS或输出任何目录

  ◇删除所有的编译程序(在服务器稳定运行以后)

  ◇删除所有的不是用作引导或者Web服务器的实用程序

  ◇提供尽可能少的网络服务(再次重申)

  ◇不要运行邮件服务器

  如果想知道更多关于HTTP/WWW的安全知识,请访问 http://www.w3.org/Security/Faq/