Rootop 服务器运维与web架构

2015-01-21
发表者 Venus
apache反向代理、负载均衡及会话保持已关闭评论

apache反向代理、负载均衡及会话保持

apache的反向代理及负载均衡效率以及配置过程都比nginx麻烦。在这研究apache的负载均衡只是为了对比其它软件的优缺点。
测试过程如下:

查看是否安装proxy模块:
[root@localhost ~]# httpd -M | grep proxy
httpd: Could not reliably determine the server’s fully qualified domain name, using localhost.localdomain for ServerName
Syntax OK
proxy_module (shared)
proxy_balancer_module (shared)
proxy_ftp_module (shared)
proxy_http_module (shared)
proxy_ajp_module (shared)
proxy_connect_module (shared)

查看是否已经加载proxy模块:
[root@localhost ~]# cat /etc/httpd/conf/httpd.conf | grep proxy | grep -v “^#”
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so

编辑httpd.conf配置文件,添加:

#关闭正向代理
ProxyRequests Off

#添加响应头

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED

#负载均衡
<Proxy balancer://cluster1>
BalancerMember http://192.168.0.153:80 loadfactor=3 route=www1
BalancerMember http://192.168.0.154:80 loadfactor=1 route=www2
ProxySet lbmethod=byrequests stickysession=ROUTEID
</Proxy>

#对监控页面不传到后端服务器
ProxyPass /balancer-manager !

ProxyPass / balancer://cluster1/ nofailover=On
ProxyPassReverse / balancer://cluster1/

#设置监控页
<Location /balancer-manager>
SetHandler balancer-manager
Order Deny,Allow
Allow from all
</Location>

loadfactor 参数:
值越高,响应的服务越多,取值在1到100之间

lbmethod 参数:
lbmethod=byrequests 按请求次数均衡(默认)
lbmethod=bytraffic      按流量均衡
lbmethod=bybusyness 按繁忙程度均衡(总是分配给活跃请求数最少的服务器)

会话保持功能:

route= 设置服务器id
stickysession=ROUTEID 使用服务器ID进行会话保持

apache英文手册,中文版中没有会话保持举例:https://www.rootop.org/ApacheManual/Apache2.2_en_US/mod/mod_proxy_balancer.html

重启apache,测试。

可以看到第二张图中是带着负载均衡给的cookie值去访问服务器,实现会话保持。

PS:
打开页面时,提示服务器500错误,查看日志:
[warn] proxy: No protocol handler was valid for the URL /public/js/jquery.js. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.
原因是ProxyPass / balancer://cluster1/ cluster1后面有个斜杠,而不是”balancer://cluster1″
跟网上大部分说的模块加载没关系。

2015-01-20
发表者 Venus
Apache中Order Allow Deny详解已关闭评论

Apache中Order Allow Deny详解

转自:http://www.cnblogs.com/top5/archive/2009/09/22/1571709.html

本文经原文已删掉部分内容。

Allow和Deny可以用于apache的conf文件或者.htaccess文件中(配合Directory, Location, Files等),用来控制目录和文件的访问授权。

所以,最常用的是:
Order Deny,Allow
Allow from All

注意“Deny,Allow”中间只有一个逗号,也只能有一个逗号,有空格都会出错;单词的大小写不限。上面设定的含义是先设定“先检查禁止设定,没有禁止的全部允许”,而第二句没有Deny,也就是没有禁止访问的设定,直接就是允许所有访问了。这个主要是用来确保或者覆盖上级目录的设置,开放所有内容的访问权。

按照上面的解释,下面的设定是无条件禁止访问:
Order Allow,Deny
Deny from All

如果要禁止部分内容的访问,其他的全部开放:
Order Deny,Allow
Deny from ip1 ip2
或者
Order Allow,Deny
Allow from all
Deny from ip1 ip2

apache会按照order决定最后使用哪一条规则,比如上面的第二种方式,虽然第二句allow允许了访问,但由于在order中allow不是最后规则,因此还需要看有没有deny规则,于是到了第三句,符合ip1和ip2的访问就被禁止了。注意,order决定的“最后”规则非常重要,下面是两个错误的例子和改正方式:

