[MediaTemple]从(dv)3.0升级到3.5

从(dv)3.0升级到(dv)3.5,其实我理解最大的差别就是php5, centos5了,其它的也有一些,包括硬件上的,不管怎样,新的应该好,升级之。

升级主要依据KB里的这篇文章:(dv) HOWTO: Using the Plesk Migration Manager,英文好的直接去看,不用听我唠叨了。

升级之前

升级的准备条件:要知道旧主机的域名(废话),有旧主机的root权限(早有了),超过50%的磁盘剩余空间(这个没问题,我们用得比较省)。

升级之前,要通过support request申请新的(dv)3.5主机,为什么要通过support request而不是直接下订单购买呢?我也不知道。新主机不能和旧主机使用同样的域名,可以用个假的,比如new.fwolf.com,升级完成后可以调过来。申请的时候,我还要了2个新ip,打算把旧ip全部换掉。

可能是周末的原因,反应速度稍微慢一些,将近12个小时之后才得到消息,先是一个回复说已经添加了新的主机方案(默认一年,可以调整成按月的),然后另外一个回复说ip已经添加完毕,另外还有一封Service Activation Letter邮件,告知新主机的登录信息。

由于我们并没有使用主机上的DNS,所以DNS部分的调整略过。

备份资料

首先是备份旧主机上的资料,主要是文档和数据库。

文档就是把/var/www/vhosts打包下载即可,虽然我们并没有使用太多的空间,但打包之后还是有1.5G,下载得花点时间,早知道我就在等待新主机的时候作了。

然后就是备份数据库了,这个用脚本会方便些:

# mysql -u admin -p -e "show databases;" > mysql_backup.sh

然后用vi加工一下这个文件,删掉第一行标题Database,然后用正则替换:

:%s/^\(.*\)$/mysqldump --add-drop-table --default-character-set=utf8 --user=admin --password=your_passwd --extended-insert=false \1 > \1.sql

加上可执行属性之后,就可以运行这个脚本了,会在当前目录下生成一堆sql文件,打包下载到本地即可。这个文件终于小一点,才17M。

设置新的主机

按照MT Service Activation Letter中的登录信息,登录新的主机,完成主机设置。

plesk setup step 1

hostname、默认ip都不用动,所有ip改为shared类型,并更改管理员密码。

plesk setup step 2

这些都是联系信息,按照KB中的说明,I would like to create a default client account要选中。

完事之后,简单对比了一下新、旧主机,发现除了centos和plesk有升级之外,硬件居然还略微下降了一点点,这个是旧主机的:

mediatemple old vps

这个是新主机的:

mediatemple new vps

用unixbench算了一下,果然要差一些:

Start Benchmark Run: Sun Jul 13 02:52:13 PDT 2008
 02:52:13 up 1 day,  3:19,  3 users,  load average: 0.07, 0.12, 0.05

End Benchmark Run: Sun Jul 13 03:02:39 PDT 2008
 03:02:39 up 1 day,  3:30,  3 users,  load average: 14.05, 6.09, 2.71


                     INDEX VALUES            
TEST                                        BASELINE     RESULT      INDEX

Dhrystone 2 using register variables        376783.7 10407496.2      276.2
Double-Precision Whetstone                      83.1     1363.3      164.1
Execl Throughput                               188.3     3177.3      168.7
File Copy 1024 bufsize 2000 maxblocks         2672.0    70892.0      265.3
File Copy 256 bufsize 500 maxblocks           1077.0    17388.0      161.4
File Read 4096 bufsize 8000 maxblocks        15382.0   376396.0      244.7
Pipe-based Context Switching                 15448.6   224834.4      145.5
Pipe Throughput                             111814.6   619968.9       55.4
Process Creation                               569.3    11806.2      207.4
Shell Scripts (8 concurrent)                    44.8      270.9       60.5
System Call Overhead                        114433.5   280994.4       24.6
                                                                 =========
     FINAL SCORE                                                     131.3

原来得分是207.1的,只好阿Q一下,希望MT不同配置的硬件所带的vps数量不同,另外软件上的优化也能弥补一些差距。

开始升级

左边菜单里点Server,然后在右边页面的Services组中选择Migration Manager,然后点Start a new migration开始新的服务器转换:

plesk migration step 1

由于磁盘空间足够,可以一次转换,所以很方便,填上原主机名称和登录信息即可。不小心还发现/使用的是reserfs,并且默认安装耗费4%的空间,也就是大概600M。

确认之后,plesk自动到旧主机上查出信息:

plesk migration setp middle

plesk migration setp 2

当然要选择Migrate all clients and domains,同时还看到plesk还能从其它主机管理软件,比如从cPanel转换数据。Advanced里还有一些选项,包括旧主机的空间占用信息,一般不用动的:

plesk migration step 2-1

确认之后:

plesk migration step 3

设置新、旧主机上的ip对应关系,我们旧主机上有2个ip(虽然显示3个,有一个其实已经退掉了),新主机上打算大多数人用一个ip,管理后台用单独的一个,免得被封了之后连后台都进不去(plesk通过代理登录总有问题)。

下一步:

plesk migration setp 4

Mysql设置,没什么好设置的,直接继续,就可以喝茶等机器干活儿了,先备份信息:

plesk migration step 5

然后拷贝文件:

plesk migration step 5-1

传输速度10MB/s左右,基本上相当于100M局域网对拷了。拷贝完成后再逐个进行部署:

plesk migration step 5-2

最后,终于完成,不过发现了错误:

plesk migration error

