关键词:nginx tomcat 多虚拟主?集群 负蝲均衡
虽然夜深了,但是q是解决了这个困扰我一个晚上的问题Q记录下来备查?/p>
接着我前不久写的q一来的:Linux下nginx和tomcat的整?a >http://hi.baidu.com/gnaiqeh/blog/item/2f43dac9e98d781a7f3e6fc7.html
举个例子Q现在是q样的情况:我现在有a、b、c三个不同的应用,每个Tomcat集群机(一?个)上都建立了这三个应用的虚拟主机,我要把这三个应用用一个nginx来负载均衡?/p>
中间试了很多次Q失败的q程׃多说了,直接说最l解决的办法?/p>
首先要把3个虚拟主机的域名Qa.gnaiqeh.cn、b.gnaiqeh.cn、c.gnaiqeh.cnQ都指向到nginx机的公网ip上?/p>
然后q是修改nginx的配|文件nginx.confQ?/p>
配置文g中upstreamD还是保持不变,依旧?个tomcat集群机的地址及负载因子:
upstream gnaiqeh {
server 192.168.0.11:8080 weight=1;
server 192.168.0.12:8080 weight=1;
server 192.168.0.13:8080 weight=1;
}
因ؓ?个应用,所以应该有3个serverD,q里只写其中一个,其他两个只需要修改一下server_name卛_Q?br />
server {
listen 80;
server_name a.gnaiqeh.cn; #另外两个是b.gnaiqeh.cn、c.gnaiqeh.cn
location / {
root html;
index index.jsp index.html index.htm;
proxy_redirect off;
proxy_set_header Host $host; #q一句至关重?/font>
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://gnaiqeh;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
proxy_set_header是nginx的http代理模块中的一个指令?/p>
在nginx中的默认proxy是只能对后面real server做端口{发的Q而不能做域名转发Q即默认的是Q?/p>
proxy_set_header Host $proxy_host;
我们要通过域名转发必L为:
proxy_set_header Host $host;
最后修改tomcat的配|文件server.xmlQ主要是配置虚拟LQ?br />
<Host name="a.gnaiqeh.cn" appBase="webapps-a"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="/mnt/a" reloadable="true" crossContext="true"/>
</Host>
<Host name="b.gnaiqeh.cn" appBase="webapps-b"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="/mnt/b" reloadable="true" crossContext="true"/>
</Host>
<Host name="c.gnaiqeh.cn" appBase="webapps-c"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="/mnt/c" reloadable="true" crossContext="true"/>
</Host>
3台集机均改成上面一L?/p>
然后重启nginxQ重启tomcatQ测试访问三个域名都通过Q打完收工?/p>
本文分为四个部分。第一部分阐述“什么是内网架设FTP”的问题。第二部分分析FTP协议的原理。第三部分阐q在内网中架设FTP服务器时会遇到的问题以及解决ҎQ外网的用戯够访问位于内|的FTP服务器。第四部分ؓȝ。徏议读者能够将q五部分全部d。如果只惌一个快速安装指南,那么请阅ȝ一部分和第四部分?/p>
本文所使用的FTP服务器ؓproftpd?/p>
设想下面的这U环境:几台计算机组成一个局域网Q该局域网中拥有一台DHCP服务器负责ؓ局域网中每台计机分配IP地址。其中有一台计机Q或|络讑֤Q作为网养I可以与DHCP服务器ؓ同一台设备)Q网关通过拨号或其他方式连接到InternetQ获取一个真实IP地址。局域网内的计算机通过|关的{发来实现与Internet的连接。我们定义该局域网内部为内|,相对圎ͼ定义Internet为外|?/p>
举个例子Q假设我们拥有两台计机A、B和一个拥有拨号和DHCP功能的网关G。各自的|络配置如下Q?/p>
|关G: 局域网IP地址Q?92.168.0.1Q由|关g指定Q? 局域网子网掩码Q?55.255.255.0Q由|关g指定Q? q域|IP地址Q?2.34.56.78Q拨号之后获得) 计算机A: 局域网IP地址Q?92.168.0.10Q通过|关的DHCP功能获得Q? 局域网子网掩码Q?55.255.255.0Q通过|关的DHCP功能获得Q? |关Q?92.168.0.1Q通过|关的DHCP功能获得Q? 计算机B: 局域网IP地址Q?92.168.0.11Q通过|关的DHCP功能获得Q? 局域网子网掩码Q?55.255.255.0Q通过|关的DHCP功能获得Q? |关Q?92.168.0.1Q通过|关的DHCP功能获得Q?
q样Q从A、B发出的所有网l请求都会被发送到|关GQ?92.168.0.1Q,|关再将q些h变换之后通过12.34.56.78发送到InternetQ以实现A、B与Internet的连接?/p>
需要提醒一点的是,你的|关必须拥有端口映射QPort MappingQ的功能Q也U{发,ForwardingQ,q是下文架设服务器的先决条g。所谓端口映功能,是指网兌够将从外|发送到|关的指定端口的包{发到内网中指定的IP地址上。D个例子,假如我们定义了如下一条规则:端?1映射?92.168.0.10上。那?/p>
从外|发送到|关的一个包Q其信息为源地址Q?00.12.34.56:7890Q目的地址Q?2.34.56.78:21
那么|关修改该包的目的地址Q结果ؓ源地址Q?00.12.34.56:7890Q目的地址Q?92.168.0.10:21
q将该包发送到局域网中的192.168.0.10上。这样对?92.168.0.10来说Q这个包仿佛是从Internet上直接发l自q一栗?/p>
一般我们说QFTP协议使用TCP端口21。实际上q这q不准确QFTP协议使用TCP?1端口传送的是控制命令,同时使用随机端口来传送数据。也是_下蝲一个文件至需要在客户端与服务器之间徏立两个TCPq接Q这两个q接分别UCؓ控制q接和数据连接?/p>
控制q接L由客Ldq接服务器的21端口来徏立的Q而数据连接则不一定。根据数据连接的建立方式的不同,FTP传送方式可分ؓd方式和被动方式两U。主动方式下Q服务器q接客户端的某个端口以徏立数据连接;被动方式下,客户端连接服务器的某个端口来建立数据q接?/p>
d方式的连接过E如下:
被动方式的连接过E如下:
举个实际的例子来说明。下文中以S:开头的为服务器q回的信息,C:开头的为客L命o。主动方式:
S: 220 ProFTPD 1.2.10 ServerQ控制连接徏立,服务器返回欢q信息) C: USER fooQ发送用户名Q? S: 331 Password required for foo. C: PASS mypassword Q发送密码) S: 230 User foo logged in. Q登录成功) C: SYST Q获取服务器cdQ? S: 215 UNIX Type: L8 C: PWD Q获取当前目录) S: 257 "/" is current directory. C: PORT 192,168,0,11,10,171 Q客L监听端口2731QƈIP地址和端?731通过PORT命o通知服务器?731?0*256+171Q? S: 200 PORT command successful C: TYPE A Q设|传输方式ؓ文本方式Q? S: 200 Type set to A C: LIST Q发取文件列表的命oQ? S: 150 Opening ASCII mode data connection for file list Q服务器试q接客户端的2731端口以徏立数据连接) Q通过数据q接发送文件列?#8230;…Q? S: 226 Transfer complete. Q文件列表传送完毕,数据q接断开Q? C: QUIT Q退出命令)
被动方式Q?/p>
S: 220 ProFTPD 1.2.10 ServerQ控制连接徏立,服务器返回欢q信息) C: USER fooQ发送用户名Q? S: 331 Password required for foo. C: PASS mypassword Q发送密码) S: 230 User foo logged in. Q登录成功) C: SYST Q获取服务器cdQ? S: 215 UNIX Type: L8 C: PWD Q获取当前目录) S: 257 "/" is current directory. C: PASV Q通知服务器用被动方式) S: 227 Entering Passive Mode (192,168,0,10,132,29). Q服务器监听端口33821QƈIP地址和端?3821通过PORT命o通知服务器?3821?32*256+29Q? C: TYPE A Q设|传输方式ؓ文本方式Q? S: 200 Type set to A C: LIST Q发取文件列表的命oQ? S: 150 Opening ASCII mode data connection for file list Q客L试q接服务器的33821端口以徏立数据连接) Q通过数据q接发送文件列?#8230;…Q? S: 226 Transfer complete. Q文件列表传送完毕,数据q接断开Q? C: QUIT Q退出命令)
在这里我们沿用第一部分的网l实例,q假设FTP服务器架讑֜计算机AQ?92.168.0.10Q上?/p>
׃控制q接的服务器端端口ؓ21Q因此我们只需要在|关的端口映上d一条规则,?1端口映射?92.168.0.10卛_?/p>
在主动方式下Q数据连接由服务器发P相当于内|的服务器主动去q接外网的客LQ这U连接可以穿q网x常徏立,因此不需要做MҎ讄卛_实现。问题是被动q接。由于被动方式下服务器会监听随机端口q要将自己的IP地址和端口号通知客户端,q样׃生了以下两个问题Q?a) 服务器仅知道自己的内|IP地址Q?92.168.0.10Q,它会这个IP地址通知l外|的客户端,而客L从外|是无法q接q个内网IP地址的(客户端不知道该如何\由)Q?b) 服务器需要监听随机端口,范围?024-65535Q出于安全v见,也考虑到可能存在其它的服务也用该范围内的端口Q因此不可能在网关上这些端口全部映给192.168.0.10?/p>
׃以上的问题的存在Q我们经常可以看到连接服务器时下方的q接日志停在
150 Opening ASCII mode data connection for file list
处迟q不动,q就是因动数据连接无法徏立?/p>
Ҏproftpd提供了如下的解决Ҏ?/p>
MasqueradeAddress 12.34.56.78 Q指定ؓ|关的外|地址Q?如果|关的外|地址不固定(例如通过拨号获取IP的情况)Q那么你需要ؓ你的|关甌一个动态域名,q用MasqueradeAddress命o域名指定给服务器?
MasqueradeAddress myftpserver.vicp.net
PassivePorts 60000 65535q样服务器在被动方式下将仅?0000-65535之间的端口,而不是原来的1024-65535。然后在|关上添加规则,?0000-65535的所有端口映到192.168.0.10上?
q样Q外|的客户端就可以正常讉KFTP服务器了?/p>
但是上面的方法ƈ不是十全十美的。我们用MasqueradeAddress命o强制FTP通知|关的IP地址Q这对于客户端位于外|的情况下是正确的,但是当客L位于内网Ӟ客户端可能会无法解析|关的IP地址Q导致无法徏立数据连接?/p>
内网架设FTP服务器的ҎQ?/p>
MasqueradeAddress myftpserver.vicp.net?
MasqueradeAddress 12.34.56.78然后通过PassivePorts命o来限制被动方式下监听的端口的范围Q例?
PassivePorts 60000 65535
Centos5.3+ProFTPD1.3.2+Mysql5.1配置FTP服务
Allen Jelver 2009-12-17
废话说了,是利用Mysql做FTP校验Q即通过数据库管理FTP用户信息Q检验登录等......,q入正题.>>
一?span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> 安装Mysql软g?/span>(64?/span>)Q?/span>
MySQL-server-community-5.1.38-0.rhel5.x86_64.rpm MySQL-shared-community-5.1.38-0.rhel5.x86_64.rpm MySQL-client-community-5.1.38-0.rhel5.x86_64.rpm MySQL-devel-community-5.1.38-0.rhel5.x86_64.rpm
资源包可以在http://ftp.up.ac.za/pub/windows/MySQL/Downloads/MySQL-5.1/下蝲Q本教程对Mysql的rpm方式安装省略Q需要注意的是devel包是必须安装的,只有安装devel包后才能生成/usr/include/mysql,32位机器安装的lib路径要注意一下是/usr/lib/mysql卛_Q关于msyql的安装网上很多资料都可以参考?/span>
二?span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> 安装proftpd?/span>
下蝲proftpd-1.3.2.tar.gz
wget http://ftp.ntu.edu.tw/proftpd/distrib/source/proftpd-1.3.2.tar.gz
cd /usr/local #q是我放|?/span>proftpd-1.3.2.tar.gz的目?/span> tar zxvf proftpd-1.3.2.tar.gz cd proftpd-1.3.2 ./configure --with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql --with-includes=/usr/include/mysql --with-libraries=/usr/lib64/mysql make make install
首先需要声明的是以下的配置会跟你的安装目录有关Q安装成功后则会生成/usr/local/etc/目录Q其中包含核心配|文?/span>proftpd.confQ同时在/usr/local/sbin下有proftpd可执行文Ӟ通常用来启动服务用的Q其?/span>pid文g文g是自启动脚本中创建的Q这部分在后面会讲到。对以上两个目录做查看,如下图所C:
说明Q若?/span>make?/span>make install中有错则需要注意是否是gcc斚w的问题导致?/span>
三?span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> 配置Mysql认证
认证q部分主要是配置proftpd.conf文gQ在修改配置文g之前最好养成先备䆾一个文件的习惯Q否则修改出错后没有办法扑ֈ原来的版本。ƈ在proftpd.conf中加入以下内容,
1Q?/span>修改l信?/span>
# Set the user and group under which the server will run. User nobody Group nogroup Group对应的nogroup修改为如下的nobody # Set the user and group under which the server will run. User nobody Group nobody
2Q?/span>加入数据校验配置
# 屏蔽服务器版本信? # 数据库连接的信息Qftpusers是数据库名, localhost是主机名Q?306是端口号Qroot是连接数据库的用户名Q?23456是密码?/span> SQLConnectInfo ftpusers@localhost:3306 root 123456 # 数据的认证方?/span> # Backend表示用户认证方式为MySQL数据库的认证方式 SQLAuthTypes Backend Plaintext #指定用来做用戯证的表的有关信息?"users"?grps"是数据表名字Q其后ؓ字段信息) SQLUserInfo users userid passwd uid gid home shell SQLGroupInfo grps grpname gid members #讄如果shell为空时允许用L录: RequireValidShell off #数据?/span>的鉴?/span> SQLAuthenticate users groups usersetfast groupsetfast #如果home目录不存在,?a target="_blank">pȝ会ؓҎ它的homeҎZ个目录: #注意SQLHomedirOnDemand已经?.3.2以后的版本中改名?/span>CreateHome CreateHome on #讄pȝq行日志和文件传输日?/span> SystemLog /var/log/proftpd.syslog TransferLog /var/log/proftpd.transferlog
ServerIdent off
# Plaintext表示明文认证方式Q排在最前面的ؓ最先用的方式
3Q?/span>建立相应?a target="_blank">pȝ用户
在本例中Q只整个FTP服务只提供一个有效的pȝ用户ftpuser和组ftpgrpQ当然你也可以设|多?a target="_blank">pȝ用户。但Z安全的考虑Q我只设一个,用他来启动FTP daemonQƈ把所有的FTP用户映射q这个用戗?/p>
先徏?/span>ftpgrpl:
groupadd -g 5500 -r ftpgrp //增加一个组ID?/span>5500?/span>ftpgrpl?/span>
建立ftpuser用户Q?br />
useradd -u 5501 -g 5500 -d /home/ftp -s /bin/bash -r ftpuser
?/span>ftpuser建立homeQ把所有的FTP user zdI间全放在此目录下:
mkdir /home/ftp chown ftpuser /home/ftp chgrp ftpgrp /home/ftp
4Q?/span>初始化数据库
1Q创建数据库和表
create database ftpusers;
use ftpusers;
建立一个用戯USERSQ这个表是必ȝQ?/span>
create table USERS (
userid TEXT NOT NULL,
passwd TEXT NOT NULL,
uid INT NOT NULL,
gid INT NOT NULL,
home TEXT,
shell TEXT
);
此表是ؓ了用戯证所需要的Q其中userid、passwd是必不可的Quserid是用做FTP服务的用户名Qpasswd是指此用L密码Quid?a target="_blank">pȝ用户的IDQ也是所映射?a target="_blank">pȝ用户Qgid是所?a target="_blank">pȝl的IDQhome是该用户所在的HOME目录Qshell可以用户指定相应的shell。当然你可以建立更多的字D,例如Q用来记录用L录次数的countQ或者是日期的dateQ如果你寚w|熟悉了之后Q你可以Ҏ自己的喜Ƣ添加更多的功能?/p>
另外Q若需要对l成员管理之cȝ功能则需要添加GRPS表:
grpname TEXT NOT NULL,
gid SMALLINT NOT NULL,
members TEXT NOT NULL
);
其中grpname是组的名Uͼgid?a target="_blank">pȝl的IDQmembers是组的成员。注意:多成员,他们之间要用逗号隔开Q不能用空根{?/span>
2Q增加用?在数据库USERS表和GRPS表中插入数据Q?/span>
INSERT INTO USERS (userid, passwd, uid, gid, home, shell) values ('allen', '123456', '5501', '5500', '/home/ftp/allen', "/usr/local/test.sh");
INSERT INTO USERS (userid, passwd, uid, gid, home, shell) values ('kitty', '222222', '5502', '5500', '/home/ftp/kitty', "/usr/local/test2.sh");
INSERT INTO GRPS (grpname,gid,members) values ('ftpgrp','5500','allen,kitty');
flush privileges; //h数据?/span>
四?span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> 配置自启动服?/span>
从编译安装\径中拯proftpd.init.d文g?/span>/etc/rc.d/init.d/中,q命名?/span>proftpdQ授予可执行权限后,通过chkconfig --add命o其加ؓ自启动服务即可,具体操作如下Q?/span>
cp /usr/local/proftpd-1.3.2/contrib/dist/rpm/proftpd.init.d /etc/rc.d/init.d/ cd /etc/rc.d/init.d mv proftpd.init.d proftpd chmod +x proftpd #加入为服?/span> chkconfig --add proftpd chkconfig --level 3 proftpd on #q样Q就可以分别通过以下方式来完成启动、停止、重?/span>Proftpd的工作了
service profptd start
service proftpd stop
service proftpd restart
常用指oQ?/span>
pgrep proftpd 注:查看服务器是不是启动h了;如果没有q程Q说明失败;
pkill proftpd 注:杀?/span>proftpd的进E;也就是关掉服务器Q?/span>
查看proftpd日志Q?/span>tail -f /var/log/proftpd.syslog
查看proftpd传输文g日志Q?/span>tail -f /var/log/proftpd.transferlog
五?span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> 配置盘限额
暂时未做Q以后更?br />
后记Q?/strong>
很多资料都是来参考网l上的资料整理的Q配|环境测试通过Q所以本文章可以随意转蝲,不过最好也能够标注原帖出处:Q?br />
主要参考:
http://blog.ixpub.net/html/92/10996892-2512.html
http://hi.baidu.com/fei33352/blog/item/73acf881b0972bddbc3e1ed2.html