Order Deny,Allow
Allow from all
Deny from domain.org
错误:想禁止来自domain.org的访问,但是deny不是最后规则,apache在处理到第二句allow的时候就已经匹配成功,根本就不会去看第三句。
解决方法:Order Allow,Deny,后面两句不动,即可。

Order Allow,Deny
Allow from ip1
Deny from all
错误:想只允许来自ip1的访问,但是,虽然第二句中设定了allow规则,由于order中deny在后,所以会以第三句deny为准,而第三句的范围中又明显包含了ip1(all include ip1),所以所有的访问都被禁止了。
解决方法一:直接去掉第三句。
解决方法二:
Order Deny,Allow
Deny from all
Allow from ip1

 

下面是测试过的例子:
——————————–
Order deny,allow
allow from all
deny from 219.204.253.8
#全部都可以通行
——————————-
Order deny,allow
deny from 219.204.253.8
allow from all
#全部都可以通行
——————————-
Order allow,deny
deny from 219.204.253.8
allow from all
#只有219.204.253.8不能通行
——————————-
Order allow,deny
allow from all
deny from 219.204.253.8
#只有219.204.253.8不能通行
——————————-
——————————-
Order allow,deny
deny from all
allow from 219.204.253.8
#全部都不能通行
——————————-
Order allow,deny
allow from 219.204.253.8
deny from all
#全部都不能通行
——————————-
Order deny,allow
allow from 219.204.253.8
deny from all
#只允许219.204.253.8通行
——————————-
Order deny,allow
deny from all
allow from 219.204.253.8
#只允许219.204.253.8通行
——————————-
——————————–
Order deny,allow
#全部都可以通行(默认的)
——————————-
Order allow,deny
#全部都不能通行(默认的)
——————————-
Order allow,deny
deny from all
#全部都不能通行
——————————-
Order deny,allow
deny from all
#全部都不能通行
——————————-
对于上面两种情况,如果换成allow from all,则全部都可以通行!
——————————-
Order deny,allow
deny from 219.204.253.8
#只有219.204.253.8不能通行
——————————-
Order allow,deny
deny from 219.204.253.8
#全部都不能通行
——————————-
Order allow,deny
allow from 219.204.253.8
#只允许219.204.253.8通行
——————————-
Order deny,allow
allow from 219.204.253.8
#全部都可以通行
——————————-
——————————-
order deny,allow
allow from 218.20.253.2
deny from 218.20
#代表拒绝218.20开头的IP,但允许218.20.253.2通过;而其它非218.20开头的IP也都允许通过。
——————————-
order allow,deny
allow from 218.20.253.2
deny from 218.20
#和上面的差不多,只是掉换的order语句中的allow、deny先后顺序,但最终结果表示全部都拒绝!

影响最终判断结果的只有两点:

1. order语句中allow、deny的先后顺序;

2. allow、deny语句中各自包含的范围。

PS:

1. 修改完配置后要保存并重启Apache服务才能生效;

2. 开头字母不分大小写;

3. allow、deny语句不分先后顺序,谁先谁后不影响最终判断结果;但都会被判断到;

4. order语句中,“allow,deny”之间“有且只有”一个逗号(英文格式的),而且先后顺序很重要;

5. Apache有一条缺省规则,“order allow,deny”本身就默认了拒绝所有的意思,因为deny在allow的后面;同理,“order deny,allow”本身默认的是允许所有;当然,最终判断结果还要综合下面的allow、deny语句中各自所包含的范围;(也就是说order语句后面可以没有allow、deny语句)

6. allow、deny语句中,第二个单词一定是“from”,否则Apache会因错而无法启动,

7. “order allow,deny”代表先判断allow语句再判断deny语句,反之亦然。

判断原则分4步:

1. 首先判断默认的;

2. 然后判断逗号前的;

3. 最后判断逗号后的;

4. 最终按顺序叠加而得出判断结果。

 