好像是因为plesk没有装中文语言包,不是很严重的错误,到Parallels下载一个语言包,在plesk -> Server -> Interface Prefenences -> Add Locale里上传语言包。网站上显示有错误,简体中文实际上是链接向荷兰语的,繁体中文链接是指向简体中文的。上传成功后又发现无法启动,原来Maximum number of language packs只有1,难道新的主机方案只能安装一个语言包?大家只能暂时都用英文界面了。

升级回顾、检查、补漏

plesk的migration只是把所有client、domain的设置和文件都压缩、拷贝、解压部署到了新主机上,其余的东西还得自己动手:

  • root账号没有开,developer tools没有安装,这两个可以在account center里作;
  • Virtuozzo -> System Services里的服务大部分都和旧主机一样,有一点不同,手工修改了;
  • root目录下的文件都需要手工拷贝过来;
  • 用户$HOME下除系统自建目录之外的文件都没有转过来,需要手工处理,比如.bashrc, .vimrc
  • chroot环境里原来配置的可执行文件都没了,需要重新配;
  • plesk中的client模板也没转换过来,需要自己重新新建;
  • Apache配置文件/etc/httpd/conf/httpd.conf,php配置文件/etc/php.ini,mysql配置文件/etc/my.cnf,需要手工处理;
  • 原来手工更改为PHP5的用户,需要参照KB: Reverting PHP5 for (dv) 3.0 after migrating to a (dv) 3.5进行修改,删除原来添加的PHP5 fcgi处理部分,然后/usr/local/psa/admin/sbin/websrvmng -a -v即可;
  • 为了安装其他东西方便,这回我先装个yum,从这里下载,i386的;
  • denyhosts还是要装的,从这里下载;
  • ssl证书,虽然是没有公信力的,但还是自己的看着舒服;

vi里中文乱码,需要编辑/etc/sysconfig/i18n,把里面的4行原来注释了的取消注释,原来没注释的加上注释,即:

# cat /etc/sysconfig/i18n 
LANG="en_US.UTF-8"
SUPPORTED="en_US.UTF-8:en_US:en"
SYSFONT="latarcyrheb-sun16"
#LANG="C"

这个需要重启生效。这个好像只对root有效,jail的ssh用户仍然不行,取消了chroot之后就好了;

另注:我migration的时候,虽然大部分文件都过来了,但因为语言包的原因失败了,所以有些内容可能是因为这个原因没有migration过来。

后记、感想

  • 下次再升级之前,一定把自己修改过的脚本备份打包,便于修改新主机上的配置;
  • migration的范围如果能扩大到系统配置,然后系统配置不是覆盖,而是像svn那样能智能merge就好了;
  • plesk功能虽然丰富,可速度是那么得慢,慢到我可以一边等待一边写这些记录,时不时的操作一下对写作思路还有干扰。不止我一个人这么说哦:使用plesk的感想
  • 现在的web服务器选择真是太多了,我知道的除了apache还有lihttpd和nginx,鼓捣php的时候还发现同一种服务还有N种实现方式,学无止境阿。

升级之后

升级结果信息总体保存在/usr/local/psa/PMM/var/2008-07-11-20.05.45.106523,这个目录下面有个archives子目录,是升级时旧服务器上打包的所有文件,确认升级没问题后,可以删掉以节省控件。如果升级完全成功,应该会自动删除这些文件吧。

还得停掉原来的旧主机,可以在Account Center里自助进行:billing > request to close,比如:

plesk migration: close old service

注意并不是一申请就立刻关闭,而是按整月计的,比如:我的旧主机是2007年7月19号租下的,migration到新主机后,新主机将从2008年7月19号开始计算日期;同时我申请关闭旧主机的时候,也只能选择在7月19号、8月19号、9月19号等没有19日关闭,也就是凑够整月。

这个简单的问题疑惑了我很久呢,嘟噜嘟噜问了客服N回,后来自己点点这个功能试试,一切就都清楚了。如果不关闭的话,下一年的账单可又是$500哦。

参考

Update @ 2008-07-20

补充说明一下,刚才看了一下账单,旧主机的“时间”并没有“续”到新服务器上,新服务器的钱是另外单算的,但时间确实是以19号为期限。即:旧主机不动,新主机从2008-07-11到2008-07-18还要收$11,之后才是从2008-07-19到2009-07-18的年费$500。另:ip一年是$12,应该还算便宜吧。

Update @ 2008-07-22

MT还不愿自动关闭旧主机,都21号了,我怕再出什么变故,提交了一个support request询问了一下,今天才“正式”被关闭了。我在想,如果我不要求关闭,会不会一直开下去,还不收钱呢。。。?

关闭之后再访问旧主机页面,好嘛,已经被“升级”到dv 3.5了,这次手可够快的,哼哼。

Update @ 2011-07-16

今天将主机又升级到了 DV4,再用 Unix Bench 算一下,速度大增啊,赚了:

BYTE UNIX Benchmarks (Version 4.1-wht.1)
System -- Linux fwolf.com 2.6.18-028stab091.2 #1 SMP Fri Jun 3 00:02:40 MSD 2011 x86_64 x86_64 x86_64 GNU/Linux
/dev/vzfs             30000000   8393836  21606164  28% /

Start Benchmark Run: Sat Jul 16 05:26:18 EDT 2011
 05:26:18 up  2:57,  1 user,  load average: 0.16, 0.11, 0.03

End Benchmark Run: Sat Jul 16 05:36:23 EDT 2011
 05:36:23 up  3:08,  1 user,  load average: 17.75, 7.10, 3.02


                     INDEX VALUES            
