伴着夜晚的一点点凉意,在这熟悉的黑暗的夜色中,冷笔勾勒我在华中科大网络中心当协管的那些年月。想想突然离开学校也很久了,那个曾经承载我几年的欢声笑语、伴我在孤寒岁月中成长的学校以及渐渐远离我生命中了,不过那些曾经的烙在我生命中的印记,却是那么的强而有力,挥之不去。不过想想我过段时间要回学校办手续的,欣喜跃上心头。
记得最初的跟网络中心的打交道是,大一的时候刚连校园网的时候,我的windows下自动开了bluetooth调制解调器模式,跟校园网的拨号冲突导致死活无法上网,最后几通电话之后无果只能带电脑去网络中心解决了,想想大一进校的时候自己是多么的青涩,这也许是跟网络中心打交道的最早的起源了。
开始切入正题了,我是从大二暑假开始跟网路中心有些业务、项目上的交道的。从我做的cs.hust.edu.cn为例开始,从网络中心申请了1个测试机器,开始开发项目。最后等项目上线后,自然作为cs.hust.edu.cn的作者跟维护者,自然成了网络中心的协管了,其实就是在网络中心看管3台服务器,保证安全与服务可靠,当然作为作者,我是一度那么想优化ta的性能,以前也不断的做了各种折腾,以前年轻真是好,永远那么有精力,为了心中一点点的想法而通宵达旦地验证, 追求那么丁点的问心无愧跟坦坦荡荡把。
cs.hust.edu.cn的技术结构跟开发过程,这里以前写在了本博客的另一篇文章中,这里不做赘述。一言以蔽之,cs.hust.edu.cn是目前上线的部署代码在1万4千2百行大概的php站点,(运维的、php library的没算,中间修改的、废弃的代码没算)。其中我管理有3台机器,但是真实情况下cs.hust.edu.cn是部署在一个新的单独的机器上。机器的配置跟我用的核心软件如下表:
CPU | 2 physical cpu, 24 processor |
内存 | 48G内存 |
硬盘 | 4T机械硬盘(做了raid5) |
网络状况 | 教育网,华中科技大学网络中心托管 |
operating system | Centos 6.3(Final), 64bit |
linux kernel | 2.6 |
web server | nginx 1.7.4(compile from source) |
database server | mysql 5.6.21(compile from source) |
php | php 5.5.9(compile from source) |
hhvm | HipHop VM 3.5.0-dev+2014.12.11 (rel) Compiler: heads/master-0-g546087bf1b0560c4a9e254fcad46a9212e42ccc2 Repo schema: cf1780b3cc3857e091e924935ae6267e9794de9c Extension API: 20140829 |
其他软件 | ruby 2.2.1、rust 1.1.0、erlang、fail2ban |
maybe someone will feel strange about why I use Centos 6.3 which is so old, 我当时准备好了给ta去装个opensuse text mode 12.3的(我当时是opensuse铁粉, 12.3是当时的最新版的opensuse)了,为了试验opensuse text mode的操作(当时仅仅是opensuse桌面版很熟悉,opensuse的很多配置网络、防火墙有的跟debian、ubuntu、centos等等不同,要单独学习, 还有在纯粹的命令行下配置网络连接啊等等、专门抱了一个台式机过来装opensuse text mode学习试试), 我把一个台式机装了opensuse text mode用了一段时间, 感觉挺好的。都已经做好了准备等新服务器到达的时候,去网络中心亲自给ta装上opensuse text mode 12.3,都跟学院说好了,他们也同意了。结果等机器来的那天,是上午10点对来的, 我当时在上大三上学期的《软件工程》的最后一节课,不能不去,不去上最后这节课老师大概的意思是说就直接这门课不给过,结果没有亲自装机,网络中心的老师就随便装了个centos 6.3, 算了也不吐槽网络中心给装的这么旧的发行版了,因为上一个我管理的机器是readhat5的,估计还很多人没见过redhat5把,那古老的东西,放图大家感受下。
部署工作
当初cs.hust.edu.cn开发的时候是用的测试机器在自申请的一个网络中心的测试机器上,开发进行,对外服务,当初是用ip直接访问的。测试机器性能记得很渣,大概是1GHz CPU + 2G内存+50G机械硬盘的样子,还是在一个windows server上装vmvare虚拟出来的一个vm。测试机器系统是centos6.4,用的apache + mysql + php提供服务。项目部署需要web server提供rewrite支持,其他的也没什么很特殊的。就是centos6.3上面的所有东西太老了于是很自然就开始了我的编译nginx+mysql+php+hhvm之旅。
1编译nginx
nginx编译很简单,没什么依赖,编译参数如下。
./configure \
--prefix=/home/dengpan/opt/nginx-1.7.3 \
--sbin-path=/home/dengpan/opt/nginx-1.7.3/sbin/nginx \
--conf-path=/home/dengpan/opt/nginx-1.7.3/conf/nginx.conf \
--error-log-path=/home/dengpan/opt/nginx-1.7.3/var/log/error.log \
--http-log-path=/home/dengpan/opt/nginx-1.7.3/var/log/access.log \
--pid-path=/home/dengpan/opt/nginx-1.7.3/var/run/nginx.pid \
--lock-path=/home/dengpan/opt/nginx-1.7.3/var/run/nginx.lock \
--http-client-body-temp-path=/home/dengpan/opt/nginx-1.7.3/var/cache/client_temp \
--http-proxy-temp-path=/home/dengpan/opt/nginx-1.7.3/var/cache/proxy_temp \
--http-fastcgi-temp-path=/home/dengpan/opt/nginx-1.7.3/var/cache/fastcgi_temp \
--http-uwsgi-temp-path=/home/dengpan/opt/nginx-1.7.3/var/cache/uwsgi_temp \
--http-scgi-temp-path=/home/dengpan/opt/nginx-1.7.3/var/cache/scgi_temp \
--user=www \
--group=www \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-mail \
--with-mail_ssl_module \
--with-file-aio \
--with-ipv6 \
--add-module=../mod_strip
基本按照官方编译参数(http://nginx.org/en/docs/configure.html)来的,只是加了mod_strip这个非官方模块,当时是想把所有页面压缩成一行的html, 节省下行传输带宽,提高速度。后面发现这点点html相比图片(我把首页的大图已经内页的logo图换成了webp格式,browser支持webp就显示webp格式,不支持就用jpeg格式)简直不值一提,其实也是因为这个mod_strip压缩html处理有bug, 处理有些页面有问题,标签会闭合到一起去,无法正常展示。
2编译php
php编译比较麻烦,一堆的依赖,第一次编译的时候,我编译了2天时间。后面编译就容易多了。在我的archlinux(i5 cpu, 机械硬盘)编译php 5.5.9大概需要8min。服务器make -j24大概需要10min。编译参数如下:
./configure \
--prefix=/home/dengpan/opt/php-5.5.9 \
--with-config-file-path=/home/dengpan/opt/php-5.5.9/etc \
--with-config-file-scan-dir=/home/dengpan/opt/php-5.5.9/etc/php.d\
--with-libdir=lib64 \
--with-curl \
--with-freetype-dir=/home/dengpan/opt/freetype-2.4.2/ \
--with-gd \
--with-gettext \
--with-iconv-dir=/home/dengpan/opt/libiconv-1.14 \
--with-jpeg-dir \
--with-kerberos \
--with-ldap \
--with-ldap-sasl \
--with-libxml-dir \
--with-mcrypt=/home/dengpan/opt/libmcrypt-2.5.7 \
--with-mhash \
--with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-openssl \
--with-pcre-regex \
--with-pdo-mysql=mysqlnd \
--with-pdo-sqlite=shared \
--with-pear \
--with-png-dir \
--with-xmlrpc \
--with-xsl \
--with-zlib \
--enable-fpm \
--enable-bcmath \
--enable-libxml \
--enable-inline-optimization \
--enable-gd-native-ttf \
--enable-mbregex \
--enable-mbstring \
--enable-opcache \
--enable-pcntl \
--enable-shmop \
--enable-soap \
--enable-sockets \
--enable-sysvsem \
--enable-xml \
--enable-zip \
--with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--disable-rpath
其中编译的时候缺少很多lib请自行用yum安装, 但是centos6.3上编译php,其中的libmcrypt、libiconv、freetype2需要自己编译安装,有些bug, 时间久了我也没记下来,记得编译的时候一堆问题,其中libiconv还需要手动修改一些代码之类的,具体的若有人碰到了,请自行stackoverflow一下。
3编译mysql
mysql编译比较容易,没太多依赖。编译参数如下:
cmake \
-DCMAKE_INSTALL_PREFIX=/home/dengpan/opt/mysql-5.6.21 \
-DMYSQL_DATADIR=/home/dengpan/opt/mysql-5.6.21/data \
-DSYSCONFDIR=/home/dengpan/opt/mysql-5.6.21/etc \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DMYSQL_UNIX_ADDR=/home/dengpan/opt/mysql-5.6.21/tmp/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
编译完了之后mysql需要初始化用户名用户组与mysql目录。
- 检查mysql用户组
cat /etc/passwd|grep mysql cat /etc/group|grep mysql
没有就添加
1 groupadd mysql 2 useradd -g mysql mysql
- 给mysql目录设置权限
chown -R mysql:mysql /home/dengpan/opt/mysql-5.6.21
- 初始化数据库
scripts/mysql_install_db --basedir=/home/dengpan/opt/mysql-5.6.21 --datadir=/home/dengpan/opt/mysql-5.6.21/data --user=mysql
- 直接启动数据库
/home/dengpan/opt/mysql-5.6.21/support-files/mysql.server start
4编译hhvm
hhvm,可能大家用的少,这里简介一下,hhvm是facebook开发的一个php jit解释器,在hhvm + nginx部署网站中,hhvm此时等同于php-fpm的角色,作用就是监听端口(一般是9000端口)或者本地unix sock,然后nginx通过fastcgi建立socket与之通信。centos 6.3编译hhvm有点麻烦,内核卡在那里,glibc上不去,一堆编译错误。编译过程按照github hhvm的官方wiki(Building and installing HHVM on CentOS 6.3)编译的,我在我的opensuse 12.3跟13.1跟后来的archlinux都编译成功了, 在centos6.3编译了3天没有成功只好安装了 facebook提供的prebuilt package 。hhvm有一点点不稳定,但是性能根据我当时的使用情况,的确惊人。
由于此篇文章可能太长, 太多感悟与踩坑经历要写,因而拆分几篇来写, 本篇是部署篇。