Linode 搭建LNMP/LEMP总结

既然是总结,就属于快餐性质的了,虽然使用Linode不是我第一次接触SSH的相关指令,但毕竟服务器所从事的任务和日常玩的Raspberry Pi以及2012年底买的128M OpenVZ主机是不一样的。

这次在Linode搭建VPS让我对Linux有了更深层次的了解,还是有很大收获的。 之所以不搭建LAMP平台的主要原因,是LAMP吃内存严重。

虽然Linode极力推荐LAMP方案(方便搭设出错概率少),但个人还是希望挑战一把,但没想到整体还是比较顺利的。 代码依据Debian 7 x64平台搭建(个人感觉Debian和Ubuntu实际差异不大,而且安装调试出现问题以后也可以部分参考Ubuntu的文档,但Debian版本更新慢,虽然Ubuntu和Debian底层差不多,但Debian还是相对更加稳定一点),Nginx服务器,PHP Fastcgi引擎,最后加上MYSQL平台和相关防火墙设置保障系统安全。

在开始之前,先习惯更新下程序包:

apt-get update apt-get upgrade

1. 设置时区以及主机名:

dpkg-reconfigure tzdata

echo “vpsgeek” > /etc/hostname

hostname -F /etc/hostname

2. 修改hosts文件(官方文档说与服务器所建主机无关,个人认为这是为了本地解析用的)

nano /etc/hosts

修改格式:

127.0.0.1 localhost.localdomain localhost

12.34.56.78 bjdch.org vpsgeek

2600:3c01::a123:b456:c789:d012 bjdch.org vpsgeek

完成上面的步骤以后,个人经验来看要让主机重启一回,实测中发现如果主机不重启,sudo之类的后期命令会出现错误。 3. 安装Web、PHP、MYSQL服务(第三行和第四行的MYSQL命令执行后需要依据屏幕提示操作,提示都还是挺简单的,主要是创建root代码,系统保护之类的操作)

apt-get install nginx

apt-get install php5-cli php5-cgi spawn-fcgi php-pear

apt-get install mysql-server php5-mysql

mysql_secure_installation

(Linode提供以下内容,每次复制一行,主要作用是把以上程序添加到系统服务里)

cd /opt/
sudo wget -O php-fastcgi-deb.sh http://library.linode.com/assets/1548-php-fastcgi-deb.sh
sudo mv /opt/php-fastcgi-deb.sh /usr/bin/php-fastcgi
sudo chmod +x /usr/bin/php-fastcgi
sudo wget -O init-php-fastcgi-deb.sh http://library.linode.com/assets/1549-init-php-fastcgi-deb.sh
sudo mv /opt/init-php-fastcgi-deb.sh /etc/init.d/php-fastcgi
sudo chmod +x /etc/init.d/php-fastcgi
sudo /etc/init.d/php-fastcgi start
sudo update-rc.d php-fastcgi defaults

4. 安装phpmyadmin (可选)

apt-get install php5-mcrypt apt-get install phpmyadmin

执行完以上命令基础程序基本就装完了,下面是设置部分。 之所以不按照官方教程来操作,是因为官方教程是带有讲解性质的,但实际操作起来会浪费一定的时间,就拿绑定主机头来说,官方教程是先装完Nginx配置一次,重启服务然后再来配置PHP环境,反反复复有时候很疑惑,为此我就走过弯路。 1. 先来配置WEB环境(一次搞定)

nano /etc/nginx/sites-available/网站名

粘贴以下命令(已经包含防注入目录的命令):