TEST                                        BASELINE     RESULT      INDEX

Dhrystone 2 using register variables        376783.7 27501042.5      729.9
Double-Precision Whetstone                      83.1     1779.1      214.1
Execl Throughput                               188.3     6382.8      339.0
File Copy 1024 bufsize 2000 maxblocks         2672.0   280904.0     1051.3
File Copy 256 bufsize 500 maxblocks           1077.0    65361.0      606.9
File Read 4096 bufsize 8000 maxblocks        15382.0  2573713.0     1673.2
Pipe-based Context Switching                 15448.6   164684.0      106.6
Pipe Throughput                             111814.6  3194647.9      285.7
Process Creation                               569.3    20258.7      355.9
Shell Scripts (8 concurrent)                    44.8     2845.5      635.2
System Call Overhead                        114433.5  2355994.7      205.9
                                                                 =========
     FINAL SCORE                                                     424.3

由一个错误学到的一些php安全配置问题

错误

在MediaTemple主机从(dv)3.0升级到3.5之后,我遇到的第一个问题就是一个莫名奇妙的php错误:

[Sat Jul 12 04:51:27 2008] [error] [client 121.42.26.81] PHP Warning:  require_once(/var/www/vhosts/fwolf.com/include/fwolflib/func/config.php) [<a href='function.require-once'>function.require-once</a>]: failed to open stream: Operation not permitted in /var/www/vhosts/fwolf.com/httpdocs/info.php on line 4
[Sat Jul 12 04:51:27 2008] [error] [client 121.42.26.81] PHP Fatal error:  require_once() [<a href='function.require'>function.require</a>]: Failed opening required '/var/www/vhosts/fwolf.com/include/fwolflib/func/config.php' (include_path='.:/var/www/vhosts/fwolf.com/include') in /var/www/vhosts/fwolf.com/httpdocs/info.php on line 4

因为是migration过来的,所以require的这个文件肯定存在,并且apache用户也的确有权访问,那问题出在哪里呢?

如果换一种方式,require直接使用文件的全路径,错误信息就更清楚了:

<b>Warning</b>:  require_once() [<a href='function.require-once'>function.require-once</a>]: open_basedir restriction in effect. File(/var/www/vhosts/fwolf.com/include/fwolflib/func/config.php) is not within the allowed path(s): (/var/www/vhosts/fwolf.com/httpdocs:/tmp) in <b>/var/www/vhosts/fwolf.com/httpdocs/info.php</b> on line <b>4</b><br />
<br />
<b>Warning</b>:  require_once(/var/www/vhosts/fwolf.com/include/fwolflib/func/config.php) [<a href='function.require-once'>function.require-once</a>]: failed to open stream: Operation not permitted in <b>/var/www/vhosts/fwolf.com/httpdocs/info.php</b> on line <b>4</b><br />

<br />
<b>Fatal error</b>:  require_once() [<a href='function.require'>function.require</a>]: Failed opening required '/var/www/vhosts/fwolf.com/include/fwolflib/func/config.php' (include_path='.:/var/www/vhosts/fwolf.com/include') in <b>/var/www/vhosts/fwolf.com/httpdocs/info.php</b> on line <b>4</b><br />

原来是有个open_basedir限制,找了一下是在$HOME/conf/httpd.include里,这个文件是由plesk自动维护的:

<IfModule sapi_apache2.c>
    php_admin_flag engine on
    php_admin_flag safe_mode off
    php_admin_value open_basedir "/var/www/vhosts/fwolf.com/httpdocs:/tmp"
</IfModule>
<IfModule mod_php5.c>
    php_admin_flag engine on
    php_admin_flag safe_mode off
    php_admin_value open_basedir "/var/www/vhosts/fwolf.com/httpdocs:/tmp"
</IfModule>

看到没,只允许包含httpdocs下的文件。open_basedir影响的范围是fopen, require, include之类的函数,在一定程度上加强了安全防护。

问题

但open_basedir也有局限性,它不会影响那些执行系统命令的函数,比如exec, system,如果我想偷主机上另外一位同学的文件(内容),也不见得非要去用require包含过来或者种个hack过去,直接system('cat /path/to/file')不是更省事么?

system函数有时候还是能派上正当用场的,直接禁用不是什么好办法,现在流行chroot,就是用户的/就是自己的$HOME,压根儿就访问不到别人的文件,什么open_basedir, exec, dl都不用禁用,我觉得这才是安全和方便的最佳接合点。

以前用(dv)3.0的时候,手工配置使用fastcgi的php5就是这样,每个用户的cgi用自己的身份,在自己的chroot环境下运行。

不过plesk现在的版本8、将来的版本9都没有要直接使用fastcgi解析php的打算,在“更远的计划里”,才可怜兮兮的有这么一句:

Use PHP via FastCGI rather than Apache module

参见:Parallels Summit 2008 – Day 1,所以就只能自己动手了。

fastcgi

很走运,找到了一个2天前刚刚出炉的脚本:Script for using php-cgi instead of mod_php,专门针对plesk,禁用掉mod_php,然后用它来配置fcgi解析。

使用环境:Plesk 8.X on Centos 5.X,依赖:

  • 禁用mod_php,开启mod_fcgid
  • python-curl, PyXML
  • php开启–enable-fastcgi, –enable-force-cgi-redirect

文件需要解压到/root/bin/下,自己一个子目录,幸好我也是用这个bin目录的。

