21/04/2014
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
07/01/2015
WordPress Permalinks on LEMP
By dch1 in Life No Comments Tags: LEMP, Linode, Nginx, VPS
最近一个工程项目涉及到网站搬迁,从虚拟主机搬到VPS上,当然使用的是我最喜爱的LEMP精简方案(LAMP太吃内存,多占的内存都可以够我装一个主机控制面板了),虽然LEMP功能实用稳定,美中不足便是设置极为繁琐(想完美不容易)。
这不,主机假设轻车熟路,解决了一系列的小问题,网站上线之后发现伪静态协议失效,只有主页能够显示。
首先,想到了可以更新网站静态链接格式(变成类似本网站的?p=xxx的格式),但这属于避开问题,而且会影响收录,所以放弃。
之后就开始想办法手动解决伪静态的问题,终于在一个网站找到一篇非常详细的设置文章,经过实际测试成功!
下面只粘贴认为最核心的代码,phpmyadmin之类的设置可以参考以前的文章。
Thanks: http://centminmod.com/nginx_configure_wordpress.html