server { listen 80; server_name 域名 域名(含WWW形式);

access_log /srv/www/自定义目录/logs/access.log;

error_log /srv/www/自定义目录/logs/error.log;

location / { root /srv/www/自定义目录/public_html;

index index.html index.htm index.php; }

#Error outputs: error_page 400 /400.shtml;

error_page 401 /401.shtml; error_page 403 /403.shtml;

error_page 404 /404.shtml;

error_page 500 502 503 504 /500.shtml;

#PHP Settings
location ~ \.php$ {
try_files $uri =404;
include /etc/nginx/fastcgi_params;
if ($uri !~ “^/防注入目录(相对路径即可)/”) {
fastcgi_pass 127.0.0.1:9000;
}
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /srv/www/自定义目录/public_html$fastcgi_script_name;
}

#phpmyadmin
location /phpmyadmin {
root /usr/share/;
index index.php index.html index.htm;
location ~ ^/phpmyadmin/(.+\.php)$ {
try_files $uri =404;
root /usr/share/;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include etc/nginx/fastcgi_params;
}
location ~* ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
root /usr/share/;
}
}
location /phpMyAdmin {
rewrite ^/* /phpmyadmin last;
}
#phpmyadmin end

}

特别注意,如果该主机头所绑定的网站不需要PHP运行权限(即纯HTML、HTML5等网站),可以视情况只写入绿色文字,这样也能增加子网站安全性如果网站需要自定义错误页面,可以考虑增加橙色文字PHP脚本执行(例如Wordpress之类动态站点),需要包含蓝色文字最后,如果需要在网站虚拟出phpmyadmin目录(慎用!建议建站初期使用,使用后在相关区域前加“#”后重启Nginx服务以增强服务器安全性),可以粘贴红色文字部分使用本脚本时,不要忘记上面代码末尾的大括号“}”。 2. 做文件链接到可用网站列表(类似Windows里的快捷方式,但强大太多了)。

ln -s /etc/nginx/sites-available/网站名 /etc/nginx/sites-enabled

每个网站设置好都必须使用上面的命令建立文件链接。 3. 创建目录,修改权限。 官方的命令我在多次执行时均出现问题,所以还是老老实实手动创建每一个目录吧。其中目录名要和上面设置文档的相对应。

mkdir /srv/www/自定义目录

mkdir /srv/www/自定义目录/public_html

mkdir /srv/www/自定义目录/logs

问题重现:这也是我纠结了很长时间的问题,我的网站是从FTP通过wget方式远程搬家过来的,按理说wget在复制FTP目录时会继承之前的文件权限,但搬家之后的Wordpress只能打开不能更改目录内任何文件,对此我尝试了许多批量修改文件权限的命令均不奏效。最后无意间发现文件夹所属用户和用户组都是root……。 更改文件夹用户权限,恢复到WWW用户组:

chown -R www-data:www-data /srv/www/自定义目录/public_html

logs文件不用管。这样自定义目录权限还是root,应该安全性更高。Linux文件权限管理确实严格。 4. 重启Nginx服务,将域名指向Linode(此处不介绍)。

/etc/init.d/php-fastcgi service nginx restart

如果没有出现错误,网站已经开通。 下面内容是更改端口,添加用户、防火墙和登录失败惩罚机制。 1. 更改SSH、端口 SSH默认端口是22,基于多种因素考虑应该修改掉(从科学上网和反暴力破解角度来看)。

nano /etc/ssh/sshd_config

执行上面的命令,找到开头为“Port 22”的那一行(比较靠前,不用翻页),更改为自己喜欢的端口即可。注意不要与现有的端口冲突。执行完后,运行:

service ssh restart

2. 添加用户 Linode默认安装了sudo所以我们可以直接添加一个普通用户然后施加管理员权限。执行下面的命令:

adduser 用户名 usermod -a -G sudo 用户名 passwd 用户名

有时为了科学上网,我们需要创建特殊的SSH账户,这类账户没有登陆SSH的权限,即用putty以及ssh命令登陆后即时被系统剔除,其实这类用户主要是通过特殊命令不创建home文件夹达到的。执行以下命令即可:

sudo useradd -r -s /bin/false 用户名 passwd 用户名

3. 设置防火墙

nano /etc/iptables.firewall.rules

粘贴以下内容:

*filter

#  Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT

#  Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#  Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

#  Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

#  Allow SSH connections
#
#  The -dport number should be the same port number you set in sshd_config
#
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

#  Allow ping
-A INPUT -p icmp -j ACCEPT

#  Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

#  Drop all other inbound - default deny unless explicitly allowed policy
-A INPUT -j DROP
-A FORWARD -j DROP

COMMIT

然后执行命令启动防火墙:

iptables-restore < /etc/iptables.firewall.rules

添加到开机任务中:

nano /etc/network/if-pre-up.d/firewall

粘贴以下内容:

#!/bin/sh /sbin/iptables-restore < /etc/iptables.firewall.rules

最后修改文件权限:

chmod +x /etc/network/if-pre-up.d/firewall

4. 添加登录失败惩罚措施 – Fail2ban

apt-get install fail2ban

默认是连续5次SSH密码错误,IP封锁10分钟,感觉默认值就够用了。 写在最后:以上就是我通过整理SSH下历史命令和参考官方文档总结出的LNMP/LEMP安装指南,中间走过不少弯路所以应该这个步骤是相对省时省力的。

参考文档:

https://library.linode.com/getting-started

https://library.linode.com/securing-your-server

https://library.linode.com/lemp-guides

http://askubuntu.com/questions/29359/how-to-add-user-without-home

==========以下是广告栏目==========

另外,我的Linode推广链接(返现10刀,详情与我联系吧):https://www.linode.com/?r=6e90c4d0b3ebbabe169e3ab933326b87813b4c9c

对更便宜的Digital Ocean感兴趣的可以点这个链接(联系我可以帮你免费得到两个月等值$10的点数供测试使用):https://www.digitalocean.com/?refcode=46787e765bb6