然后在Server -> Control Panel -> Event Manager里添加自定义事件,在增加、修改、删除domain的时候,自动调用这个脚本。(subdomain的删除没有包含,手工删除文件就可以了)设置好大概就是这个样子:

using php-cgi instead of mod_php, plesk event manager

还要把/etc/httpd/conf.d/php.conf删得只剩一行:

LoadModule php5_module modules/libphp5.so

并且在/etc/httpd/conf.d/fcgid.conf里加一句:

PHP_Fix_Pathinfo_Enable 1

不过,这种方法作到一半我就没有继续了,因为我想起来前几天一位朋友和我提到过的suPHP。

suPHP

个人感觉suPHP是最“正统”的解决方案,它是以文件属主用户的身份来运行,正好使用各个用户的权限实现访问限制。

没找到centos的mod_suphp包,只好下载suphp 0.6.3源码自己编译,不过之前要先修改src/apache2/mod_suphp.c,在324行替换掉两行内容:

//AP_INIT_ITERATE("suPHP_AddHandler", suphp_handle_cmd_add_handler, NULL, ACCESS_CONF, "Tells mod_suphp to handle these MIME-types"),
AP_INIT_ITERATE("suPHP_AddHandler", suphp_handle_cmd_add_handler, NULL, RSRC_CONF | ACCESS_CONF, "Tells mod_suphp to handle these MIME-types"),
//AP_INIT_ITERATE("suPHP_RemoveHandler", suphp_handle_cmd_remove_handler, NULL, ACCESS_CONF, "Tells mod_suphp not to handle these MIME-types"),
AP_INIT_ITERATE("suPHP_RemoveHandler", suphp_handle_cmd_remove_handler, NULL, RSRC_CONF | ACCESS_CONF, "Tells mod_suphp not to handle these MIME-types"),

然后就是编译安装那三板斧:

# ./configure\
--with-apxs=/usr/sbin/apxs\
--with-php=/usr/bin/php-cgi\
--with-logfile=/var/log/suphp.log\
--with-min-uid=10000\
--with-min-gid=10000\
--with-apache-user=apache\
--with-apr=/usr/bin/apr-1-config\
--with-setid-mode=owner\
--prefix=/usr\
--sysconfdir=/etc
# make
# make install

/etc/httpd/conf/httpd.conf中加入一句(这一句也可以放到后面的suphp.conf中):

LoadModule suphp_module modules/mod_suphp.so

关闭safe_mode,并且注释掉下面两句:

safe_mode = Off
#AddType application/x-httpd-php .php
#AddType application/x-httpd-php-source .phps

创建suphp的conf文件,使用源码中的conf文件模板:

# cp doc/suphp.conf-example /etc/httpd/conf.d/suphp.conf

修改之:

<Directory /var/www/vhosts>
    RemoveHandler x-httpd-php
#   php_admin_value engine off
    AddHandler x-httpd-php .php .php3 .php4 .php5
    suPHP_AddHandler x-httpd-php
    suPHP_Engine On
    suPHP_ConfigPath /etc/php.ini
</Directory>

禁用mod_php,把php.conf文件换一个扩展名就行了:

# cd /etc/httpd/conf.d
# mv php.conf php.conf.bak

创建suPHP的配置文件/etc/suphp.conf,这个文件和用于apache配置的conf是不一样的,其内容如下,可根据具体环境设定参数:

[global]
;Path to logfile
logfile=/var/log/suphp.log

;Loglevel
;loglevel=info
;info, warn, error
loglevel=warn

;User Apache is running as
;webserver_user=wwwrun
webserver_user=apache

;Path all scripts have to be in
docroot=/var/www/vhosts/

;Path to chroot() to before executing script
;chroot=/mychroot

; Security options
;allow_file_group_writeable=false
allow_file_group_writeable=true
;allow_file_others_writeable=false
allow_file_others_writeable=true
;allow_directory_group_writeable=false
allow_directory_group_writeable=true
;allow_directory_others_writeable=false
allow_directory_others_writeable=true

;Check wheter script is within DOCUMENT_ROOT
check_vhost_docroot=true

;Send minor error messages to browser
;errors_to_browser=false
errors_to_browser=true

;PATH environment variable
env_path=/bin:/usr/bin

;Umask to set, specify in octal notation
;umask=0077
umask=0022

; Minimum UID
;min_uid=100
min_uid=10000

; Minimum GID
;min_gid=100
; Consider of psacln, psaserv
min_gid=200

; Use correct permissions for mod_userdir sites
;handle_userdir=true


[handlers]
;Handler for php-scripts
;x-httpd-php=php:/usr/bin/php
x-httpd-php=php:/usr/bin/php-cgi

;Handler for CGI-scripts
x-suphp-cgi=execute:!self

现在,重启apache,就可以啦!如果发现返回空页面,并且错误log中有如下内容:

Premature end of script headers:

那有可能是因为你把cli模式的php可执行文件拿过来当cgi模式的用了,注意他们的区别:

# php -v
PHP 5.2.6 (cli) (built: May  2 2008 16:06:40) 

# php-cgi -v
PHP 5.2.6 (cgi-fcgi) (built: May  2 2008 16:01:17)

把正确的cgi模式php执行文件设定到/etc/suphp.conf中即可。

chroot的疑惑

由于以前为了安全,ssh权限都是限定在chroot环境下,这样用户无法访问自己$HOME之外的内容。使用了suPHP之后,虽然php文件是以用户身份运行的,但却不是chroot的环境。也就是说,“理论上”在php文件执行的时候,可以访问其他用户的文件,这不也是个安全隐患么?

