联系方式

d2FuZ0B5dWVtYWlsLmNvbQ==

Setting up Debian 7.0 Wheezy web server

by 猫小星经济人

发布时间:2013-07-14 16:43本文标签:ApacheDebianMySQLPHPWeb Server

Debian 7.0在13年5月4日发布,我重新配置了一个采用Debian 7.0的产品级服务器,下面是完整的配置过程。

增强SSH的安全性

新Box的第一步总是增强SSH的安全性。很多软件每天都在扫描SSH的22端口,因此要改变默认端口。在进行SSH的操作是最好打开两个SSH客户端,两个都登陆后用其中一个操作,因为SSH配置一不小心就会把自己锁在外面。此外禁用root的直接登录也是一个好办法。

pico /etc/ssh/sshd_config

找到:

Port 22

改为:

Port 新的端口号

找到:

PermitRootLogin yes

改为:

PermitRootLogin no

保存并退出。在重新启动SSH之前,要添加一个用来SSH登录的用户:

useradd example_user_name

passwd example_user_name

mkdir /home/example_user_name

chown example_user_name:users /home/example_user_name

现在重新启动SSH:

/etc/init.d/ssh restart

重新登录SSH,确保用原始端口22无法连接SSH。确保用root用户名无法登录SSH。

更新软件包

aptitude update

aptitude upgrade

aptitude dist-upgrade

删除不用的软件包

对于一个production server,理论上仅需要apache、mysql和php即可。我的box安装的是Debian 7 min,因此只有少数几个需要卸载的软件包:

aptitude --purge remove nfs-common nfs-kernel-server

aptitude --purge remove analog

aptitude --purge remove spamassassin spamc python-newt mutt libapache2-mod-perl2 libapache2-mod-python

dpkg --purge $(COLUMNS=132 dpkg -l | grep ^rc | awk '{ print $2; }')

禁用IPV6

输入:

echo net.ipv6.conf.all.disable_ipv6=1 > /etc/sysctl.d/disableipv6.conf

reboot

重启后内核会禁用IPV6。

输入:

netstat -tunlp

会看到所有使用ipv6的服务。下面禁用这些IPV6服务。

pico /etc/ssh/sshd_config

添加:

AddressFamily inet

重新启动SSH:

/etc/init.d/ssh restart

pico /etc/netconfig

注释掉IPV6有关的内容:

#udp6 tpi_clts v inet6 udp - -

#tcp6 tpi_cots_ord v inet6 tcp - -

pico /etc/hosts

注释掉所有IPV6的地址。

pico /etc/bind/named.conf.options

找到:

listen-on-v6 { any; }

改为:

listen-on-v6 { none; }

pico /etc/default/ntp

找到:

NTPD_OPTS='-g'

改为:

NTPD_OPTS='-4 -g’

重新执行:

netstat -tunlp

会看到仅剩下IPV4。

安装Apache、PHP和MySQL

aptitude install php5 php5-gd php5-cgi php5-mysql mysql-server mysql-client php5-curl lynx php-pear ca-certificates xml-core apache2 libapache2-mod-php5

安装APC

aptitude install php5-dev

pecl install apc

安装其他软件

因为我需要mount网络地址,因此安装cifs:

apt-get install cifs-utils

rcconf是一款可以方便设置启动程序的工具,我用它禁用诸如bind9这样不需要的服务

apt-get install rcconf

设置MySQL的安全属性

对于一个新Box,mysql的root是没有密码的。首先登录Mysql:

mysql -uroot

然后查看用户:

SELECT User, Host, Password FROM mysql.user;

会看到root和空用户名的用户,后者是匿名用户。

首先使用一条UPDATE语句为所有root账户设置密码,密码通过PASSWORD()函数加密:

UPDATE mysql.user SET Password = PASSWORD('root-user-password-here') WHERE User = 'root';

对于匿名用户,则直接删除,如:

DROP USER ''@'localhost';

MySQL还有一个特性就是让用户可以使用任何test或test_.开头的数据库进行测试。在一个production server中这个特性应该被移除:

DELETE FROM mysql.db WHERE Db LIKE 'test%';

FLUSH PRIVILEGES;

DROP DATABASE test;

配置MySQL

pico /etc/mysql/my.cnf

按照服务器配置和数据库结构情况修改以下参数:

[mysqld]

key_buffer =

max_allowed_packet =

max_connections =

table_cache =

对于需要使用中文的服务器,依然要显示的让mysql以utf-8方式编码:

[client]

default-character-set = utf8

[mysqld]

init-connect = 'SET NAMES utf8'

[mysql]

default-character-set = utf8

安装phpMyAdmin

apt-get install phpmyadmin

中途需要输入MySQL的root密码,以及设置一个phpmyadmin使用的密码。安装程序会自动修改Apache的设置。

配置PHP

pico /etc/php5/apache2/php.ini

设置如下数值:

short_open_tag = Off

date.timezone =

expose_php = Off

max_execution_time = 150

mysql.allow_persistent = Off

配置Apache

首先了解下Debian下Apache的特殊结构。实际上这也是选择Debian作为production server的原因。Debian下的Apache精心设计了优雅的结构:

  1. Apache 2的目录为/etc/apache2
  2. apache2.conf是配置文件的入口和起点。对于一个production server,需要按照硬件情况修改mpm_prefork_module的参数
  3. conf.d里面是几个独立的配置文件
  4. ports.conf是apache监听的端口,默认是80无需修改,ssl和gnutls模块的端口也在这里面定义
  5. 所有模块的配置都在mods_available里,.conf是模块的配置,.load是加载文件路径。Debian下的apache有专门的a2dismod和a2enmod命令禁用和激活模块,激活的模块被连接到mods_enabled里
  6. 站点配置在sites_available里,和模块一样有a2dissite和a2ensite来维护和sites_enabled的连接