下面是测试过的例子:
——————————–
Order deny,allow
allow from all
deny from 219.204.253.8
#全部都可以通行
——————————-
Order deny,allow
deny from 219.204.253.8
allow from all
#全部都可以通行
——————————-
Order allow,deny
deny from 219.204.253.8
allow from all
#只有219.204.253.8不能通行
——————————-
Order allow,deny
allow from all
deny from 219.204.253.8
#只有219.204.253.8不能通行
——————————-
Order allow,deny
deny from all
allow from 219.204.253.8
#全部都不能通行
——————————-
Order allow,deny
allow from 219.204.253.8
deny from all
#全部都不能通行
——————————-
Order deny,allow
allow from 219.204.253.8
deny from all
#只允许219.204.253.8通行
——————————-
Order deny,allow
deny from all
allow from 219.204.253.8
#只允许219.204.253.8通行
——————————-
Order deny,allow
#全部都可以通行(默认的)
——————————-
Order allow,deny
#全部都不能通行(默认的)
——————————-
Order allow,deny
deny from all
#全部都不能通行
——————————-
Order deny,allow
deny from all
#全部都不能通行
——————————-
对于上面两种情况,如果换成allow from all,则全部都可以通行!
——————————-
Order deny,allow
deny from 219.204.253.8
#只有219.204.253.8不能通行
——————————-
Order allow,deny
deny from 219.204.253.8
#全部都不能通行
——————————-
Order allow,deny
allow from 219.204.253.8
#只允许219.204.253.8通行
——————————-
Order deny,allow
allow from 219.204.253.8
#全部都可以通行
——————————-
order deny,allow
allow from 218.20.253.2
deny from 218.20
#代表拒绝218.20开头的IP,但允许218.20.253.2通过;而其它非218.20开头的IP也都允许通过。
——————————-
order allow,deny
allow from 218.20.253.2
deny from 218.20
#和上面的差不多,只是掉换的order语句中的allow、deny先后顺序,但最终结果表示全部都拒绝!

 

 

 

2015-01-15
发表者 Venus
nginx搭建flv和mp4流媒体服务器已关闭评论

nginx搭建flv和mp4流媒体服务器

准备软件:
nginx-1.6.0.tar.gz
yamdi-1.9.tar.gz

yamdi 是渐进式流支持模块,抓取视频资源关键帧实现播放时的随意拖动效果
下载地址:http://ncu.dl.sourceforge.net/project/yamdi/yamdi/1.9/yamdi-1.9.tar.gz

flv视频可以通过http或rtmp方式发布。这里用http方式。

安装nginx及mp4支持模块和flv模块:
nginx支持mp4模块下载地址:http://h264.code-shop.com/download/nginx_mod_h264_streaming-2.2.7.tar.gz
下载后解压。

安装编译环境:

[root@localhost nginx-1.6.0]# yum install -y zlib zlib-devel pcre pcre-devel
[root@localhost nginx-1.6.0]# useradd -s /sbin/nologin www
[root@localhost nginx-1.6.0]# ./configure --prefix=/usr/local/nginx --add-module=../nginx_mod_h264_streaming-2.2.7 --with-http_ssl_module --user=www --group=www --with-http_flv_module --with-http_stub_status_module
[root@localhost nginx-1.6.0]# make && make install

make -f objs/Makefile
make[1]: Entering directory `/root/nginx-1.6.0′
cc -c -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -D_LARGEFILE_SOURCE -DBUILDING_NGINX -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs -I src/http -I src/http/modules -I src/mail \
-o objs/addon/src/ngx_http_h264_streaming_module.o \
../nginx_mod_h264_streaming-2.2.7/src/ngx_http_h264_streaming_module.c
In file included from ../nginx_mod_h264_streaming-2.2.7/src/ngx_http_h264_streaming_module.c:2:
../nginx_mod_h264_streaming-2.2.7/src/ngx_http_streaming_module.c: In function ‘ngx_streaming_handler’:
../nginx_mod_h264_streaming-2.2.7/src/ngx_http_streaming_module.c:158: error: ‘ngx_http_request_t’ has no member named ‘zero_in_uri’
make[1]: *** [objs/addon/src/ngx_http_h264_streaming_module.o] Error 1
make[1]: Leaving directory `/root/nginx-1.6.0′
make: *** [build] Error 2

出现一个错误,解决方法:

编辑/root/nginx_mod_h264_streaming-2.2.7/src/ngx_http_streaming_module.c

[root@localhost src]# vim ngx_http_streaming_module.c

注释掉:
/* TODO: Win32 */
if (r->zero_in_uri)
{
return NGX_DECLINED;
}

重新make通过。

nginx配置文件:
[root@localhost nginx-1.6.0]# grep -v “#” /usr/local/nginx/conf/nginx.conf | grep -v “^$”

worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
root /usr/local/nginx/html;

location ~\.flv {
flv;
}

location ~\.mp4$ {
mp4;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

创建两个视频文件夹/usr/local/nginx/html/flv、/usr/local/nginx/html/mp4 存放视频文件。

安装yamdi实现拖动效果:
[root@localhost yamdi-1.9]# make && make install  #两步即可

给视频添加帧:
[root@localhost flv]# yamdi -i 1.flv -o test.flv  #给1.flv添加关键帧输出为test.flv

找一个flash播放器,下载地址:http://chinaapp-wordpress.stor.sinaapp.com/uploads/2013/08/player.swf   推荐wget方式下载。
测试:
浏览器访问: http://192.168.0.172/player.swf?type=http&file=flv/test.flv

192.168.0.172 #服务器ip地址
player.swf       #flash播放器程序
http                  #用http方式发布
flv                     #为路径
test.flv             #为视频文件

2015-01-13
发表者 Venus
Linux下搭建iSCSI服务器已关闭评论

Linux下搭建iSCSI服务器

这里用esxi虚拟化中的虚拟机测试,添加一块200G的硬盘。
selinux、iptables 关闭

[root@localhost ~]# fdisk -l  #对新硬盘创建分区,不用挂载。

Disk /dev/sdb: 214.7 GB, 214748364800 bytes
255 heads, 63 sectors/track, 26108 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x8d42c5ad

Device Boot Start End Blocks Id System
/dev/sdb1 1 26108 209712478+ 83 Linux

安装scsi target:
[root@localhost ~]# yum install -y scsi-target-utils

配置文件及命令:
/etc/tgt/targets.conf       主配置文档,设置要分享的磁盘
/usr/sbin/tgt-admin       线上查询、删除target 等功能的管理工具
/usr/sbin/tgt-setup-lun 建立target 以及设置分享的磁盘与可使用的用户端等工具软体
/usr/sbin/tgtadm            手动直接管理的管理员工具(可使用配置文档取代)
/usr/sbin/tgtd                 主要提供iSCSI target 服务的主程式
/usr/sbin/tgtimg             建置预计分享的映像档装置的工具(以映像档模拟磁盘)

编辑配置文件:
[root@localhost ~]# vi /etc/tgt/targets.conf

default-driver iscsi
<target iqn.2015-01.org.rootop:scsi1>
backing-store /dev/sdb1
initiator-address 192.168.0.16
incominguser admin admin123456789
</target>

target                      #目标名称
backing-store       #存储设备
initiator-address #限制来源IP
incominguser       #身份认证

重启tgtd服务:
[root@localhost ~]# service tgtd restart
[root@localhost ~]# chkconfig tgtd on

查看iscsi信息:

客户端挂载:

2015-01-12
发表者 Venus
在 ESXi“192.168.0.150”上调用对象 “storageSystem”的“HostStorageSystem.ComputeDiskPartitionInfo” 失败。已关闭评论

在 ESXi“192.168.0.150”上调用对象 “storageSystem”的“HostStorageSystem.ComputeDiskPartitionInfo” 失败。

在esxi5.5上添加ip-san,提示错误:

在 ESXi“192.168.0.150”上调用对象 “storageSystem”的“HostStorageSystem.ComputeDiskPartitionInfo” 失败。

后来查到是因为已经有了分区(之前挂载到windows下),后来找了台windows重新挂载上去,删掉分区。重新在esxi中添加。
或者是登陆到esxi主机执行命令删掉分区。
先在vsphere client中开启esxi的ssh。

#列出连接的iscsi设备

~ # esxcfg-scsidevs -l

#获取设备磁盘信息

~ # partedUtil get /dev/disks/t10.FreeBSD_iSCSI_Disk______005056bf230c000_______
13054 255 63 209715200
1 2048 209713151 0 0 #分区1

#删除分区

~ # partedUtil delete /dev/disks/t10.FreeBSD_iSCSI_Disk______005056bf230c000_________________ 1
~ # partedUtil #几个参数
Not enough arguments

Usage:
 Get Partitions : get <diskName>
 Set Partitions : set <diskName> ["partNum startSector endSector type attr"]*
 Delete Partition : delete <diskName> <partNum>
 Resize Partition : resize <diskName> <partNum> <start> <end>

解决