为了这个问题,我翻阅了好多资料,却发现很少人提起这个东西,suPHP安装不复杂,介绍的也不少,就是没有和chroot搭配的,倒是有人提出和fastcgi搭配使用。后来和michael沟通后才突然醒悟,suPHP的伪装身份和chroot是两种机制,之间没有什么联系,所以也就不存在什么配套使用的问题。至于不想让用户访问别人的文件,完全可以通过设定文件权限来实现嘛,不过还是要在安全方面比以前更加留心:

  • $HOME下系统自动创建的目录,一般属主都是user:psaserv或者root:root,有些对所有人都有rx权限(755),有些则是750权限,私密文件不要往755权限的目录下放。这些目录一般不宜改为750权限,因为有些文件是其他系统服务需要读取的。
  • $HOME下httpdocs, private等目录默认就是禁止所有人访问的,保持这样不要更改,并且httpdocs下的文件你就是搞成777权限,别人也访问不到。
  • 用户自建的文件、目录一般为user:psacln权限,主机上所有host用户所属组都是psacln,所以如果不想让别人访问,又没有上级目录的权限限制的话,一定调整为700权限。
  • 为了使用更方便,可以把$HOME目录的属主设为用户本身,比如chown fwolf:psaserv /var/www/vhosts/fwolf.com,不过这就需要一个个的单独开通了。
  • 如果发现其他系统文件中有泄密的,或者其他用户没有设置好权限,存在安全隐患,请及时告诉我或者相应用户,这样我们才是和谐的一家人嘛 🙂

取消chroot,还有一个好处就是用户几乎能够使用主机上的所有命令了,不像以前那样用哪个就需要把哪个设置到chroot的jail中,方便多了。

chroot的取消不是自动的,我已经给所有用户加上了可指定/bin/bash作为登录shell的权限,用户在plesk的站点设置中,把ssh用户的登录更换为/bin/bash即可,当然如果对安全没有信心,觉得chroot也够用的用户可以保留。

其他

suphp比suexec(就是原来dv3.0升php5的方法)要快一点;比suphp更快的还有suphp_mod_php;再快一些的是mpm-peruser,不过安装配置的麻烦程度也随之递增。

相比而言,suPHP速度还算可以接受(对于负载不是很大的站),配置方便,不用修改每个virtualhost的参数(就是$HOME/conf/vhost.conf),直接改apache的总conf就ok了,当然也比上面fastcgi方式下用event触发脚本来实现更加简洁。

参考

生成用于web服务器的openssl证书

启用https,就一定要有ssl证书,MT主机上有一个默认的证书,但是签署给plesk这个域名的,并且没有根证书认证,所以,自己搞个CA,给自己签个假证书用吧,至少好看些。

说实话,关于证书这些我也是一知半解,以前弄过apache的ssl,但那只是简单的处理,没有CA什么的,这次我上网搜集了不少资料,走了一个算是更“高级”一点的方式吧,不过出来的证书使用起来没有大差别。

注:所有操作在/big2/tools/ca下进行。

准备根证书

准备一些空目录和文件,作用如下:

  • certs/ 保存颁发的所有证书的副本
  • index.txt 跟踪已颁发的证书,初始为空
  • openssl.cnf openssl和根证书的配置文件
  • private/ CA证书的私钥
  • serial 最后一次颁发的证书的序列号,初始值01,也可以是00等其它值

openssl.cnf内容如下,我一气儿弄了10年的有效期:

[ ca ]
default_ca = FwolfCA

[ FwolfCA ]
dir = /big2/tools/ca
certificate = $dir/cacert.pem
database = $dir/index.txt
new_certs_dir = $dir/certs
private_key = $dir/private/cakey.pem
serial = $dir/serial

default_crl_days= 7
default_days = 3650
default_md = sha1

policy = FwolfCA_policy
x509_extensions = certificate_extensions

[ FwolfCA_policy ]
commonName = supplied
stateOrProvinceName = supplied
stateOrProvinceName = supplied
countryName = supplied
emailAddress = supplied
organizationName= supplied
organizationalUnitName = optional

[ certificate_extensions ]
basicConstraints= CA:false

# 下面是根证书的配置信息

[ req ]
default_bits = 4096
default_keyfile = /big2/tools/ca/private/cakey.pem
default_md = sha1
prompt = no
distinguished_name = root_ca_distinguished_name
x509_extensions = root_ca_extensions

[ root_ca_distinguished_name ]
commonName = Fwolf CA
stateOrProvinceName = The Earth
# countryName只能是两位字母
countryName = CN
emailAddress = one_mail_of_fwolf@gmail.com
#organizationName = Root Certification Authority
organizationName = Fwolf CA Root
[ root_ca_extensions ]
basicConstraints = CA:true

然后生成根证书:

$ openssl req -x509 -newkey rsa:4096 -out cacert.pem -outform PEM -days 3650 -config openssl.cnf

会提示输入密码以及确认密码。生成好以后可以验证一下(说是验证,其实就是看看内容):

$ openssl x509 -in cacert.pem -text -noout

给自己颁发证书

$ openssl req -newkey rsa:4096 -keyout office.fwolf.com.key.pem -keyform PEM -out   office.fwolf.com.req.pem -outform PEM -sha1

按提示输入两次密码,然后输入几项证书信息,注意其中organizationName必须输入,并且Common Name要和域名一致,比如:

Common Name (eg, YOUR name) []:*.fwolf.com

