自由的风's Archivers

From 自由的风 on 2010-04-25 00:22:54

换到LNMP

服务器是从前几天开始抽筋的,主要表现就是运行了十几分钟后,Apach就超过了负载,访问不了,必须得不断地重启Apache。之前因为图方便,搭建的是Windows 2003的系统,用的appserver一键安装包,一直还运行比较正常,但是这个星期开始就不太正常了,查看日志也没找到什么原因。罢了,换吧,LAMP还是LNMP呢,决定还是尝试一下传说中的Nginx,呵呵。

于是乎,备份网站、重装系统、配置LNMP、配置系统,经过断断续续一天多时间的折腾,目前应该比较稳定了。步骤略记一下:

1、安装Linux操作系统,个人比较喜欢CentOS,目前最新版是CentOS 5.4。做服务器的话,这个应该比较合适。安装好后,可以适当地进行一些配置,以提高系统性能和安全性能。而且做开发也是很不错的选择,相对于FC来说,CentOs真是很稳定的说,嘿。。。



2、安装Nginx+Mysql+PHP:可按照张大牛人写的教程一步一步来:http://blog.s135.com/nginx_php_v6/,或者http://imcat.in/teach-you-step-by-step-install-nginx-php-mysql/,当然也有人已经提供了一键安装包,如:http://www.lnmp.org/,但貌似都不是最新的组合。所以我还是自己动手,结合LNMP的安装脚本和张宴的那篇文章,自己弄了一个一键安装包(想要的同学可以Email我),顺利搭建好了服务器平台。安装过程总共花了将近四十分钟吧。

3、几个站点的迁移都还比较顺利,通过脚本自动添加主机以后,再对配置脚本进行了一些修正。

主要写一写我所做的一些修改:
1、优化Linux内核参数
vi /etc/sysctl.conf
在末尾增加以下内容:
# Add
net.ipv4.tcp_max_syn_backlog = 65536
net.core.netdev_max_backlog =  32768
net.core.somaxconn = 32768

net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2

net.ipv4.tcp_tw_recycle = 1
#net.ipv4.tcp_tw_len = 1
net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800

#net.ipv4.tcp_fin_timeout = 30
#net.ipv4.tcp_keepalive_time = 120
net.ipv4.ip_local_port_range = 1024  65535
使配置立即生效:
/sbin/sysctl -p
2、编写每天定时切割Nginx日志的脚本
(1)、创建脚本/usr/local/nginx/sbin/cut_nginx_log.sh
vi /usr/local/nginx/sbin/cut_nginx_log.sh
输入以下内容(可根据需要进行修改):
#!/bin/bash
# This script run at 00:00

# The Nginx logs path
logs_path="/usr/local/nginx/logs/"

mkdir -p ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/
mv ${logs_path}access.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/access_$(date -d "yesterday" +"%Y%m%d").log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
(2)、设置crontab,每天凌晨00:00切割nginx访问日志
crontab -e
输入以下内容:
00 00 * * * /bin/bash  /usr/local/nginx/sbin/cut_nginx_log.sh
3、Nginx禁止通过IP,未绑定域名访问服务器
修改:nginx.conf
listen       80 default;
server_name _;
rewrite ^(.*) http://www.loosky.net permanent;
4、如何设置Nginx 404页面:
在相应的server项里面,添加一条“error_page 404 = /404.html;”   注意必须有等号=,网上的文章好像都没有这个=号,我试过一直不成功。404.html放在网站的根目录下。

5、301重定向:可编辑相应的站点的配置文件,位于vhost下:

加入如下代码:
server_name www.loosky.net loosky.net loosky.com www.loosky.com;  
if ($host != 'www.loosky.net') {        rewrite ^/(.*)$ http://www.loosky.net/$1 permanent;
}
6、解决Nginx  + PHP(FastCGI)遇到的502 Bad Gateway错误
(1)、查看当前的PHP FastCGI进程数是否够用:
netstat -anpo | grep "php-cgi" | wc -l
如果实际使用的“FastCGI进程数”接近预设的“FastCGI进程数”,那么,说明“FastCGI进程数”不够用,需要增大。
/usr/local/php/etc/php-fpm.conf:<value name="max_children">25</value> 
中间的数字为预设的FastCGI进程数,按照系统配置增加。

重启:
/usr/local/php/sbin/php-fpm restart
--------------------------------------------------------------------------------

