全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 10236|回复: 24

[经验] 放出LNMP在独立服务器上的优化教程

[复制链接]
发表于 2010-12-19 20:43:26 | 显示全部楼层 |阅读模式
我暂时按照LNMP0.4-FULL来修改,军歌新出的0.5-FULL请自行简单修改

本笔记采用军哥的LNMP一键安装并综合了张宴的笔记进行了适度优化,在实际运行中也有不错的表现.
•        军哥的一键安装网站:http://lnmp.org/install.html
•        军哥博客,很多配置可以在这里找到 http://www.vpser.net/
•        张宴博客参考: http://blog.s135.com/nginx_php_v6/
安装后优化总结
        所有的nginx配置文件中都必须要检查是否有下列配置,否则不安全.
1.        空主机头设置
2.        检查CPU设置数量, 尽量改大点
3.        防盗链                                                       --   要检查各虚拟主机vhost
4.        Nginx漏洞修补部分                                 --   要检查各虚拟主机vhost
5.        伪静态语句                                               --   要检查各虚拟主机vhost
6.        301永久指向 (www.baowang.com  baowang.com)  参考语句:
if ($host != 'www.xxx.com' ) {
rewrite ^/(.*)$ http://www.xxx.com/$1 permanent;}

评分

参与人数 2威望 +25 收起 理由
l4steleven + 5 技术贴加分
小夜 + 20 技术贴加分。

查看全部评分

 楼主| 发表于 2010-12-19 20:44:05 | 显示全部楼层
NGINX 安装篇
•        下载LNMP一键安装包:
1.        可以选择使用下载版(推荐国外或者美国VPS使用)或者完整版(推荐国内VPS使用),如果使用下载版执行命令 wget -c http://soft.vpser.net/lnmp/lnmp0.4.tar.gz,如果使用完整版,执行命令 wget -c http://soft.vpser.net/lnmp/lnmp0.4-full.tar.gz,执行上述命令后LNMP一键安装包就会被下载到VPS上。

•        解压LNMP一键安装包:
1.        执行tar zxvf lnmp0.4.tar.gz 或者tar zxvf lnmp0.4-full.tar.gz 就会将LNMP一键安装包解压缩。

•        CentOS下安装步骤
1.        下载版执行命令 cd lnmp0.4/ ,完整版执行命令:cd lnmp0.4-full/
2.        然后再执行./centos.sh ,输入要绑定的域名,回车,再输入要设置的MySQL root的密码,再次回车确认。程序会自动安装编译Nginx、PHP、MySQL、phpMyAdmin、Zend这几个软件。

•        Debian/Ubuntu下安装步骤
1.        下载版执行命令 cd lnmp0.4/ ,完整版执行命令:cd lnmp0.4-full/ ,
2.        然后32位系统执行./debian.sh ,输入要绑定的域名,回车,再次输入VPS/服务器所在位置:asia、america、europe、oceania或africa,回车,再输入要设置的MySQL root的密码,回车后,再次回车确认。程序会自动安装编译Nginx、PHP、MySQL、phpMyAdmin、Zend这几个软件。安装大约10分钟左右需要设置MySQL root用户的密码。

•        安装其他组件
1.        安装eAccelerator,执行如下命令:./eaccelerator.sh 就会自动安装并重启web服务。
2.        安装PureFTPd和管理面板,执行如下命令:./pureftpd.sh 就会自动安装PureFTPd,安装完PureFTPd,需要在浏览器执行http://你的域名或IP/ftp/install.php 安装PureFTPd用户管理.

•        虚拟主机管理
•        添加虚拟主机,执行如下命令:./vhost.sh 根据提示输入要绑定的域名,回车,如果需要添加更多的域名,输入y,再输入要另外绑定的域名,多个域名可以用空格隔开。再输入域名绑定的目录(绝对目录,如/home/wwwroot/lnmp,如果不填默认是/home/wwwroot/绑定的域名),再选择是否添加伪静态规则,默认已经有了Discuz、Wordpress、Sablog、emlog、dabr,可直接输入以上名称即可,如果需要添加自定义伪静态规则,直接输入一个想要的名字,程序会自动创建伪静态文件,直接在/usr/local/nginx/conf/你自定义的伪静态名字.conf 里面添加伪静态规则就行。接下来会提示是否需要启用日志功能,一般情况下不需要启动,直接输入n就行,如需启动,输入y,再输入要定义的日志文件名字,回车就会自动添加虚拟主机。
•        LNMP状态管理: /root/lnmp {start|stop|reload|restart|kill|status}
PureFTPd状态管理 /root/pureftpd {start|stop|restart|kill|status}
phpinfo : http://前面输入的域名或IP/phpinfo.php
phpMyAdmin : http://前面输入的域名或IP/phpmyadmin/
探针 : http://前面输入的域名或IP/p.php
MySQL root密码:如果不输入直接回车为root,否则为你输入的密码。

•        LNMP相关目录:
mysql : /usr/local/mysql
php : /usr/local/php
nginx : /usr/local/nginx
网站目录: /home/wwwroot
发表于 2010-12-19 20:44:47 | 显示全部楼层
独立的就别装这玩意了吧
 楼主| 发表于 2010-12-19 20:45:22 | 显示全部楼层
编写每天定时切割Nginx日志的脚本,注意按照实际情况修改路径

        编写每天定时切割Nginx日志的脚本,注意按照实际情况修改路径

1.        创建脚本/usr/local/webserver/nginx/sbin/cut_nginx_log.sh
2.        vi /usr/local/webserver/nginx/sbin/cut_nginx_log.sh
3.        输入以下内容:
引用
#!/bin/bash
# This script run at 00:00
# The Nginx logs path
logs_path="/usr/local/webserver/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/webserver/nginx/nginx.pid`

        设置crontab,每天凌晨00:00切割nginx访问日志
1.        crontab -e
2.        输入以下内容:
00 00 * * * /bin/bash  /usr/local/webserver/nginx/sbin/cut_nginx_log.sh

Troubleshooting
        运行 /root/lnmp restart出现下列提示
Starting php_fpm Failed loading /usr/local/zend/ZendOptimizer.so: /usr/local/zen/ZendOptimizer.so:connot restore segment prot after reloc: Permission denied

解决方法可以先尝试下面方法,待错误消失后重新开启Selinx
方法1:关闭SELINX,执行:/usr/sbin/setenforce 0
方法2:禁止掉SELinux   更改/etc/sysconfig/selinux 文件的内容为 SELINUX=disabled
方法3:当然不想关闭SWlinux,我们可以这样:chcon -t textrel_shlib_t /usr/local/zend/ZendOptimizer.so

评分

参与人数 1威望 +25 收起 理由
cnx + 25 精品文章

查看全部评分

发表于 2010-12-19 20:45:32 | 显示全部楼层
这什么跟什么啊!还优化呢!
 楼主| 发表于 2010-12-19 20:45:48 | 显示全部楼层
优化Mysql参数

登陆mysql的命令:
1.        export PATH=/usr/local/mysql/binPATH
2.        mysql -u root –p
3.        use DB(数据库名) 可以切换到需要的数据库下
4.        flush tables; 刷新数据库表
5.        flush privileged; 刷新权限
也可以通过SSH来修改数据库表的权限(一般666就可以了)
安装结束后,MYSQL数据库用户名root密码root,登陆后进入mysql数据库,找到user表,删除除了有root密码外的所有用户
LNMP中默认是用小内存MYSQL,所以需要更改为LARGE的,或者用my-innodb-heavy-4G.cnf 这个配置
cp -r /usr/local/mysql/share/mysql/my-large.cnf  /etc/my.cnf
发表于 2010-12-19 20:46:12 | 显示全部楼层
完了吗?
 楼主| 发表于 2010-12-19 20:46:56 | 显示全部楼层
优化NGINX的参数及对应安全配置

        安装完毕后, centos.sh / debian.sh   eaccelerator.sh   ftp/install.php
全部重新命名或者删除                                                                                            – 极端重要

        phpmyadmin下的setup目录改名或删掉                                                             – 极端重要
nginx完美解决同一服务上的站点WebShell访问限制问题(跨站跨目录)

        http://www.hostloc.com/viewthrea ... p;extra=&page=1      -  待验证,基本可行

        NGINX漏洞修复                                                                                                     – 极端重要
必须在nginx的主站(nginx.conf文件)及各虚拟主机vhost全部配置添加如下内容,重启nginx

#以下这段是为了防止Nginx漏洞
location ~ .*\.(php|php5)?$
{if ($request_filename ~* (.*)\.php)
{ set $php_url $1; }
if (!-e $php_url.php)
{return 403;}      
#以上这段是为了防止Nginx漏洞  



        设置空主机头,避免别人恶意域名指过来,此语句可以做指向,将恶意指向的IP导向其它地方.

#以下这段是设置空主机头,避免恶意指向
server
{
listen       80;
server_name _; #default
return 444; }
#以上这段是设置空主机头,避免恶意指向
        增加限制会话链接   limit_conn   crash  5; 每个会话5个链接 .                                  -  待验证
        如何关闭NGINX日志:
修改nginx.conf 找到access_log:
access_log /dev/null;
error_log /dev/null;
        记得要修改nginx.conf 中的CPU数量发挥多CPU能力,尽量改大点
参考语句:  worker_processes 8;
        手动在网站根目录下创立所有子目录名字,并修改文件夹属性,
       chown -R www:www /data0/htdocs/blog
       chmod +w /data0/htdocs/blog
必须要做,否则会出现打不开网站或者子域名
        Nginx防盗链,防采集控制,在nginx.conf 文件中加入下列语句,红色部分改为自己域名, 同时要考虑搜索爬虫,做到平衡

#以下为图片防盗链规则
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked  www.imqzone.com imqzone.com localhost;   
if ($invalid_referer) {rewrite ^/  http://127.0.0.1/;
#return 404;
}
}
#以上为图片防盗链规则
提高NGINX自缓能力,把nginx.conf中默认的buffer size增加一倍,数值见下面
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 4 128k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 512k;
        最后记得NGINX需要配置关闭被主流扫描软件扫描到网站目录,例如namp等,具体待更新.
发表于 2010-12-19 20:48:16 | 显示全部楼层
Apache>Nginx
 楼主| 发表于 2010-12-19 20:48:18 | 显示全部楼层
CENT OS 系统参数优化

        安装完毕后启动iptable,只开放需要的端口(setup命令端口开启)
        防止同步包洪水(Sync Flood)
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
        防止各种端口扫描
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
        Ping 洪水攻击(Ping of Death)
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
echo 2048 > /proc/sys/net/ipv4/tcp_max_syn_backlog
echo 1 > /proc/sys/net/ipv4/tcp_synack_retries
echo 1 > /proc/sys/net/ipv4/tcp_syn_retries
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
Deflate防DDOS,我把下的源文件放在 /usr/src 中 ,iptables规则会自己增加
如何确认是否受到DDOS攻击?
执行:netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
执行后,将会显示服务器上所有的每个IP多少个连接数。
1、安装DDoS deflate
wget http://www.inetbase.com/scripts/ddos/install.sh   //下载DDoS  deflate
chmod 0700 install.sh    //添加权限
./install.sh             //执行
2、配置DDoS deflate
下面是DDoS deflate的默认配置位于/usr/local/ddos/ddos.conf ,内容如下:
##### Paths of the script and other files
PROGDIR="/usr/local/ddos"
PROG="/usr/local/ddos/ddos.sh"
IGNORE_IP_LIST="/usr/local/ddos/ignore.ip.list"  //IP地址白名单
CRON="/etc/cron.d/ddos.cron"    //定时执行程序
APF="/etc/apf/apf"
IPT="/sbin/iptables"

##### frequency in minutes for running the script
##### Caution: Every time this setting is changed, run the script with --cron
#####          option so that the new frequency takes effect
FREQ=1   //检查时间间隔,默认1分钟

##### How many connections define a bad IP? Indicate that below.
NO_OF_CONNECTIONS=150     //最大连接数,超过这个数IP就会被屏蔽,一般默认即可

##### APF_BAN=1 (Make sure your APF version is atleast 0.96)
##### APF_BAN=0 (Uses iptables for banning ips instead of APF)
APF_BAN=1        //使用APF还是iptables。推荐使用iptables,将APF_BAN的值改为0即可。

##### KILL=0 (Bad IPs are'nt banned, good for interactive execution of script)
##### KILL=1 (Recommended setting)
KILL=1   //是否屏蔽IP,默认即可

##### An email is sent to the following address when an IP is banned.
##### Blank would suppress sending of mails
EMAIL_TO="root"   //当IP被屏蔽时给指定邮箱发送邮件,推荐使用,换成自己的邮箱即可

##### Number of seconds the banned ip should remain in blacklist.
BAN_PERIOD=600    //禁用IP时间,默认600秒,可根据情况调整
用户可根据给默认配置文件加上的注释提示内容,修改配置文件。
        优化Linux内核参数

vi /etc/sysctl.conf      

•        修改下面项目数值
net.ipv4.tcp_syncookies=1                             #启用使用syncookies
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.all.accept_redirects=0              #不接受重定向的ICMP數據包
net.ipv4.tcp_window_scaling=1
net.ipv4.icmp_echo_ignore_all=1                  #禁止ICMP,可选项目,默认为0
net.ipv4.icmp_echo_ignore_broadcasts=1    #ICMP禁止广播 可选项目

•        在末尾增加以下内容:
# Add
net.ipv4.tcp_max_syn_backlog = 6000   #最大半连接数
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 = 1             #降低syn重试次数
net.ipv4.tcp_syn_retries = 1                  #降低syn重试次数
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 = 60
net.ipv4.ip_local_port_range = 1024  65535
        修改php-fpm.conf最大连接

1.        /usr/local/php/etc/php-fpm.conf , 修改php-fpm.conf最大连接为160:
<value name="max_children">160</value>  说明每个PHP进程使用20M, 因为我内存为4G,

2.        <value name="display_errors">0</value> 关闭错误输出(0为关闭)
        修改php.ini文件
  
手工修改:
查找/usr/local/webserver/php/etc/php.ini中的extension_dir = "./"
修改为extension_dir = "/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/"
并在此行后增加以下几行,然后保存:
extension = "memcache.so"
extension = "pdo_mysql.so"
extension = "imagick.so"

再查找output_buffering = Off
修改为output_buffering = On

自动修改:若嫌手工修改麻烦,可执行以下shell命令,自动完成对php.ini文件的修改:
sed -i 's#extension_dir = "./"#extension_dir = "/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/"\nextension = "memcache.so"\nextension = "pdo_mysql.so"\nextension = "imagick.so"\n#' /usr/local/webserver/php/etc/php.ini

sed -i 's#output_buffering = Off#output_buffering = On#' /usr/local/webserver/php/etc/php.ini

sed -i "s#; always_populate_raw_post_data = On#always_populate_raw_post_data = On#g" /usr/local/webserver/php/etc/php.ini
        重要提示,如果出现502错误,请参考下面变换 eaccelerator 和 Zend optimizer位置:

[eaccelerator]
zend_extension="/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so"
eaccelerator.shm_size="128"         此项改为128
eaccelerator.cache_dir="/usr/local/eaccelerator_cache"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="3600"
eaccelerator.shm_prune_period="3600"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
eaccelerator.keys = "disk_only"         
eaccelerator.sessions = "disk_only"
eaccelerator.content = "disk_only"

[Zend Optimizer]
zend_optimizer.optimization_level=1
zend_extension="/usr/local/zend/ZendOptimizer.so"
        禁用部分危险的函数:
方法如下:
打开/usr/local/php/lib/php.ini和
/usr/local/php-fcgi/lib/php.ini
更改
disable_functions =

disable_functions = system,passthru,shell_exec,exec, proc_open,popen
重启LNMP
        系统利用ntpdate同步标准时间.
没有安装ntpdate的可以yum一下:
yum install -y ntp
加入定时计划任务,每隔10分钟同步一下时钟
crontab -e
19 * * * * /usr/sbin/ntpdate ntp.api.bz
最后运行 clock –w 把时间写入到cmos
        系统自动更新update的配置 - 待完善
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2024-4-30 18:24 , Processed in 0.065469 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表