因为安装数据库,需要较大的磁盘容量,需要把一块新磁盘挂载到/opt上
1 对磁盘做分区:
root@rac1:/root>fdisk /dev/sdb
The number of cylinders for this disk is set to 182024.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-182024, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-182024, default 182024):
Using default value 182024
Command (m for help): p
Disk /dev/sdb: 1497.1 GB, 1497198755840 bytes
255 heads, 63 sectors/track, 182024 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 182024 1462107748+ 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
2 创建ext3 文件系统:
root@rac1:/root>mkfs.ext3 /dev/sdb1
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
182763520 inodes, 365526937 blocks
18276346 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
11155 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 30 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
3 创建标签
root@rac1:/root>e2label /dev/sdb1 /opt
root@rac1:/root>mount /dev/sdb1 /opt
4 mount 到/opt (如果opt里面有数据,则需要先做备份,mount之后,再拷贝到/opt目录)
root@rac1:/root>df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 9.5G 3.0G 6.1G 33% /
/dev/sda3 4.8G 138M 4.4G 4% /tmp
/dev/sda6 255G 27G 215G 12% /home
/dev/sda1 99M 14M 80M 15% /boot
tmpfs 12G 0 12G 0% /dev/shm
/dev/sdb1 1.4T 198M 1.3T 1% /opt
5 修改/etc/fstab 文件
root@rac1:/root>vi /etc/fstab
LABEL=/ / ext3 defaults 1 1
LABEL=/tmp /tmp ext3 defaults 1 2
LABEL=/home /home ext3 defaults 1 2
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
LABEL=SWAP-sda5 swap swap defaults 0 0
LABEL=/opt /opt ext3 defaults 1 2
"/etc/fstab" 11L, 761C written
测试:
root@rac1:/root>umount /opt/
root@rac1:/root>df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 9.5G 3.0G 6.1G 33% /
/dev/sda3 4.8G 138M 4.4G 4% /tmp
/dev/sda6 255G 27G 215G 12% /home
/dev/sda1 99M 14M 80M 15% /boot
tmpfs 12G 0 12G 0% /dev/shm
root@rac1:/root>mount -a
root@rac1:/root>df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 9.5G 3.0G 6.1G 33% /
/dev/sda3 4.8G 138M 4.4G 4% /tmp
/dev/sda6 255G 27G 215G 12% /home
/dev/sda1 99M 14M 80M 15% /boot
tmpfs 12G 0 12G 0% /dev/shm
/dev/sdb1 1.4T 198M 1.3T 1% /opt
root@rac1:/root>ls /opt/
lost+found
root@rac1:/root>
当时做的时候因特殊原因,要改默认主页为 default.php,安装默认是 :DirectoryIndex index.html
于是就修改 /etc/httpd/conf/httpd.conf 文件 DirectoryIndex index.html 为 DirectoryIndex default.php index.php index.html
重启服务器,无效!
查了一些资料,没有得到解决。应急的处理方法是在原index.php页面做一次跳转。
今天,因为网页流程上的一些问题,这个设置失效的bug显现出来,于是再次致力解决此问题。
最好的老师和技术指导任然是网络,我查了许多资料,一个下午,没有得到有效解决方案。
晚上回家,还是放不下,也不甘心。我来到服务器。
cd /etc/httpd/
发现我一直忽略了conf.d 文件夹,进入这个文件夹,可以看到很多配置文件,其中有一个就是php.conf
打开此文件,发现也有:DirectoryIndex index.php 配置。
于是我怀疑 是这个文件的此配置覆盖了/etc/httpd/conf/httpd.conf 的配置
我试着把这句也改成DirectoryIndex default.php index.php 。
重启apache:/etc/init.d/httpd restart
访问测试页面(自己写的:defult.php和index.php)成功访问defult.php..说明配置成功!
总结:
修改apache默认主页要修改两个文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/php.conf
修改这两个文件的 DirectoryIndex 后的文件名。
要想在linux上实现网页服务器(www)需要Apache这个服务器软件,不过Apache仅能提供最基本的静态网站数据而已,想要实现动态网站的话,最好还是要PHP与MySQL的支持,所以下面我们将会以LAMP(linux+Apache+MySQL+PHP)作为安装与设置的介绍。
LAMP所需软件与其结构
httpd mysql mysql-Server php php-devel php-mysql
可以用rpm包安装,或者直接用yum安装
#yum install httpd mysql-server php php-devel php-mysql
先来了解一下apache 2.0这个版本的相关结构,这样才能知道如何处理我们的网页数据
/etc/httpd/conf/httpd.conf:最主要的配置文件,不过很多其他的distribution都将这个文件拆成数个小文件,分别管理不同的参数。但是最主要配置文件还是以这个文件名为主。
/etc/httpd/conf.d/*.conf:这个事CentOS的特色之一,如果你不想修改原始配置文件httpd.conf的话,那么可以将你自己的额外参数独立出来,而启动apache时,这个文件就会被读入到主要配置文件。
/usr/lib/httpd/modules:apache支持很多的模块,所以您想要使用的模块默认都放置在此目录
/var/www/html:这里是CentOS默认的“首页”所在目录。
/var/www/error:如果因为主机设置错误,或者是浏览器端要求的数据错误,在浏览器上出现的错误信息就已这个目录的默认信息为主。
/var/www/icons:提供apache的一些小图标
/var/www/cgi-bin :默认给一些可执行的CGI程序放置的目录
/var/log/httpd:默认apache的日志文件都放在这里,对于流量大的网站来说,这个目录要很小心,因为这个文件很容易变的很大,您需要足够的空间哦
/usr/sbin/apachectl:这是Apache的主要执行文件,这个执行文件其实是shell script,它可以主动检测系统上的一些设置值,好让您启动Apache时更简单
/usr/sbin/httpd:这是主要的apache的二进制文件
/usr/bin/htpasswd:当您想登陆某些网页时,需要输入账号与密码。那么Apache本身就提供一个最基本的密码保护方式。该密码的产生就是通过这个命令实现的
至于MySQL方面,您需要知道的几个重要目录与文件有以下几个:
/etc/my.cnf:这是Mysql的配置文件,包括您想要进行mysql数据库的最佳化,或者是正对mysql进行一些额外的参数指定,都可以在这个文件里实现
/usr/lib/mysql:这个目录是MySQL数据库放置的位置,当启动任何MySQL的服务器时,请务必记得在备份时,将此目录完整的备份下来。
另外,在PHP方面,应该了解以下几个文件。
/usr/lib/httpd/modules/libphp4.so:PHP提供给apache使用的模块,这个关系我们能否在apache网页上面设计php程序语言的最重要文件
/etc/httpd/conf.d/php.conf:你要不要手动将该模块写入Httpd.conf中呢?不需要,因为系统已经主动将php设置参数写入到这个文件中了,而这个文件会在apache重新启动时被读入。
/etc/php.ini:这是PHP的主要配置文件,包括PHP能不能允许用户上传文件,能不能允许某些低安全性的标志等,都在这个配置文件中设置。
/etc/php.d/mysql.ini /usr/lib/php4/mysql.so:PHP能否可以支持MySQL接口就看这两个文件了。这两个文件是由php-mysql软件提供的
/usr/bin/phpize /usr/include/php:如果您以后想要安装类似PHP加速器可以让浏览速度加快的话,那么这个文件与目录就需要存在,否则加速器软件没法用。
httpd.conf的基本设置
首先,你需要在/etc/hosts内需要有个一个完整的主机名,否则在重启apache服务时,会提示找不到完整的主机名。
httpd.conf的基本设置是这样的:
<设置项目>
次设置项目内的相关参数
。。。。
</设置项目>
例如,你想要针对首页/var/www/html提供额外的功能,那么可以进行如下设置:
<Directory "/var/www/html">
Options Indexes
......
</Directory>
针对主机环境的设置项目
#vi /etc/httpd/conf/httpd.conf
ServerTokens OS
# 这个项目在告诉客户端WWW服务器的版本和操作系统,不需要改编它
#如果你不想告诉太多的主机信息,将这个项目的OS改成Minor
ServerRoot "/etc/httpd"
#这个是设置文件的最顶层目录,通常使用绝对路径,下面某些数据设置使用相对路径时
#就是与这个目录设置值有关的下层目录,不需要更改它
ServerRoot
设定Apache 安装的绝对路径
TimeOut
设定 服务器接收至完成的最长等待时间
KeepAlive
设定服务器是否开启连续请求功能,真实服务器一般都要开启
Port
设定http服务的默认端口。
User/Group
设定 服务器程序的执行者与属组,这个一般是Apache
下面我们就针对Apache做几个实验
1:我们测试把默认网站目录改到root家目录下
新建/root/website目录
#mkdir -p /root/website
#echo "website page" >> /root/website/index.html
#vi /etc/httpd/conf/httpd.conf
找到 DocumentRoot "/var/www/html" 这一段 //apache的根目录
把/var/www/html 这个目录改到 /root/website
在找到 <Directory "/var/www/html"> //定义apache /var/www/html这个区域
把 /var/www/html改成/root/website
这样我们就把apahce的默认路径改掉了
然后重启服务
#service httpd restart
//这里在你重启服务的时候,可能会报错,说找不到目录,这个主要是由于selinux导致的
那怎么解决呢?有2个办法,关掉selinux
#setenforce 0
或者更改/root/website这个文件的selinux属性,让它匹配httpd这个服务器的要求
怎么改?我们可以复制/var/www/html这个目录的selinux属性
#chcon -R --reference /var/www/html /root/website
然后在重启服务,之后你就看到它没有报错了
不过你去访问localhost的时候,会发现访问拒绝 这是为什么呢?主要是因为你的/root的权限是750,ahache这个用户没有权限访问,你需要更改掉权限,可以这样改
#chmod -R 755 /root
然后去访问 发现正常了
2:基于名称的虚拟主机
需要两个域名解析到你的服务器,对应关系是
/var/www/server server.example.com
/var/www/client client.example.com
当访问这两个域名时,可以分别显示出不同文件里面主页的内容
#echo "server page" >> /var/www/server/index.html
#echo "client page" >> /var/www/client/index.html
然后我们编辑一个配置文件
#vi /etc/httpd/conf.d/virtual.conf //记住conf.d里面的内容也是apache的配置文件
添加如下内容:
NameVirtualHost 192.168.76.133:80
<VirtualHost 192.168.76.133:80>
ServerName service.example.com
DocumentRoot /var/www/server
</VirtualHost>
<VirtualHost 192.168.76.133:80>
ServerName client.example.com
DocumentRoot /var/www/client
</VirtualHost>
#service httpd restart
这样基于名称的虚拟主机就配置好了
如果你没有DNS你可以再你的机器上hosts文件里加记录 linux在/etc/hosts这个文件 windows在C:\windows\system32\drivers\etc\hosts文件
加上这两行
192.168.76.133 server.example.com
192.168.76.133 client.example.com
这样你在去测试,就会发现访问不同的域名显示不同的内容了 这样基于名称的虚拟主机就配置好了!
3:基于IP地址的虚拟主机
先添加一个临时网卡
#ifconfig eth0:0 192.168.76.132 //临时使用,重启后就会消失
然后便捷virtual.conf文件
#vi /etc/httpd/conf.d/virtual.conf
把内容修改为
#NameVirtualHost 192.168.76.133:80
<VirtualHost 192.168.76.133:80>
ServerName service.example.com
DocumentRoot /var/www/server
</VirtualHost>
<VirtualHost 192.168.76.132:80>
ServerName client.example.com
DocumentRoot /var/www/client
</VirtualHost>
让后你在用ip访问,发现也能显示不同的内容,或者你编辑hosts文件,用域名访问也没问题
这样基于IP地址的虚拟主机也成功了!
4:别名
在/etc/httpd/conf/httpd.conf里加入
Alias /test "/root/website/" // 别名 这样你用192.168.76.133/test访问 也会显示192.168.76.133的页面
这个地方需要注意的就是/test 还是/test/ 这个是有区别的 你用/test 那么你访问的时候只能用192.168.76.133/test访问 如果你用/test/ 那么192.168.76.133/test/访问,而/test将不会让你访问
忘了这里你的先把/etc/httpd/conf.d目录里面刚刚设置的虚拟目录注释掉,不然没法访问,是因为做了虚拟目录,而httpd.conf里面的设置就无法访问 当然可以用localhost来访问,其他的访问都不行
5:实现网页的资源下载
首先添加别名
#vi /etc/httpd/conf/httpd.conf
在Alias /test "/root/website/" 后面加入
Alias /down "/var/ftp/pub"
让后对/var/ftp/pub区域设置参数
<Directory "/var/ftp/pub">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
在Options 加入 MultiViews //没有index时自动列出目录文档
然后重启服务,这样http://192.168.76.133/down/里面就可以列出/var/ftp/pub里面的文件了,试着点一个另存为,是否可以下载? 呵呵 成功!
6:.htpasswd的实现
#vi /etc/httpd/conf/httpd.conf
我们针对刚刚做的/var/ftp/pub来做
加入如下信息
Alias /down "/var/ftp/pub/"
<Directory "/var/ftp/pub">
Options Indexes MultiViews
AllowOverride AuthConfig
Order allow,deny
Allow from all
</Directory>
<Directory "/var/ftp/pub">
AuthType Basic
AuthName "this is test"
AuthUserFile /etc/httpd/htpasswd
Require User test
</Directory>
然后重启httpd服务,
让后生成.htpasswd用户密码
htpasswd -c /etc/httpd/htpasswd test
让后去访问192.168.76.133/down会需要密码
这样就成功了
Fotolog 是一个以图片为主的 SNS 网站,让 VPSee 好奇的是用 Solaris 的 Web 2.0 站点不多,看看 Fotolog 有没有什么新东西。
数据和图片来源(2007):Fotolog: Scaling the World’s Largest Photo Blogging Community
超过1100万用户
超过24亿条评论
每个月超过35亿 PV 和 2000万独立访问,Alexa Top 20
总共有超过2亿张的图片,每天还有超过50万张照片上传
20%用户每天在 Fotolog 停留 24分钟
32台 MySQL 服务器和一个由30台 memcached 服务器组成的集群
Solaris 10
MySQL
Apache
Java / Hibernate
PHP
Memcached
3PAR
IBRIX
CDN
32台 MySQL 服务器被分成4个集群:User, GB (guest book), PH (photos), FF (friends and favorites lists)。每个集群又被分成一个 shard 集,并由一个应用服务器集做前端。每个 shard 集包括若干个 MySQL 服务器,一个只写的 Master-Master 配几个只读的 Slaves,应用服务器把读请求发给 Slaves,把写请求发给 Master。MySQL 只存储图像的 metadata,没人想要把图像存到数据库里吧?什么是 metadata?metadata 是 “data about other data”,如一张照片的 metadata 就是一些包括:作者,年份,照片说明,摄影设备等信息就是这张照片的 metadata。
GB 集群的架构:

GB 扩展后的架构:

Fotolog 开始用的是 MyISAM 引擎,表结构:
CREATE TABLE `guestbook_v3` (
`identifier` bigint(20) unsigned NOT NULL auto_increment,
`user_name` varchar(16) NOT NULL default ”,
`photo_identifier` bigint(20) unsigned NOT NULL default ’0′,
`posted` datetime NOT NULL default ’0000-00-00 00:00:00′,
…
PRIMARY KEY (`identifier`),
KEY `guestbook_photo_id_posted_idx` (`photo_identifier`,`posted`)
) ENGINE=MyISAM
执行数据库查询的时候,需要6次磁盘 IO 从不同块读取数据:

后来改成 InnoDB,表结构改成:
CREATE TABLE `guestbook_v4` (
`identifier` int(9) unsigned NOT NULL auto_increment,
`user_name` varchar(16) NOT NULL default ”,
`photo_identifier` int(9) unsigned NOT NULL default ’0′,
`posted` timestamp NOT NULL default ’0000-00-00 00:00:00′,
…
PRIMARY KEY (`photo_identifier`,`posted`,`identifier`),
KEY `identifier` (`identifier`)
) ENGINE=InnoDB 1 row in set (7.64 sec)
改成 InnoDB 后,只需要2次磁盘 IO 读取,大大减少了磁盘操作:

InnoDB 是以 primary key 来存放数据到磁盘上的,而 MyISAM 是以插入数据的顺序来存放数据的,这样 InnoDB 有个潜在的好处就是如果以 primary key 来查询数据的话,磁盘 IO 操作就可以一次读取需要的数据(因为它们都在一起),不必像 MyISAM 那样从磁盘的不同位置执行多个 IO 操作来得到数据。简单的说就是 InnoDB 在查询的时候减少了磁盘 IO 操作的次数,从而获得了潜在的性能提升。Fotolog 正是利用了 InnoDB 的 这个优点。
在DELL、EMC、日立、HP、IBM、NetApp、Sun等公司把持的存储市场,还能冒出个 3PAR 出来,显示了 3PAR 的特别和技术特色。3PAR 产品的主要技术是:分布式多态集群、虚拟化、自动精简配置、精简备份以及高性能 RAID 5,其中最突出的优势是自动精简配置。3PAR 在 Internet/Web 2.0 行业有几个重量级客户:myspace.com, ask.com, fotolog.com, shopzilla.com 等。
Fotolog CTO 解释了为什么用 3PAR:
With 3PAR Thin Provisioning, you set it up and walk away. As actual data is written, the system tells us when it needs more capacity—which is added simply and non-disruptively. With 3PAR, we’ve cut our monthly storage administration time from 40 hours to 30 minutes.
-Nathan Boeger
Director of Network Operations, Fotolog
IBRIX 是一家做文件服务器集群的存储公司,最近刚被 HP 收购,重量级客户有:AOL, Fotolog, RealNetworks, Disney, DreamWorks, 等。
Fotolog 用50台 memcached 服务器连成一个集群,总共 cache 加起来差不多 150GB,能应付每个月40亿左右的 PV。使用 memcached 后,高峰时期网站 load 时间从 10秒降到2秒。Memcached 已经是动态网站的标配,LAMP 的 M 现在应该包括 MySQL 和 Memcached 了。
mysql> use dbname
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
让后就卡在这里。
上面卡住的原因::
是由于数据库太大,即数据库中表非常多,所以如果预读数据库信息,将非常慢,所以就卡住了,如果数据库中表非常少,将不会出现问题。
出现问题的原因是::
我们进入mysql 时,没有使用-A参数;
即我们使用
mysql -hhostname -uusername -ppassword -Pport 的方式进入数据,
而没有使用
mysql -hhostname -uusername -ppassword -Pport -A的方式进入数据库。
当我们打开数据库,即use dbname时,要预读数据库信息,当使用-A参数时,就不预读数据库信息。
MySQL是开源的关系型数据库系统。复制(Replication)是从一台MySQL数据库服务器(主服务器master)复制数据到另一个服务器(从服务器slave)的一个进程。
1、编辑数据库配置文件my.cnf,一般在/etc/目录下。
在[mysqld]的下面加入下面代码:
server-id=1中的1可以任定义,只要是唯一的就行。
binlog-do-db=wordpress是表示只备份wordpress。
binlog_ignore_db=mysql表示忽略备份mysql。
不加binlog-do-db和binlog_ignore_db,那就表示备份全部数据库。
2、然后重启MySQL:
3、登录MySQL服务器。
在主服务器新建一个用户赋予“REPLICATION SLAVE”的权限。你不需要再赋予其它的权限。在下面的命令,把X.X.X.X替换为从服务器的IP。
4、执行以下命令锁定数据库以防止写入数据。
5、退出mysql命令行,导出数据库
6、使用scp命令传输数据库文件all.sql到从服务器。
7、再次连接数据库进入mysql命令行查看master状态。
请记下显示的信息,配置从服务器会用到。
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000003 | 1001741 | dbispconfig | mysql |
+——————+———-+————–+——————+
1 row in set (0.00 sec)
8、解锁数据表。
登录从服务器。
1、导入主服务器的数据库。
2、编辑配置文件my.cnf,在[mysqld]下面加入:
2可以自己定义,只要保证唯一的就行。
3、保存文件并重启mysqld。
4、登录mysql服务器,执行以下命令。
MASTER_HOST:主服务器的IP。
MASTER_USER:配置主服务器时建立的用户名
MASTER_PASSWORD:用户密码
MASTER_PORT:主服务器mysql端口,如果未曾修改,默认即可。
5、启动slave进程。
6、查看mysql的日志,一般在/var/log/目录下的mysqld.log,如果启动成功,你应该会看到类似下面的日志。
[root@localhost ~]# vi /etc/my.cnf
091104 8:42:02 [Note] Slave I/O thread: connected to master ‘root@X.X.X.X:3306?, replication started in log ‘mysql-bin.000001? at position 98
现在主服务器和从服务器已经配置好了。另外你可能需要设置主服务器的数据库二进制日志的过期时间,可以在配置文件中使用参数expire_logs_days来设定。
备份数据库出现
mysqldump: Got error: 1016: Can't open file: './ShoppingCart/ShoppingCart_01f8.frm' (errno: 24) when using LOCK TABLES
这样的错误。
搜索了一下,发现只要在mysqldump的时候加上--lock-tables=false就可以解决问题。
mysqldump -u root -pMyPassword DbName --lock-tables=false > data.sql