(2)、部分PHP程序的执行时间超过了Nginx的等待时间,可以适当增加nginx.conf配置文件中FastCGI的timeout时间,例如:
......
http
{
......
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
......
}
......
7、

防盗链:
一般的防盗链如下:
在相应的配置文件中添加:
  location ~* \.(gif|jpg|jpeg|png|bmp|zip|rar)$ {
   valid_referers none blocked *.loosky.net loosky.net;
   if ($invalid_referer) {
    rewrite ^/ http://www.loosky.net/Upload/hi.jpg;
    #return 404;
   }
  }

第一行:gif|jpg|jpeg|png|bmp|zip|rar,表示对gif|jpg|jpeg|png|bmp|zip|rar后缀的文件实行防盗链
第二行:*.loosky.net loosky.net 表示对*.loosky.net loosky.net这个域名的来路进行判断
if{}里面内容的意思是,如果来路不是指定来路就跳转到指定页面,当然直接返回404也是可以的。

8、清理mysql日志:
用ports安装了mysql以后,过一段时间发现/var空间不足了,查一下,会发现是mysql-bin.000001、mysql-bin.000002等文件占用了空间,那么这些文件是干吗的?这是数据库的操作日志,例如UPDATE一个表,或者DELETE一些数据,即使该语句没有匹配的数据,这个命令也会存储到日志文件中,还包括每个语句执行的时间,也会记录进去的。

这样做主要有以下两个目的:
(1):数据恢复
如果你的数据库出问题了,而你之前有过备份,那么可以看日志文件,找出是哪个命令导致你的数据库出问题了,想办法挽回损失。
(2):主从服务器之间同步数据
主服务器上所有的操作都在记录日志中,从服务器可以根据该日志来进行,以确保两个同步。

处理方法分两种情况:
(1):只有一个mysql服务器,那么可以简单的注释掉这个选项就行了。
vi /etc/my.cnf把里面的log-bin这一行注释掉,重启mysql服务即可。
(2):如果你的环境是主从服务器,那么就需要做以下操作了。
A:在每个从属服务器上,使用SHOW SLAVE STATUS来检查它正在读取哪个日志。
B:使用SHOW MASTER LOGS获得主服务器上的一系列日志。
C:在所有的从属服务器中判定最早的日志,这个是目标日志,如果所有的从属服务器是更新的,就是清单上的最后一个日志。
D:清理所有的日志,但是不包括目标日志,因为从服务器还要跟它同步。
清理日志方法为:
(1)登录mysql,并先清理已有的mysql日志,释放空间:
#mysql -u root -p

输入mysql密码登录mysql
mysql> reset master;
可以清理这些文件,如果做了replication,清理之前要确认slave端已经同步了所有log

(2)在/etc/my.cnf中去掉log-bin,然后重启mysql服务就可不让生成这些日志文件了。

其他待续。。。

-------------------------------------------------------------------

张宴写了一本《实战Nginx:取代Apache的高性能Web服务器》,据说很不错,我也力顶了一下,订购了一本,估计下个星期到货,呵呵。。。最近准备整Python,顺便买了《Python核心编程》,有点旧的版本,因为还没有最新版,嘿。但是很不错,看看先。。。

昨晚跑去图书馆借书,发现自己真的很久没看书了,买了很多书,但都没怎么去读,现在解决问题,似乎都是直接Google了,呃,感觉这样还是不好。恢复以往读书的习惯。

换成了LNMP,感觉速度快了许多,连进后台的速度都很不错了,继续观察中。最可喜的就是归档插件Clean Archives Reloaded又可以用了,之前在Windows下面一直都不行,我只好使用了Better Extended Live Archive,在我启用了缓存的情况下,打开归档页面还有将近1500次的数据库查询,OMG...相比之下Clean Archives Reloaded只有十来次,不是一个数量级的。。。

查看完整版本: 换到LNMP

From zozo on 2010-05-01 09:45:31

博主,麻烦给我一份你的一键安装吧,十分感谢!

From 自由的风 on 2010-05-01 23:03:27

@zozo  个头比较大呢。。。我整理一下先。

From 囧啊囧 on 2010-11-24 22:11:09

可以给我一份LNMP的一键包吗?我搞的头都晕了

From 自由的风 on 2010-11-24 23:04:35

@囧啊囧 我整理一下发给你。

Tags: Linux, LNMP, Nginx, PHP


©自由的风