下面开始修改一些Apache的基本配置。

pico /etc/apache2/apache2.conf

按照box的实际配置修改以下参数:

Timeout

MaxKeepAliveRequests

<IfModule prefork.c>

MinSpareServers

MaxSpareServers

MaxClients

MaxRequestsPerChild

</IfModule>

pico /etc/apache2/conf.d/security

进行如下设置:

ServerTokens Prod

ServerSignature Off

pico /etc/apache2/conf.d/phpmyadmin.conf

这是刚刚安装phpmyadmin后自动生成的文件。现在需要修改一些默认配置,首先要修改的是访问phpmyadmin的URL,因为很多bot都在扫描默认的url寻找老版本的漏洞。

将:

Alias /phpmyadmin /usr/share/phpmyadmin

改为

Alias /其他名字/usr/share/phpmyadmin

为该目录的访问增加密码验证:

将以下内容添加到<Directory /usr/share/phpmyadmin>中:

AuthType Basic

AuthName "phpMyadmin"

AuthUserFile "/usr/share/phpmyadmin/.htpasswd"

Require valid-user

当然还要创建.htpasswd文件:

cd /usr/share/phpmyadmin

htpasswd -c .htpasswd user-name-for-phpmyadmin-login

pico /etc/apache2/sites-available/default

这个是默认站点,注释掉 <Directory />和cgi-bin。在这里可以看到服务器的“主站”目录在/var/www下。可以进入该目录为访问服务器IP的用户显示点特别的内容。

因为对Apache的配置改动较多,很容易出现错误,因此最好的办法就是改动几处后就测试下配置是否正确,并重新启动Apache:

apache2ctl -t

/etc/init.d/apache2 force-reload

还要删除没有用的Alias:

pico /etc/apache2/mods-enabled/alias.conf

注释掉跟Icons有关的Alias。

在mods_enabled里是所有已经加载的模块,可以删除不需要的模块:

a2dismod autoindex

a2dismod cgi

a2dismod status

Apache模块的定义可以在这里找到:http://httpd.apache.org/docs/current/mod/

同样可以将需要的模块加入mods=enabled,如:

a2enmod rewrite

a2enmod expires

a2enmod headers

每个模块都有同名的.conf文件完成配置。比如dir.conf,可以按照网站的实际情况减少扩展名查询:

pico /etc/apache2/mods-enabled/dir.conf

修改为:

<IfModule mod_dir.c>

DirectoryIndex index.php index.html index.htm

</IfModule>

另一个值得配置的模块式mod_deflate,mod_deflate将以gzip压缩有压缩价值的文件,而已经压缩过的jpg等需要在mod_deflate中设置避免压缩:

pico /etc/apache2/mods-enabled/deflate.conf

修改成以下配置:

<IfModule mod_deflate.c>

AddOutputFilterByType DEFLATE text/css text/html text/xml application/javascript application/json

<IfModule mod_headers.c>

Header append Vary User-Agent env=!dont-vary

</IfModule>

BrowserMatch ^Mozilla/4 gzip-only-text/html

BrowserMatch ^Mozilla/4\.0[678] no-gzip

BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

</IfModule>

以上配置将仅压缩css、html、xml、js和json文件。mod_headers模块的介入是为了处理proxy带来的问题,而BrowserMatch用来处理老版本浏览器带来的不兼容的问题。

在Debian 6的时候我就注意到mime模块不知为何没有定义json类型,因此需要手动添加,而7.0终于支持了json的mime type。

创建Apache虚拟站点

在配置完Apache后可以开始创建虚拟站点。Debian下我习惯将Apache的站点都保存在/var/www/vhosts下,以主域名作为目录,其下按照网站的构架建立目录,子域名不作为独立站点。

下面以建立example.com为例:

cd /var/www

mkdir vhosts

mkdir example.com

cd example.com

mkdir htdocs  //作为document root

mkdir logs//存放apache的logs

mdir ....  //网站的其它文件,即不会暴露给http的文件

如果使用子域名:

cd htdocs

mkdir www

mkdir subdomain

接下来要修改apache的配置。虚拟站点不妨单独保存在一个配置文件中:

pico /etc/apache2/conf.d/vhosts.conf

然后将网卡上绑定的所有IP地址都填入:

NameVirtualHost 123.123.123.123:80

NameVirtualHost ###.###.###.###.80

为exampe.com创建配置文件:

pico /etc/apache2/sites-available/sample.com

如果使用子域名,所有站点都创建在一个文件。

<VirtualHost 123.123.123.123:80>

ServerName www.example.com

ServerAlias example.com

DocumentRoot /var/www/vhosts/example.com/htdocs/www

CustomLog /var/www/vhosts/example.com/logs/www-access_log combined

ErrorLog /var/www/vhosts/example.com/logs/www-error.log

</VirtualHost>

<VirtualHost 123.123.123.123:80>

ServerName subdomain1.example.com

DocumentRoot /var/www/vhosts/example.com/htdocs/subdomain1/

ErrorLog /var/www/vhosts/example.com/logs/subdomain1-error.log

CustomLog /var/www/vhosts/example.com/logs/subdomain1-access.log combined

</VirtualHost>

使用a2ensite命令将配置文件连接到sites-enabled里:

a2ensite example.com

重启动apache即可。至此服务器配置完毕。可能有人注意到没有配置FTP和email有关的内容。我觉得FTP的作用是方便上传站点,而经过充分测试的产品级的web程序仅需要一次上传,为此安装并开放FTP服务成本太高,只需将需要上传的内容打包到Dropbox之类,或通过web上传到另外的服务器,然后再wget下来即可。对于email我直接委托到Google App。

分享到: