由 dsj 在 03-28-2003 10:36 发表:
RedHat Linux网络服务器构架实务
作者 : 赵凤君
邮件 : [email protected]
版本 : Chs_ 0.0.2.2
最后修改: August 7,2002
前言
软件列表:
配置步骤:
Step 1 RedHat 7.2 install
Step 2 X setup
Step 3 Services setup
Step 4 Dns setup
1 创建标准区域
2 创建域名库文件
3 重新启动DNS服务
4 域名查询
Step 5 KDE setup
Step 6 Ftp setup
Step 7 MySQL、Apache and php Unistall
Step 8 MySQL install
1 准备用户
2 安装MySQL
3 修改文件夹权限
4 重新加载动态库
5 测试MySQL
6 创建启动脚本
Step 9 Apache install
1 安装Apache
2 建立符号连接
3 编辑配置文件
4 测试Apache
5 创建启动脚本
Step 10 Php install
1 安装PHP
2 配置Apache
Step 11 Jvm setup
Step 12 Classes Install
Step 13 Edit /etc/profile
Step 14 Resin Install
1 安装Resin
2 建立符号连接
3 修改配置文件
4 测试Resin
5 创建启动脚本
Step 15 PhpMyAdmin install
1 配置DNS
2 建立FTP
3 安装phpMyAdmin
4 添加虚拟主机
5 添加身份验证
6 测试phpMyAdmin
Step 16 Server Test
例一:使用连接串连接数据库
例二:使用连接池连接数据库
例三:使用处理层连接数据库
例四:测试PHP
Step 17 Configuration debug
常见错误一:You don't have permission
常见错误二:404 Not Found
常见错误三:java.lang.ClassNotFoundException
常见错误四:Invalid authorization specification
常见错误五:Invalid authorization specification
常见错误六:中文乱码
Appendix
Appendix I : Thanks
Appendix II : Todo List
Appendix III: Revision log
闲聊空间:
http://www.wonyen.net/bbs/mboard.asp
由 dsj 在 03-28-2003 10:40 发表:
前言
这里我将说明本文档的书写动机、配置目标、主要内容、遵循原则和使用说明。
在我Linux的初学路上,那种不知所措、无处可问、遍体鳞伤的感觉是刻骨铭心的,其间之曲折耗时体会太深了。所以,这将一次次配置的结果不断累积完善,结晶成文。使得后来者不要象我那样走太多的弯路。其一可以作为初学者的安装向导,其二也可以听取大家的意见和建议,使之更加严谨和完善。
本文档的目标是构架一个比较规范的RedHat开发服务器作为项目的开发环境。本文档当前共十七个步骤,简明而全面的介绍了DNS、FTP、 MySQL、Apache 、JVM、 Resin、 PHP等服务器的配置办法。
下面是我书写本文档所遵循的几个原则:
1、 力求简明:去除任何多余的步骤;让命令说话,只加必要的注释,这样方便大家作为配置清单使用。本文档主要告诉读者如何去做,很少说明为什么这样做,但需要注意的是,如果您忽略了其中的任何一步都可能导致后面出错;
2、 系统全面:步骤贯穿从安装操作系统到配置完成的全过程,初学者一步一步照做即可;服务器的配置是一个系统的过程,很多说明文档只是说明某几个软件的配置方法,没有统筹兼顾,所以照搬往往失败;
3、 力求严谨:这是我的一个目标,也是我发布原因之一,现在这份文档自发布到现在已有半年有余,历经数百人的实践,偶有不明之处,亦已加以完善,已经可以保证很好的可靠性;
4、 保持最新:包括操作系统在内,所有的软件都是截止到01/18/2002日的最新版本,如果有新的软件版本出现,我也会努力做到及时更新;
5、 精选软件:文中提及的软件都是大家所熟悉的,只有两个需要说明。其一:为什么不选择FreeBSD而用Redhat?FreeBSD可谓是Intel平台上最好的网络操作系统,但它对JAVA(尤其是新版本的JDK)的支持很差,我曾在较长一段时间内采用FreeBSD作为JAVA开发平台,然而由于SUN并没有发布FreeBSD上的JDK,所以经常造成系统崩溃,已经是多次的经历了;为什么不用Tomcat而使用Resin?虽然Tomcat是Apache组织的一个项目,虽然它也在不断完善起来,但较之Resin还是有一定的差距;Resin在中文支持、执行效率、可定制性、升级速度、支持J2EE等方面都有不俗的表现,也是我个人已经体会到的;虽然我怀疑它在高端应用、系统负载等方面的性能,但应付中小型的Web项目方面应该是绰绰有余的;
6、 侧重JSP:以搭建JSP开发环境为主,可以作为JSP初学者的服务器配置手册:其一:RH7.2增强了多语言的支持,如果你在安装的过程中选择语言时选择了i18n的简体中文包,加上Resin对中文的良好支持,你无需声明Content-Type(任何方式的声明都不需要),中文将自动支持,这一点文档中也已说明;其二:提供了Resin连接池的配置方法和调用方法,并提供了一个用于数据库连接和处理的组件;其三:提供了添加一个JSP虚拟主机的详细方法,从DNS FTP APACHE到Resin全面讲述;其四:指出了JDBC2.0的支持办法,并提供代码进行测试;
7、 编译安装:软件全部编译安装,有益于系统可定制性和系统稳定性;
8、 目标读者:Linux初学者的配置向导和中高级读者的参考;
9、 配置目标:本文档当前最适合作为企业内部开发服务器的配置手册,如果作为Internet服务器,需要考虑的安全因素还很多,最起码不能全部安装,也不需要安装X server,Internet 服务器不仅需要我文档中提及的功能,更需要一个简洁安全的系统;
10、 功能清晰:我将服务器定位在一个DNS+FTP+MySQL+Apache+Resin+Php构架的Web开发服务器,而将可有可无的服务去掉。所以,文档中没有提及QMAIL、ORACLE和ASP、FrontPage扩展等配置方法。除了功能的分离和读者的需求之外,Oracle的最佳运行平台是SUSE Linux,ASP的最佳运行平台是NT,至于Qmail,后续版本可以增加进去;
以下是本文档的使用说明:
1、颜色说明:
深蓝色: 在原文文档中修改的或者添加的部分
深绿色: 我的注释
2、符号说明
#: 系统或者软件配置文档中原有的注释;
##: 我为随后段落做的说明
//: 我的行末说明
/…/:篇幅较长的说明
3、命令说明:
我习惯使用vi来表示编辑一个文件,如果不喜欢使用这个工具,你完全可以使用Advanced Editor之类的可视化编辑器或者mc等其他命令。
偶尔我会在命令之前加上shell>表示这是一个命令,以与文件内容区别开来,但这个版本是中文的,所以我一般不加该符号。
make 和make install是可以使用make;make install替代的,但为了便于查看每一步的提示信息,建议分开执行。
. /在文中很多地方出现,中间没有空格,而且点号也不明显,需要注意。
赵凤君
二○○一年十二月二十二日
软件列表
下载下面的软件并将它们放到/home/src目录。首先要创建一个系统帐户,然后将软件放到该目录下。下面的软件都将在本文档中用到,下面的连接都是截止到01/18/2002的最新版本:
RedHat 7.2
http://redhat.pacific.net.au/redhat....2/ja/iso/i386/
mysql-3.23.47.tar.gz
http://www2.linuxforum.net/mirror/m...-3.23.47.tar.gz
mm.mysql-2.0.4-bin.jar
http://www2.linuxforum.net/mirror/m...l-2.0.4-bin.jar
apache_1.3.22.tar.gz
http://www.apache.org/dist/httpd/apache_1.3.22.tar.gz
php-4.1.1.tar.gz
http://www.php.net/do_download.php?...hp-4.1.1.tar.gz
j2sdk-1_3_1_01-linux-i386.bin
http://java.sun.com/j2se/1.3/download-linux.html
jaf1_0_1.zip
http://java.sun.com/products/javabeans/glasgow/jaf.html
javamail1_1_3.zip
http://java.sun.com/products/javama...mail-1_1_3.html
resin-2.0.5.tar.gz
http://www.caucho.com/download/resin-2.0.5.tar.gz
phpMyAdmin-2.2.3-php.tar.gz
http://prdownloads.sourceforge.net/....2.3-php.tar.gz
闲聊空间:
http://www.wonyen.net/bbs/mboard.asp
由 dsj 在 03-28-2003 10:42 发表:
Step 1 RedHat 7.2 install
我的建议:
1、 安装时为/home建立单独的分区,因为/home是用户数据的存放之地,本文档中也将软件的安装文件都放到这个目录下,所以,这样做当你下次重新安装系统的时候,可以保留该分区,数据也就得以保全;
2、 采用定制安装的方式并选中’Everything’选项,这样特别适合于初学者,否则后面的安装过程中可能会出现找不到某个包或某个命令的情况;但如果是配置Internet服务器,就应该只选择必需的包,做到尽量的精简才够安全;
3、 选择语言时,建议选中simplified chinese(P.R.CHINA)选项,这样,当你配置好服务器的时候,在程序代码中无需任何声明,中文将被支持而不会乱码;
4、 使用Gnome做为登陆管理器,使用KDE作为默认的Session,设置默认启动到X,这样做的目的是为了方便远程控制;
5、 IP: 192.168.1.2,这是我在本文档中使用的IP,这个可以自行设置。
6、 文档中我没有涉及到防火墙的设置,系统安装完成后你可以使用ntsysv或者chkconfig命令将iptables和ipchains两个服务禁用掉,否则会导致telnet和远程登陆等无法使用;
当然,如果您熟悉防火墙设置,可以自行处理。
--------------------------------------------------------------------------------------------
Step 2 X setup
##这一步完成后,重启服务器,然后你就可以使用Extra!X等远程控制软件以图形界面在微软平台上进行服务器配置,这样做的好处是可以同时控制服务器端和客户端,不必奔走在两台机器之间。如果你按照下面的设置不能进行远程控制,那么,很有可能你的防火墙策略不允许这样做,禁用掉iptables和ipchains就可以了。
vi /etc/X11/gdm/gdm.conf //启用远程控制
[xdmcp]
Enable=1
vi /etc/X11/gdm/Sessions/Default //设置默认Session
exec /etc/X11/xdm/Xsession kde
vi /etc/X11/xdm/Xaccess //设置广播对象
192.168.1.*
--------------------------------------------------------------------------------------------
Step 3 Services setup
Shell> ntsysv
运行ntsysv命令启用named 、telnet 和 wu_ftpd 服务,禁用httpd 、mysqld、iptables和ipchains 服务和其他一些不需要的服务,然后用reboot重启服务器。
--------------------------------------------------------------------------------------------
Step 4 Dns setup
vi /etc/named.conf
1 创建标准区域
##你可以根据你的喜好来命名,这里我使用的后缀是.loc,主要是为了避免和Internet已经注册的域名相冲突,你可以自行决定你的后缀。
##添加下面的文本到 /etc/named.conf
zone yesgo.loc{
type master;
file "yesgo.loc";
}
zone 1.168.192.in-addr.arpa{
type master;
file "192.168.1";
}
2 创建域名库文件
touch /var/named/yesgo.loc
touch /var/named/192.168.1
##编辑正向域名库文件,建立主机名和主机别名
vi /var/named/yesgo.loc
@ IN SOA ns.yesgo.loc. root.ns.yesgo.loc. (
2001050801 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS ns.yesgo.loc.
IN MX 0 ns.yesgo.loc.
ns IN A 192.168.1.2
ftp IN CNAME ns.yesgo.loc.
mail IN CNAME ns.yesgo.loc.
pop IN CNAME ns.yesgo.loc.
smtp IN CNAME ns.yesgo.loc.
##编辑反向域名库文件,建立主机名指针
vi /var/named/192.168.1
@ IN SOA ns.yesgo.loc. root.ns.yesgo.loc. (
2001050801 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS ns.yesgo.loc.
IN MX 0 ns.yesgo.loc.
2 IN PTR ns.yesgo.loc.
3 重新启动DNS服务
/etc/rc.d/init.d/named restart
4 域名查询
##测试域名是否解析成功,这是一个交互式的命令行,你可以输入域名或者IP地址进行正向和反向查询
nslookup -sil
--------------------------------------------------------------------------------------------
Step 5 KDE setup
这一步是可有可无的,因为你完全可以不去理会而直接使用默认界面。一般的做法是先根据KDE配置向导进行总体设置,然后再使用KDE控制中心进行详细配置,在此不多介绍。需要提的一点是你可以通过KDE Control Panel 中的Windows Manager来设置默认Session,当然也可以通过配置文件来实现这一点。
--------------------------------------------------------------------------------------------
Step 6 Ftp setup
vi /etc/shells
##添加下面一行到/etc/shells,将作为FTP用户的shell,使其不能使用命令和telnet服务
/dev/null
增加ftpchroot组,该组中的用户将以自己的home目录作为FTP根目录
groupadd ftpchroot
添加FTP用户,该类用户只能使用FTP服务,且以自己的home目录为根目录
useradd src –s /dev/null –g ftpchroot //本帐号用来存放软件包
passwd src
/*
我习惯将软件包放到自定义的/home/src目录,主要目的还是上面提到的数据保全和软件上传问题,如果放到/usr/local/src目录,这两点也能实现但不方便,如果你习惯将软件包放到/usr/local/src,你可以删除/usr/local/src然后为/home/src建立一个符号连接。
*/
rm –R -f /usr/local/src
ln –s /home/src /usr/local/src
--------------------------------------------------------------------------------------------
Step 7 MySQL、Apache and php Unistall
使用Package管理器或者rpm命令卸载MySQL、Apache和PHP,建议初学者使用Package管理器,分别查找这三个关键词直到将所有相关的软件包都卸载干净。我们接着会编译安装这些软件。
--------------------------------------------------------------------------------------------
Step 8 MySQL install
1 准备用户
注意,这里所说的准备用户,指的是MySQL服务的启动用户,这个用户是Linux系统的用户,并非MySQL用户。需要搞清的是,Linux和MySQL有各自的用户机制,他们都有一个最高权限的用户root,MySQL安装完毕默认只有一个用户,root ,其密码为空,可以使用mysqladmin –u root –p password 指令来更改其密码。
userdel mysql
useradd mysql –s /dev/null
passwd mysql
2 安装MySQL
cd /home/src
tar xvzf my* //解包
cd my*
./configure --prefix=/usr/local/mysql //配置
make //编译
make install //安装
./scripts/mysql_install_db //建库
3 修改文件夹权限
##下面修改相关文件夹权限,否则MySQL服务不能启动,或者说你对数据库没有写权限
chown –R root /usr/local/mysql
chgrp –R mysql /usr/local/mysql
chown –R root /usr/local/mysql/bin
chgrp –R mysql /usr/local/mysql/bin
chown –R root /usr/local/mysql/var
chgrp –R mysql /usr/local/mysql/var
chmod 770 /usr/local/mysql/var
chown –R root /usr/local/mysql/var/mysql
chgrp –R mysql /usr/local/mysql/var/mysql
chmod 770 /usr/local/mysql/var/mysql
chown –R root /usr/local/mysql/var/mysql/*
chgrp –R mysql /usr/local/mysql/var/mysql/*
chmod 770 /usr/local/mysql/var/mysql/*
chmod 770 /usr/local/mysql/lib/mysql/libmysqlclient.a
4 重新加载动态库
##因为我们采用自定义编译安装的方式,所以跟系统原先定义的库位置不一样,现在我们重新指定它并重新加载
vi /etc/ld.so.conf
#添加下面一行
/usr/local/mysql/lib
shell>ldconfig //重新加载动态库
5 测试MySQL
cd /usr/local/mysql
./bin/safe_mysqld –-user=mysql & //启动MySQL服务
mysqladmin –u root –p password 'your_password' //更改用户密码
mysql –p //开始使用
6 创建启动脚本
##创建MySQL服务,使之在系统启动时自动启动
cd /etc/rc.d/init.d
touch mysqld
vi mysqld
##文件内容如下:
#!/bin/bash
#Start MySQL service
cd /usr/local/mysql
./bin/safe_mysqld - -user=mysql&
##改变该脚本的权限,否则系统启动时会说由于没有执行权限而启动失败
chown –R root /etc/rc.d/init.d/mysqld
chmod 700 /etc/rc.d/init.d/mysqld
##将此服务连接到init 5,如果你使用init 3启动机器,连接到rc3.d即可,60代表启动的次序,S要大写
ln –s /etc/rc.d/init.d/mysqld /etc/rc.d/rc5.d/S60mysqld
--------------------------------------------------------------------------------------------
Step 9 Apache install
1 安装Apache
cd /home/src
tar xvzf apa* //解包
cd apa*
./configure --prefix=/usr/local/apache --enable-module=so //设置编译参数
make //编译
make install //安装
闲聊空间:
http://www.wonyen.net/bbs/mboard.asp
由 dsj 在 03-28-2003 10:44 发表:
2 建立符号连接
##为启动程序建立符号连接,便于以后重启服务
ln –s /usr/local/apache/bin/apachectl /usr/bin/apache
3 编辑配置文件
设置默认页面,中间用空格分开
DirectoryIndex index.html index.jsp index.xtp index.php index.php3
4 测试Apache
Shell>apache start
lynx http://localhost
##如果出现Apache的文档页面,表示安装成功。
5 创建启动脚本
##创建Apache服务
touch /etc/rc.d/init.d/httpd
vi /etc/rc.d/init.d/httpd
文件内容如下:
#!/bin/bash
#Start httpd service
/usr/local/apache/bin/apachectl start
##设置文件权限
chown –R root /etc/rc.d/init.d/httpd
chmod 700 /etc/rc.d/init.d/httpd
##连接到你默认init 级别的所在目录
ln –s /etc/rc.d/init.d/httpd /etc/rc.d/rc5.d/S65httpd
--------------------------------------------------------------------------------------------
Step 10 Php install
本版本中我采用的是DSO安装模式,这样当你升级PHP的时候就无需重新安装Apache
1 安装PHP
cd ..
tar xvzf php*
cd php*
./configure --with-mysql=/usr/local/mysql --with-apxs=/usr/local/apache/bin/apxs --enable-track-vars --enable-sockets --enable-ftp //设置PHP编译参数
make //编译
make install //安装
cp ./php.ini-dist /usr/local/lib/php.ini //复制配置文件到/usr/local/lib
2 配置Apache
vi /usr/local/apache/conf/httpd.conf //配置Apache支持PHP
以php为关键词查找到如下几行,去掉前面的注释符号
AddType application/x-httpd-php .php
AddType application/x-httpd-php .php3 //本行需要自行添加,用来支持PHP3
AddType application/x-httpd-php-source .phps
#重新启动Apache
apache restart
----------------------------------------------------------------------------------------------------------------------
Step 11 Jvm setup
cp /home/src/ j2sdk-1_3_1-linux-i386.bin /usr/local
cd /usr/local
chmod a+x j2sdk-1_3_1-linux-i386.bin
##下面的指令是一个脚本,它先要问你是否同意,输入Y,然后它会自行安装
./j2sdk-1_3_1-linux-i386.bin
##为当前的JDK版本建立一个符号连接,这样做的目的是将来如果有新的版本安装到系统上,可以将新的目录连接为/usr/local/jvm,这样就无需修改很多配置文件
ln –s /usr/local/jdk1.3.1_01 /usr/local/jvm
--------------------------------------------------------------------------------------------
Step 12 Classes Install
##这个步骤是我的一个习惯,如果不做JAVA或者JSP开发可能不需要这一步,这个步骤的目的是设置一个放置自己JAVA类库的主目录,然后在此主目录下建立子目录分别存放不同种类的类文件。
##这里需要探讨的是MySQL的驱动程序。大家可以看到我下面使用的仍然是mm驱动,有网友建议我使用resin自带的驱动,我到caucho的站点上看到caucho声明它的驱动比mm驱动快很多,并附有相关数据;然而我测试的结果是resin驱动在rs跳转时除了rs.next()其他的rs.previous();、rs.first();和rs.last();都没任何作用,所以我仍然使用mm.mysql-2.0.4-bin.jar.zip 。
##创建类库主目录
mkdir /usr/local/lib/java
##下面安装MySQL的JDBC驱动,这个驱动是支持JDBC2.0的
mkdir /usr/local/lib/java/drivers
cp /home/src/mm.mysql-2.0.4-bin.jar.zip /usr/local/lib/java/drivers //MySQL driver
##下面安装JAF,需要说明的是,下载的jaf包是个winzip文件,我是windows上解压的,然后创建了一个jaf的目录将activation.jar放到里面又上传到/home/src的,你可以自行解决
mkdir /usr/local/lib/java/jaf
cp /home/src/java/jaf/activation.jar /usr/local/lib/java/jaf //Jaf class
##下面安装JAVAMAIL,我的处理办法同上
mkdir /usr/local/lib/java/javamail
cp /home/src/java/javamail/*.jar /usr/local/lib/java/javamail //JavaMail classes
--------------------------------------------------------------------------------------------
Step 13 Edit /etc/profile
##这一步用来配置环境变量,Resin的安装需要依赖该步骤
Vi /etc/profile
在/etc/profile文件末添加如下内容:
JAVA_HOME=/usr/local/jvm
RESIN_HOME=/usr/local/resin
CLASS_HOME=/usr/local/lib/java
CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/jre/lib:$RESIN_HOME/lib:$CLASS_HOME/drivers/mm.mysql-2.0.4-bin.jar.zip:$CLASS_HOME/jaf/activation.jar: $CLASS_HOME/javamail/mail.jar: $CLASS_HOME/javamail /smtp.jar: $CLASS_HOME/javamail /pop3.jar: $CLASS_HOME/javamail/mailapi.jar: $CLASS_HOME/javamail/imap.jar
PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local:/usr/local/bin:/usr/local/jvm/bin:/usr/local/jvm/jre/bin:/usr/local/mysql/bin:/usr/bin/X11:/usr/X11R6/bin
export JAVA_HOME RESIN_HOME CLASS_HOME CLASSPATH PATH
保存文件后注销登陆,然后重新进入,输入下面的命令查看系统变量是否已经生效:
Shell>env
--------------------------------------------------------------------------------------------
Step 14 Resin Install
1 安装Resin
cd /home/src
cp /home/src/resin-2.0.5.tar.gz /usr/local
cd /usr/local
tar xvzf resin*
cd resin*
./configure --with-apache=/usr/local/apache //设置编译参数
(Or: ./configure --with-apxs=/usr/local/apache/bin/apxs)
make //编译
make install //安装
2 建立符号连接
##建立resin的符号连接,道理同建立jvm符号连接
ln –s /usr/local/resin2.0.5 /usr/local/resin
##建立resin服务程序的符号连接,道理同建立apache符号连接
ln –s /usr/local/resin/bin/httpd.sh /usr/bin/resin
3 修改配置文件
vi /usr/local/resin/conf/resin.conf
Modify One: 建立连接池,类似于NT上的DSN(数据源)
1<resource-ref>
2<res-ref-name>jdbc/test</res-ref-name> //数据源名称
3
4
5
6<res-type>javax.sql.DataSource</res-type> //数据源类型
7
8
9
10<init-param driver-name="org.gjt.mm.mysql.Driver"></init-param> //数据库驱动
11
12
13
14<init-param url=" jdbc:mysql://localhost/test "></init-param> //连接串
15
16
17
18<init-param user="your_user_name"></init-param> //用户名
19
20
21
22<init-param password="your_password"></init-param> //密码
23
24
25
26<init-param max-connections="20"></init-param> //最大连接数
27
28
29
30<init-param max-idle-time="30"></init-param> //延时时间
31
32
33
34</resource-ref>
##后面的测试部分有例子介绍如何调用数据源
Modify Two: 修改默认主目录,如果使用虚拟主机,其实也可以不理会这个地方
1<app-dir> /usr/local/apache/htdocs </app-dir>
Modify Three: 修改Resin端口,与Apache协同工作
1<http port="8080"></http>
//删除本行即可
Modify Four: 添加支持JSP的虚拟主机
##添加一个支持JSP的虚拟主机需要做如下四方面的工作: DNS、FTP、APACHE、RESIN
1、添加一个DNS别名(当然主机名也可以)
vi /var/named/yesgo.loc
追加如下一行,当然你可以自定义其他别名或主机名
www IN CNAME ns.yesgo.loc.
/etc/rc.d/init.d/named restart //重启DNS服务
nslookup //测试是否解析成功
2、添加一个FTP帐号
Useradd www –s /dev/null –g ftpchroot //添加帐号
Passwd www //修改密码
Chmod 701 /home/www //设置权限,否则将来访问时服务器会说你没权限
3、在Apache中添加虚拟主机
vi /usr/local/apache/conf/httpd.conf
指定你建立虚拟主机所用的IP地址
NameVirtualHost 192.168.1.2
Add virtual host
1<virtualhost www.yesgo.loc="">
2
3ServerAdmin [email protected] //管理员邮件
4
5DocumentRoot /home/www //根目录
6
7ServerName www.yesgo.loc //域名
8
9ErrorLog logs/www.yesgo.loc-error_log //错误日志名称
10
11CustomLog logs/www.yesgo.loc -access_log common //自定义日志名称
12
13</virtualhost>
4、在Resin中添加虚拟主机,以支持JSP
vi /usr/local/resin/conf/resin.conf
##在文档中查找 ,然后在其后加入如下内容:
1<host id="www.yesgo.loc">
2<app-dir>/home/www</app-dir> //指定该站点的根目录
3
4<classpath compile="true" id="classes" source="classes"> //指定class文件目录
5
6</classpath></host>
『注意』:
按照上面地设置,你放置JavaBean的目录就是站点根目录下的classes目录,不可以死记硬背/WEB-INFO/classes,关键要明白其中的道理,其实你设置什么都可以的,例如Amao,Agou啦,呵呵。
『强烈建议』:设置classes目录的权限,否则客户端可以浏览和下载你的组件
chmod 701 /home/www/classes //设置classes目录的权限,避免非法获取
4 测试Resin
##启动Resin
shell>resin start
##重新启动Apache,因为刚才修改了httpd.conf,需要重启才生效
shell>apache restart
#创建文件
touch /home/www/index.jsp
chown –R www /home/www/index.jsp
chmod 701 /home/www/index.jsp
##编辑源文件
vi /home/www/index.jsp
##源代码只有一句:
1+1=``` =1+1
1
2
3
4##测试该程序
5
6
7
8lynx http://www.yesgo.loc/
9
10
11
12##输出结果应该是:1+1=2
13
14__________________
15
16闲聊空间:
17
18http://www.wonyen.net/bbs/mboard.asp
19
20
21
22
23* * *
24
25
26_由 dsj 在 03-28-2003 10:46 发表:_
27
28
29
30****
31
32
33
34
35
361 创建启动脚本
37
38##创建Resin服务,道理跟创建MySQL和Apache服务是一样的,不过这里要设置相关环境变量。
39
40
41
42##创建脚本文件
43
44
45
46touch /etc/rc.d/init.d/resin
47
48
49
50##更改文件权限
51
52
53
54chmod 701 /etc/rc.d/init.d/resin
55
56
57
58##连接到相关启动级别
59
60
61
62ln –s /etc/rc.d/init.d/resin /etc/rc.d/rc5.d/S70resin
63
64
65
66##编辑启动脚本
67
68
69
70vi /etc/rc.d/init.d/resin
71
72
73
74
75
76
77
78##文件内容如下:
79
80
81
82
83
84
85
86#!/bin/bash
87
88
89
90#Set environment parameter:
91
92
93
94
95
96
97
98JAVA_HOME=/usr/local/jvm
99
100
101
102
103
104
105
106RESIN_HOME=/usr/local/resin
107
108
109
110
111
112
113
114CLASS_HOME=/usr/local/lib/java
115
116
117
118
119
120
121
122CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/jre/lib:$RESIN_HOME/lib:$CLASS_HOME/drivers/mm.mysql-2.0.4-bin.jar.zip:$CLASS_HOME/jaf/activation.jar:$CLASS_HOME/javamail/mail.jar: $CLASS_HOME/javamail /smtp.jar: $CLASS_HOME/javamail /pop3.jar: $CLASS_HOME/javamail/mailapi.jar: $CLASS_HOME/javamail/imap.jar
123
124
125
126
127
128
129
130PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local:/usr/local/bin:/usr/local/jvm/bin:/usr/local/jvm/jre/bin:/usr/local/mysql/bin:/usr/bin/X11:/usr/X11R6/bin
131
132
133
134
135
136
137
138export JAVA_HOME RESIN_HOME CLASS_HOME CLASSPATH PATH
139
140
141
142
143
144
145
146#Start resin web server
147
148
149
150exec /usr/local/resin/httpd.sh start
151
152
153
154\--------------------------------------------------------------------------------------------
155
156
157
158Step 2 PhpMyAdmin install
159
160##phpMyAdmin是我最喜欢的MySQL客户端工具。我也使用过其他的客户端,包括win32的DBTools、mysqlfront等和基于web的其他工具,然而,我最后发现phpMyAdmin仍然是不可替代的。它基于web的通用性、免安装、多用户、平台无关性、稳定性、开放源码和极快的升级速度实在是太好了。况且本文档主要探讨的是服务器的配置,所以,我这里仍然只介绍phpMyAdmin。
161
162
163
1641 配置DNS
165
166vi /var/named/yesgo.loc
167
168
169
170# 追加如下一行,当然你可以自定义其他别名或主机名
171
172
173
174mysql IN CNAME ns.yesgo.loc.
175
176
177
178
179
180
181
182/etc/rc.d/init.d/named restart //重启DNS服务
183
184
185
186nslookup //测试是否解析成功
187
188
189
190
191
192
193
1942 建立FTP
195
196##在安装MySQL的时候,我们已经建立了一个叫做mysql的帐号,如果你还没有建立,可以按照下面的语句建立:
197
198
199
200useradd mysq –s /dev/null –g ftpchroot
201
202
203
204passwd mysql
205
206
207
208
209
210
211
2123 安装phpMyAdmin
213
214tar xvzf /home/src/phpMy*
215
216
217
218cp /home/src/phpMyAdmin/* /home/mysql
219
220
221
222chown –R mysql /home/mysql
223
224
225
226chown –R mysql /home/mysql/*
227
228
229
230chmod 701 /home/mysql
231
232
233
234chmod 701 /home/mysql/*
235
236
237
238
239
240
241
2424 添加虚拟主机
243
244vi /usr/local/apache/conf/httpd.conf
ServerAdmin [email protected]
DocumentRoot /home/mysql
ServerName mysql.yesgo.loc
ErrorLog logs/mysql.yesgo.loc-error_log
CustomLog logs/mysql.yesgo.loc-access_log common
##添加MySQL用户
##使用身份验证功能,phpMyAdmin需要一个启动用户,这个用户对mysql的相关表具有查询权限,具体定义如下:
shell>mysql -p
mysql>GRANT USAGE ON mysql.* TO '
1<stduser>'@'localhost' IDENTIFIED BY '<stdpass>';
2
3mysql>GRANT SELECT (Host, User, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv) ON mysql.user TO '<stduser>'@'localhost';
4
5mysql>GRANT SELECT ON mysql.db TO '<stduser>'@'localhost';
6
7mysql>GRANT SELECT (Host, Db, User, Table_name, Table_priv, Column_priv) ON mysql.tables_priv TO '<stduser>'@'localhost';
8
9
10
11
12
13
14
15##修改配置文件
16
17
18
19vi config.inc.php
20
21
22
23
24
25
26
27$cfgServers[1]['host'] = 'localhost'; // 主机名
28
29
30
31$cfgServers[1]['port'] = '3306'; // 默认端口
32
33
34
35$cfgServers[1]['socket'] = ''; // 使用的socket路径
36
37
38
39$cfgServers[1]['connect_type'] = 'tcp'; //使用tcp还是 socket方式来连接
40
41
42
43$cfgServers[1]['stduser'] = ' '; // 标准用户帐号名称
44
45
46
47$cfgServers[1]['stdpass'] = ' '; // 标准帐号的密码
48
49
50
51$cfgServers[1]['auth_type'] = 'http'; //指定验证方式为config, http 还是 cookie,这是2.2.3版本的一个变化,比较安全的方式是http验证
52
53
54
55$cfgServers[1]['user'] = 'root'; // MySQL 帐号
56
57
58
59$cfgServers[1]['password'] = ' '; // 只有使用config验证方式的时候才需要填写
60
61
62
63$cfgServers[1]['only_db'] = ''; // 如果你在这里指定了一个数据库,那么登陆后系统只列出这个数据库在左侧
64
65
66
67
68
69
70
716 测试phpMyAdmin
72
73apache restart
74
75
76
77lynx http://mysql.yesgo.loc //建议使用客户端浏览器测试
78
79
80
81\------------------------------------------------------------------------------------------
82
83Step 16 Server Test
84
85## 为什么不使用 1+1=```
86=1+1
87```或者```
88out.print(“Hello World!”);
89```这样的例子呢? 因为这样的例子只能测试Apache和Resin是否能够协同工作,而不能测试数据库连接、JDBC2.0是否支持,中文问题是否存在等等。下面给出四个例子,第一个例子可以测试上述的所有问题;第二个例子告诉你如何使用Resin的连接池;第三个例子告诉你如何调用组件,如何实现数据层和处理层的分离;第四个例子用来测试PHP。
90
91
92
93
94
95
96
97例一:使用连接串连接数据库
98
99
100
101
102
1031 创建数据库
104
105## 数据库脚本如下,可存储为.sql文件,然后利用phpMyAdmin生成数据库
106
107
108
109## 注意,后面的例子也将沿用该数据库。
110
111
112
113create database yesgo
114
115
116
117use yesgo;
118
119
120
121
122
123
124
125create table prov
126
127
128
129(
130
131
132
133prov_id tinyint(2) not null primary key,
134
135
136
137prov_name char(6) not null
138
139
140
141);
142
143
144
145
146
147
148
149insert into prov values ('01','安徽');
150
151
152
153insert into prov values ('02','北京');
154
155
156
157insert into prov values ('03','重庆');
158
159
160
161insert into prov values ('04','福建');
162
163
164
165insert into prov values ('05','甘肃');
166
167
168
169insert into prov values ('06','广东');
170
171
172
173insert into prov values ('07','广西');
174
175
176
177insert into prov values ('08','贵州');
178
179
180
181insert into prov values ('09','海南');
182
183
184
185insert into prov values ('10','河北');
186
187
188
189insert into prov values ('11','黑龙江');
190
191
192
193insert into prov values ('12','河南');
194
195
196
197insert into prov values ('13','湖北');
198
199
200
201insert into prov values ('14','湖南');
202
203
204
205insert into prov values ('15','内蒙古');
206
207
208
209insert into prov values ('16','江苏');
210
211
212
213insert into prov values ('17','江西');
214
215
216
217insert into prov values ('18','吉林');
218
219
220
221insert into prov values ('19','辽宁');
222
223
224
225insert into prov values ('20','宁夏');
226
227
228
229insert into prov values ('21','青海');
230
231
232
233insert into prov values ('22','山西');
234
235
236
237insert into prov values ('23','陕西');
238
239
240
241insert into prov values ('24','山东');
242
243
244
245insert into prov values ('25','上海');
246
247
248
249insert into prov values ('26','四川');
250
251
252
253insert into prov values ('27','天津');
254
255
256
257insert into prov values ('28','西藏');
258
259
260
261insert into prov values ('29','新疆');
262
263
264
265insert into prov values ('30','云南');
266
267
268
269insert into prov values ('31','浙江');
270
271
272
273insert into prov values ('32','香港');
274
275
276
277insert into prov values ('33','澳门');
278
279
280
281insert into prov values ('34','台湾');
282
283
284
285
286
287
288
2892 为数据库添加帐号
290
291##按如下方式添加的帐户只对yesgo数据库具有权限,而且对它拥有全部权限。但为什么要添加四次呢?主要是host的不同,需要注意的是,MySQL验证是一个连接是否正确,不仅取决于帐号和密码,还要看主机名和数据库名。
292
293
294
295
296
297
298
299mysql –p
300
301
302
303mysql> grant all privileges on yesgo.* to your_user_name@localhost identified by ‘your_password’ with grant option;
304
305
306
307mysql> grant all privileges on yesgo.* to your_user_name@’ns.yesgo.loc’ identified by ‘your_password’ with grant option;
308
309
310
311mysql> grant all privileges on yesgo.* to your_user_name@’192.168.1.2’ identified by ‘your_password’ with grant option;
312
313
314
315mysql> grant all privileges on yesgo.* to your_user_name@’%’ identified by ‘your_password’ with grant option;
316
317
318
319mysql>exit
320
321
322
323
324
325
326
3273 创建JSP源文件
328
329touch /home/www/cnmysql.jsp
330
331
332
333chown –R www /home/www/cnmysql.jsp
334
335
336
337chgrp –r root /home/www/cnmysql.jsp
338
339
340
341chmod 771 /home/www/cnmsql.jsp
342
343
344
345
346
347
348
349vi /home/www/cnmsql.jsp
350
351
352
353## 源代码如下:
354
355
356
357
358
359
360
@ page language="java" import="java.sql.*"
1
2
3
Class.forName ("org.gjt.mm.mysql.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://host_name/db_name","user_name","password");
Statement stmt = conn.createStatement();
ResultSet rs=stmt.executeQuery("select * from prov");
rs.next();
out.print(rs.getString("prov_id")+" "+rs.getString("prov_name")+"<br/>");
rs.next();
out.print(rs.getString("prov_id")+" "+rs.getString("prov_name")+"<br/>");
rs.previous();
out.print(rs.getString("prov_id")+" "+rs.getString("prov_name")+"<br/>");
rs.last();
out.print(rs.getString("prov_id")+" "+rs.getString("prov_name")+"<br/>");
rs.first();
out.print(rs.getString("prov_id")+" "+rs.getString("prov_name")+"<br/>");
rs.close();
stmt.close();
conn.close();
1
2
3
44 测试该程序
5
6lynx http://www.yesgo.loc/cnmysql
7
8
9
10##正确的结果应该是:
11
12
13
14
15
16
17
181 安徽
19
20
21
222 北京
23
24
25
261 安徽
27
2834 台湾
29
30
31
321 安徽
33
34
35
36
37
38
39
40例二:使用连接池连接数据库
41
421 建立数据源
43
44vi /usr/local/resin/conf/resin.conf
45
46
47
48
49
50
51
52<resource-ref>
53<res-ref-name>jdbc/yesgo</res-ref-name> //数据源名称
54
55
56
57<res-type>javax.sql.DataSource</res-type> //数据源类型
58
59
60
61<init-param driver-name="org.gjt.mm.mysql.Driver"></init-param> //数据库驱动
62
63
64
65<init-param url=" jdbc:mysql://localhost/yesgo "></init-param> //连接串
66
67
68
69<init-param user="your_user_name"></init-param> //用户名
70
71
72
73<init-param password="your_password"></init-param> //密码
74
75
76
77<init-param max-connections="20"></init-param> //最大连接数
78
79
80
81<init-param max-idle-time="30"></init-param> //延时时间
82
83
84
85</resource-ref>
86
87
88
89
90
91
92
932 创建JSP源文件
94
95touch /home/www/testpool.jsp
96
97
98
99chown –R www /home/www/testpool.jsp
100
101
102
103chgrp –r root /home/www/testpool.jsp
104
105
106
107chmod 771 /home/www/testpool.jsp
108
109
110
111
112
113
114
115vi /home/www/testpool.jsp
116
117
118
119## 源代码如下:
120
121
122
123
124
125
126
@ page language="java" import="java.sql.,com.caucho.sql.;"
1
2
3
DBPool pool=new DBPool();
Connection conn = pool.getPool("data_source_name ").getConnection();
Statement stmt = conn.createStatement();
ResultSet rs=stmt.executeQuery("select * from prov");
rs.next();
out.print(rs.getString("prov_id")+rs.getString("prov_name")+"<br/>");
rs.next();
out.print(rs.getString("prov_id")+rs.getString("prov_name")+"<br/>");
rs.previous();
out.print(rs.getString("prov_id")+rs.getString("prov_name")+"<br/>");
rs.last();
out.print(rs.getString("prov_id")+" "+rs.getString("prov_name")+"<br/>");
rs.first();
out.print(rs.getString("prov_id")+rs.getString("prov_name")+"<br/>");
rs.close();
stmt.close();
conn.close();
1
2
3
4
5
6
7
83 调试该程序
9
10lynx http://www.yesgo.loc/testpool.jsp
11
12
13
14##处理的结果跟例一是一样的:
15
16
17
18
19
20
21
221 安徽
23
24
25
262 北京
27
28
29
301 安徽
31
3234 台湾
33
34
35
361 安徽
37
38__________________
39
40闲聊空间:
41
42http://www.wonyen.net/bbs/mboard.asp
43
44
45
46
47* * *
48
49
50_由 dsj 在 03-28-2003 11:05 发表:_
51
52
53
54****
55
56
57
58
59
60例三:使用处理层连接数据库
61
62##本例告诉你如何使用组件
63
64
65
66##其实你完全可以写一个bean来处理数据库,而不用象例二那么罗索。只用四条语句就可以取出数据库中的所有数据并显示出来,这样做实现了处理层和逻辑层的彻底分离,由逻辑层发出指令、由处理层去响应相关处理,记录集也不会返回到逻辑层的jsp页面,而由处理层的bean处理,使得代码非常精简,效率也更高。至于如何书写组件不是本文档的重点,下面仅给出一个组件的例子并说明逻辑层的调用方法,你会发现其实逻辑层是个官僚,处理层是下属,呵呵。
67
68
69
70
71
72
73
741 创建处理层组件
75
76下面的组件是我为公司写的数据库处理组件的简化版本,考虑到篇幅和可读性等问题,这里我简化了它的功能(象数据分页、批量更新、获取字段数和字段名称,用set和get提高其扩展性、对其他连库方法的支持等都没有出现在下面的代码中),使之包含所有常用的功能并使之更加清晰和易于理解;其二,我将连库动作加到了构造函数中,这是个优点也是个缺点,优点是简化了连库动作,缺点是降低了通用性,我没有添加设置数据源等方法,从而每当变换一次数据库就需要改写组件中的连接池名称,这在做一个固定项目的时候是可以的,如果你需要set数据源,可以自行添加;
77
78
79
80##使用组件的方法:
81
82
83
84我这里说的是使用bean的通用方法,你建立自己的bean目录可以仿照该例子。在你的站点根目录下建立resin.conf中指定的存放bean的目录,我上面的举例是classes,那你就建立classes目录,那么classes就是你站点的class根目录。然后在下面依次建立com\gledecity\yesgo\sql,注意它们之间是父子关系,不是同级文件夹,然后将下面即将建立的DBBridge.java放到”站点根目录\classes\com\gledecity\yesgo\sql”目录下,然后将该文件上传到服务器端即可。上面的步骤在微软平台上使用UltraDev之类的开发工具即可完成,当然手工也可以。
85
86
87
88
89
90
91
92源文件如下:
93
94
95
96
97
98
99
100//------------------------------------------------------------------------------
101
102
103
104// File: DBBridge.java
105
106
107
108// Copyright (c) 2001-2002 Mr.Fengjun Zhao. All Rights Reserved.
109
110
111
112// Author: 赵凤君@06/18/01
113
114
115
116// Last Revision: 赵凤君@01/18/2002
117
118
119
120// Description: 数据库接口类。一个统一的数据库接口,实现了逻辑层和数据层的彻底分离,封装了常用的数据库操作。主要功能是:连接数据库、执行SQL语句、数据库取值操作、数据分页、清除数据、关闭数据库等。
121
122
123
124// Version:简化版1.0
125
126
127
128//------------------------------------------------------------------------------
129
130
131
132
133
134
135
136//指定包目录
137
138
139
140package com.gledecity.yesgo.sql;
141
142
143
144
145
146
147
148//导入包
149
150
151
152import java.sql.* ;
153
154
155
156import com.caucho.sql.*;
157
158
159
160
161
162
163
164public class DBBridge {
165
166
167
168//声明属性
169
170
171
172private DBPool pool ;
173
174
175
176private Connection conn ;
177
178
179
180private ResultSet rs ;
181
182
183
184private Statement stmt ;
185
186
187
188
189
190
191
192
193
194
195
196// -------------------------------------- 构造函数---------------------------------
197
198
199
200public DBBridge() {
201
202
203
204pool=null ;
205
206
207
208conn=null ;
209
210
211
212rs=null ;
213
214
215
216stmt=null ;
217
218
219
220try{open();}
221
222
223
224catch(java.sql.SQLException ex){ex.toString();}
225
226
227
228}
229
230
231
232// ------------------------------------------------------------------------------------
233
234
235
236
237
238
239
240//连接数据库的方法
241
242
243
244public void open()
245
246
247
248throws SQLException {
249
250
251
252if( conn!=null && !conn.isClosed() )
253
254
255
256throw new SQLException( "The connection has been established already." ) ;
257
258
259
260clear () ;</stduser></stduser></stduser></stdpass></stduser>