就生成了私钥key文件和请求req文件,然后把req文件提交给CA根证书签署(盖章):

$ openssl ca -in office.fwolf.com.req.pem -config openssl.cnf

输入根证书的密码,就会在certs/目录下生成.pem证书文件,文件名以serial中的序号开头,信息会存储在index.txt中。

这样生成的证书,在apache中配置需要两条语句,分别指定证书和私钥:

SSLEngine On
SSLCertificateFile /big2/tools/ca/certs/office.fwolf.com.cert.pem
SSLCertificateKeyFile /big2/tools/ca/certs/office.fwolf.com.key.pem

其实这两个文件是可以合并为一个文件的:

$ cat office.fwolf.com.key.pem office.fwolf.com.cert.pem > office.fwolf.com.pem

然后在配置apache的时候就只需要一句了:

SSLEngine On
SSLCertificateFile /big2/tools/ca/certs/office.fwolf.com.pem

其它

去掉证书的口令

现在证书基本上就可以使用了,再返回来说一个问题,就是在启动apache的时候会提示输入私钥的口令,要想去掉这个(一般都不会喜欢这样的),就要求在生成私钥的时候不要设置口令:

$ openssl req -newkey rsa:4096 -keyout office.fwolf.com.key.pem -keyform PEM -out   office.fwolf.com.req.pem -outform PEM -sha1 -nodes

生成根证书的时候还是建议带上个口令,提高安全性。

index.txt

另外,如果要清空index.txt的话,一定要清空到字节0,里面有一个字节都会导致openssl ca错误:

wrong number of fields on line 1 (looking for field 6, got 1, '' left)

证书吊销

$ openssl ca -revoke office.fwolf.com.cert.pem
# 生成CRL列表 $ openssl ca -gencrl -out exampleca.crl # 查看CRL列表信息 $ openssl crl -in exampleca.crl -text -noout # 验证CRL列表签名信息 $ openssl crl -in exampleca.crl -noout -CAfile cacert.pem 可以看到CRL的版本号为1,这是OpenSSL默认的,除非crl_extensions被指定在配置文件ca一节中。

上传到MT主机上应用

首先在Server > Certificates >Add New Certificate,填上Add New Certificate(自己起),然后选下面的Private key私钥文件和Certificate证书文件上传,就存到服务器上了。

然后返回证书列表,选中新上传证书前面的复选框,点上面的链接Make default for Web sites设置为网站默认证书,也可以通过Secure control panel将其设置为控制面板所使用的证书。

还没完,证书还得加到ip上才能生效,Server > IP Addresses >中修改ip地址属性,在SSL Certificate中选择刚才上传的证书,保存,就立刻生效了。

基于ssl/https协议的特性,一个ip上只能使用一个证书,所以合租用户是无法自己上传或者选择其它证书的,不过我现在使用的证书是签给“*”的,也就是所有域名都可以使用,“好看”一点。让我不理解的是,如果在访问一个域名时同意了这个证书,在访问另外一个域名的时候还得再同意一遍,也就是证书和域名是要配套使用的,和我原先的想法不太一致。

参考资料

MT主机控制面板Plesk合租用户使用指南

我们是7月19号租下的主机,看到有些邻居拿到控制面板权限之后不知道该怎么用,决定写下这篇指南,希望对大家有帮助,同时也能让大家了解一下MT的控制后台。我们目前使用的Plesk版本是8.2.0。

首先使用管理账号分配一下合租用户demo,权限和其他合租用户一样,但是一些服务器管理相关的界面就看不到了。为了陈述准确,主要按照英文操作界面讲解,使用中文界面的同学请自行对应一下。说明顺序主要是按照菜单的顺序来讲,不过看完之后相信你应该知道怎么用了。

登录控制面板,地址为https://fwolf.com:8443,在第三个选择框中可以选择中文操作界面CHINESE(CHINA)登录控制面板

登录进去以后,Plesk会首先要求你输入一些个人信息,建议除了邮件地址,其他的随意输就可以了,当然也可以改掉我给你们分配的初始密码: 输入个人信息

然后,就进入了正式的管理页面,首先显示的是Desktop页,先看右边,Plesk News部分基本上占据了整个屏幕,不过这都是和Plesk相关的一些新闻,比如说这个版本有什么新功能之类的,不用管它,重要的东西在下面: Desktop页的快捷管理链接

这里是Plesk的一些快捷管理链接,比较常用的管理功能放在了这里,以及你目前已经使用的磁盘空间、带宽情况。虽然比较方便,但是不推荐大家使用这里来进行设置,尤其是不太熟悉的时候,比如DonglaiJev在这里删除域名的时候就不成功,而使用正常管理功能就没事了,Plesk也不见得就没有bug嘛。

右边基本上就这么多东西了,再来看看左边的仿XP风格菜单: 菜单

从上到下,依次是:

  • Desktop,就是你刚进来的时候看到的那一页,没啥用。
  • Home,所有完整管理功能都在这里了,后面我详细介绍。
  • Sessions,谁同时在使用web控制面板和ftp。
  • Log out,退出控制面板。
  • Help,帮助,好像有中文,不过听说翻译得挺次。

账号管理

下面,开始介绍Home里的管理功能,先看一下界面: Home screen

Tools组功能

  • Edit,编辑账号信息,登录密码、电话、邮箱什么的,基本上第一次登录时要求输入的信息都可以在这里更改,再次说明,这只是Plesk要求用户输入的内容而已,和主机的管理和设置没有什么太大关系。
  • Report,本账号的相关信息及总体资源使用报告,里面还有一个Bandwidth Usage History可以查看带宽占用的历史情况。
  • Preferences,个人选项,里面可以选择Interface language界面语言(比如换成中文的);Interface skin界面的外观,不建议修改;Allow multiple sessions是否允许多人使用这个管理账号同时在线,一般这个选项我是不关的,关闭它的唯一好处就是当你登录的时候别人用你的账号就进不来了,鸡肋;最后一项字比较多的Prevent users from working with the control panel until interface screens are completely loaded.意思是当页面还没有加载完的时候,不让用户进行任何操作,建议打勾,页面没下载完的时候会显示一个载入中的标记。
  • Permissions,用户的权限,在这里你能看到自己拥有访问控制面板、创建域名、管理物理主机、管理php的safe模式等各种权限,合租用户的设置都是一样的,当然也关闭了一些用不到或者不开放的权限。
  • Limits,用户的限制,也就是用户一共被分配了多少资源,在这个页面你能看到自己拥有1个域名,无限个子域名或别名,1000MB磁盘空间,50G月流量等资源。
  • IP Pool,ip池,看看自己被分配了哪些/个ip地址,我们只有一个ip,所以大家就共用这一个了,此项不用更改。
  • Skeleton,home目录模板管理,强烈建议不要修改,并且依照模板创建的实际文件owner是root,用户通过ssh上去也更改不了,这些限制是必要的,因为每个目录都有特定的功能,比如httpdocs就是主页文件所在的目录,你要事擅自把它改成别的名字,网站就无法访问了。
  • Logo Setup,设置自己的图标,无用功能。
  • Custom Buttons,自定义按钮,把常用功能添加到左边的菜单或者Desktop页面,建议熟悉了以后再研究这个,不过也没人天天登上来研究这个吧?
  • Backup,备份,可以备份账户信息、域名以及域名下所有上传的文件,可以定时、分卷备份,备份文件还可以上传和下载,可以从备份文件中恢复文件及设置,是一个非常方便的功能。本来还可以自动把备份文件上传到其他ftp服务器上的,但我没有开此功能。
  • Add New Domain,添加域名,这就是创建网站的第一步了,后面详细讲。
  • Domain Templates,域名模板,管理多个域名的时候,通过模板能够方便设置过程,不过我们用不到。
  • Register,注册域名,不过是连到https://myplesk.com/网站的,大家还是自行到大服务商去注册域名吧,不建议使用此功能。
  • Manage,管理你在https://myplesk.com/注册的域名,同上条,无用。
  • MyPlesk.com,参见上两条,到https://myplesk.com/为你的域名购买附加的管理工具,不建议使用。
  • Traffic,当前账户下所有域名和子域名的资源占用情况。

Info组功能,目前资源使用情况一览,比如:

1 domains, 1 active domains, 86.4 MB disk space used, 459 MB traffic used

Domains组,添加了域名或子域名之后会在这里显示列表。

域名管理

现在我们就需要点上面说的Add New Domain按钮把我们的域名添加进来: 添加域名

Domain name是必填的,在创建顶级域名之前是不能创建子域名的,www建议也勾选上,Select template是选择域名模板,我们用不到,Select an IP addressIP地址也不用选,后面的Proceed to hosting setup要打勾,剩下的就是一些账号信息不用动,点ok进入主机类型设置页面: 主机设置页面

首先注意一下最上面的警告信息:

Warning: The domain resolves to another IP address (65.214.57.173). Please correct DNS settings.

当你添加域名的时候,如果此时域名并没有解析到我们的主机地址,就会出现这条提示,因为在你做好ip地址解析之前,在Plesk中再怎么设置,也是看不见效果的。我演示时添加的域名是demo.com,这个域名至少价值百万,要真是我的就好喽。

下面选择Hosting type主机类型,有三种可选:

  • Physical hosting,物理主机,就是主机放在本服务器上,我们都要选这项。
  • Standard forwarding,标准转发,就是你访问demo.com的时候,我给你跳转到google.com。
  • Frame forwarding,带frame的转发。

选好之后ok进入主机详细设置页面: 主机详细设置

  • IP Address和Certificate,IP地址与证书(ssl用),统一设置的,不能更改。
  • SSL support,是否支持ssl,也就是https://www.fwolf.com这样的访问,文件默认放到httpsdocs目录下。
  • Use a single directory for housing SSL and non-SSL content,使用ssl的站点和不使用ssl的站点共用一个目录(一套文件),在这里要注意一下,这个选项和上一个SSL support如果同时启用的话,访问可能会自动跳转到https方式,而我们的ssl证书又肯定不是经过CA认证颁发的,所以会弹出证书过期、无效的提示框,影响阅读体验,没必要的话就不要使用ssl方式了,对服务器来说也可以略微减轻一些负担。
  • FTP Login,ftp用户名,ftp地址就是我们的主机地址,如果启用了ssh,ftp用户/密码也就是ssh的用户/密码。
  • Old FTP password/New FTP password/Confirm Password,设置ftp密码。
  • Hard disk quota,磁盘限额,在管理多域名或子域名的时候有用。
  • Shell access to server with FTP user’s credentials,是否允许ssh访问,这里我限定了两个选项:禁用和chroot方式的bash shell,至于为何限制chroot方式我有过说明在方案中也讲了,选择启用的话会有一个安全提示,在这里我也提醒大家保管好自己的ftp密码,不需要的时候尽可以关掉,安全第一嘛。

下面Services组里面就是管理对各项语言的支持了,一般我们架WordPress的话选中SSI support服务器端包含、PHP supportPHP语言支持并关闭PHP 'safe_mode' on安全模式就足够了,需要架MoveType的话就选上CGI supportCGI支持,需要升级到PHP5的话再选上FastCGI support就行。如果Web statistics选上AWstats可以启用基于apache log文件的统计系统,选中accessible via password protected directory '/plesk-stat/'要求必须使用密码才能访问统计结果(plesk密码),访问地址就是类似http://www.fwolf.com/plesk-stat/的形式,另外一个统计系统Webalizer我没用过。

这些全部都选好之后,按ok就完成了域名的建立,默认返回域名管理页面,和在Home页面点域名列表中的域名进入是一样的: 域名管理页面

Domain组功能:

  • Switch Off,暂时关闭域名,大家用不到吧 :)。
  • Report,本域名的相关信息及总体资源使用报告,比账户的报告要详细些,还有网站统计等功能。
  • Limits,本域名的资源限制情况一览,是账户资源限制的子集。
  • Domain Aliases,域名别名管理,比如可以让game.com作为demo.com的别名,不过内容还是一套。
  • Domain Administrator,为这个域名单独创建一个管理员账号,可以独立登录Plesk控制面板进行管理,对于多域名账户管理有用。
  • Register,同账户管理的相应功能。
  • MyPlesk.com,同账户管理的相应功能。
  • Backup,备份,同账户管理的相应功能。
  • Custom Buttons,同账户管理的相应功能。

Services组功能:

  • Mail,邮件账号管理,MT自带邮件服务器,不过想来大家也用不到,就没有开,邮件也不适合架在合租服务器上,数据的管理、备份和迁移都是问题。
  • DNS Settings,DNS管理,如果把MT主机作为dns服务器,可以自行设置dns解析记录,不过Plesk本身提供的子域名管理结合域名注册商的解析功能我想已经能够满足大家的日常需要了,就没有开放。
  • Databases,数据库管理,可以自己创建mysql数据库,同时创建完毕之后千万不要忘记点你刚刚建好的库,然后创建数据库用户,发现有些朋友就是找不到Add New Database User,另外一个DB WebAdmin是web界面的数据库管理工具,其实就是一个phpMyAdmin
  • Certificates,如果你有自己的站点证书,可以上传过来,或者到https://myplesk.com/申请。证书属于奢侈品,一般用站点默认的即可,自己创建的证书没有CA给认证也没用。
  • Tomcat,java应用程序服务器,java功能本身就没有开,所以这个功能是灰色的不可用。

Hosting组功能:

  • setup,主机设置,如果你刚才在设置主机的时候中途停止了,可以点这个继续设置,已经设置好的可以修改配置。
  • Delete,删除域名,慎用,域名下的文件会被一并删除的。
  • Web Users,web用户,没怎么用过,大概是WebDAV的用户。
  • Subdomains,子域名管理,比如创建一个soft.demo.com,个数不限,可以单独为子域名设置ssl、ftp用户以及各种服务端语言支持,子域名的文件存放在subdomains/子域名名称目录下,和主域名是完全分开的。
  • Protected Directories,受保护的目录,并且可以为每个目录创建用户,我理解就是通过http认证的用户,并且可以设置使用http://demo:pass@fwolf.com/dir的方式访问受限资源,这个远不如程序所提供的用户管理功能方便,不建议使用。
  • Anonymous FTP,匿名ftp访问,没开放此功能。
  • Log Manager,日志管理,可以查看apache的access和error log,并且可以定义日志按文件大小或日期截断,可以压缩日志,可以把统计程序处理过的日志发送到邮箱。
  • File Manager,文件管理器,可以管理你服务器上所有文件的一个web界面。
  • SSH Terminal,网页上的ssh客户端,我用的firefox,肯定是用不了了,ie下的话应该也要安个插件什么的,需要java支持(感谢Michael补充),但仍建议改用putty等专业工具访问ssh。
  • Crontab,定时任务,和linux下的crontab一样,只是改成了web界面,连任务的时间参数格式都是一样的,可以参见man 5 crontab
  • Application Vault,应用程序仓库,通过它可以快速安装WordPress、pLog、gallery等多种程序,不过出于学习的目的,不建议大家偷懒,还是手工安装吧,另外仓库里程序的版本也稍微落后一点。
  • Site Preview,预览站点。

再往下就是此域名下的所有资源情况了: 域名下的资源情况

左边的Used是已经使用的资源数量,右边的Allowed是总共拥有的资源数量,一目了然。

小结

怎么样?有点大体概念了吧,感觉有点乱的话,我再介绍一个开始建站的最简单流程:

  • 登录控制面板。
  • 点左边菜单的Home,打开详细管理功能。
  • 点右边的Add New Domain,添加域名并设置主机信息,一路按提示操作。
  • 点已添加的域名进入域名管理页面,默认添加完域名就是这个页面。
  • Databases中创建数据库。
  • 点刚才建的数据库,创建数据库用户。
  • 差不多了,解析域名、上传文件之后,网站内容就可以访问了。

最后,再次提醒大家,虽然我尽所能保证主机的安全,仍然需要各位保管好自己的密码、设置相对复杂的密码、密码定期更改、关闭不使用的ssh账号,尽最大可能防止坏人侵害;另外就是经常备份数据,包括数据库和网站内的重要内容,并下载下来异地保存,天灾人祸不随我们的意志而转移,blog都是大家的心血,无价之宝,一定要妥善保管。