标签存档: linux

linux小内存vps性能优化笔记lnmp+jetty

新购入VPS,瑞豪开源, 购买地址 http://rashost.com/usa-vps

我买的是US180 VPS 68元/月

180M内存
1核Intel Xeon CPU
10G硬盘
100M共享带宽
2M保证,不限流量
1个IP地址

整体配置内存偏低,硬盘分割的较少,意味着母鸡的大硬盘可能被其他vps使用,IO比较差。

系统优化

一、创建SWAP (参考新浪张宴文章,原文地址:http://blog.s135.com/post/374/

1、创建SWAP交换空间,也就是windows的虚拟内存。

cd /var/
dd if=/dev/zero of=swapfile bs=1024 count=262144
/sbin/mkswap swapfile
/sbin/swapon swapfile

2、加入引导,即开机的时候挂载SWAP交换空间

vi /etc/fstab

/var/swapfile swap swap defaults 0 0

二、MYSQL优化

1、关闭InnoDB (相比MyISAM,InnoDB会消耗额外的内存用于存储MySql一些索引信息) 关闭的意义在于,小内存VPS的瓶颈还是在于硬件配置,查询不是硬伤。参考文章:http://www.justwinit.cn/post/4785/

先确保表engine都已经改到MyISAM,关闭innodb后,原来的innodb表都将无法操作

alter table [表名] type = 'MyISAM';

关闭innodb

sudo vi /etc/my.cnf

#在[mysqld]后面添加下面代码
default-storage-engine = MyISAM
innodb=OFF
skip-innodb

三、Jetty配置(下面/home/zhufeng/wwwroot_jetty根据自己server调整)

1、下载并解压

wget http://dist.codehaus.org/jetty/jetty-6.1.26/jetty-6.1.26.zip
unzip jetty-6.1.26.zip 
cd jetty-6.1.26

 2、加入启动项

cd /etc/init.d/
sudo ln -s /home/zhufeng/soft/jetty-6.1.26/bin/jetty.sh jetty

 3、修改jetty.sh脚本,添加

vi bin/jetty.sh
#添加
JETTY_HOME="/home/zhufeng/soft/jetty-6.1.26"
JAVA_OPTIONS="-Xms50m -Xmx80m -Xss128k "

4、在contexts目录下加入jetty context配置,参考如下:

<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<Configure class="org.mortbay.jetty.webapp.WebAppContext">

  <Set name="contextPath">/</Set>
  <Set name="war">/home/zhufeng/wwwroot_jetty/webapps/xkdou.war</Set>
  <Set name="virtualHosts">
        <Array type="java.lang.String">
                <Item>www.xkdou.com</Item>
                <Item>xkdou.com</Item>
        </Array>
  </Set>

</Configure>

 

三、Tomcat优化(不完善)

有个程序是Java的,Java对内存消耗比较大,其实这个小内存VPS不适合跑Java程序,优化如下:

1、修改bin/catalina.sh启动脚本

JAVA_OPTS='-Xms50m -Xmx100m'

 2、修改conf/server.xml

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="10000"
               maxThreads="10"
               redirectPort="8443" />

截取一张优化后,VPS峰值的一张图

Screenshot

 

Linux自动备份网站文件和数据库上传FTP

因为A大的关系。导致数据丢失了不少。花了2个晚上写了个脚本备份数据。参考了hostloc上不少前辈的脚本。

为了安全,不使用root作为数据库用户备份数据。用root登录mysql server后,创建一个专门的备份用户 (创建用户名backup密码backup的mysql登录帐号,并且这个帐号的权限只有select和lock权限,即mysqldump备份的时候最低的权限要求)

grant select,lock tables on *.* to 'bakup'@'localhost' identified by 'bakup';
flush privileges ;

ftp空间问题。我使用了godaddy域名赠送的免费10g ftp空间

  1. 登录godaddy,左上角登录
  2. 登录后,点击左上角 my account. 或者打开 https://mya.godaddy.com/default.aspx?ci=60016
  3. 出现一个列表。如下图。选择WEB HOSTING。下面有个free plan 就是赠送的空间路。点申请。大概需要30分钟时间开通

godaddy-free-host

脚本如下:

#!/bin/bash
dbname="wordpress zjxhjs" #需要备份的数据库列表,多个数据库用空格分割
dbuser="backup" #备份用户名
dbpass="*******" #备份用户密码

webs="fredzhu.com demo.fredzhu.com" #需要备份的网站列表,多个网站用空格分割
webspath="/home/xxxxx/wwwroot" #网站列表所在的根路径

output="/home/xxxxx/bak/tmp" # 临时备份的目录,备份文件在这里打包压缩。

ftphost="72.167.232.101" #ftp地址
ftpuser="xxxxx" #ftp用户名
ftppass="xxxxx" #ftp密码
ftpbackup=/vps_backup #ftp上备份目录

#-------------------------don't modify follow---------------------
date=$(date '+%Y%m%d%H')

tmp_db_output=$output/db
tmp_web_output=$output/web
log_file=$output/info.log
backup_file=backup"_"$date.tar
old_backup_file=backup_$(date -d -3day +%Y%m%d%H).tar

echo "---------------------Auto Bakup Script-------------------" >> $log_file

echo "[$date] clean backup" >> $log_file
echo "	clean tmp backup" >> $log_file
rm -rf $tmp_db_output $tmp_web_output
echo "	clean old local backup file:$old_backup_file" >> $log_file
rm -rf $output/../$old_backup_file

echo "[$date]mysql starting bakup" >> $log_file
if [ ! -d $tmp_db_output ];
then
	echo "  create db temp path[$tmp_db_output]" >> $log_file
	mkdir $tmp_db_output
fi

for i in $dbname
do
	echo "  bakup db $i" >> $log_file
	mysqldump -u$dbuser -p$dbpass -hlocalhost $i|gzip > $tmp_db_output/$i"_"$date.sql.gz
done

echo "[$date] web starting bakup" >> $log_file
if [ ! -d $tmp_web_output ];
then
	echo "  create web temp path[$tmp_web_output]" >> $log_file
	mkdir $tmp_web_output
fi

for i in $webs
do
	echo "  bakup web $i" >> $log_file
	tar zcf $tmp_web_output/$i"_"$date.tar.gz -C $webspath $i >> $log_file
done

echo "[$date] package files" >> $log_file
tar cvf $output/$backup_file $output/* >> $log_file

echo "[$date] movie local backup" >> $log_file
if [ -f $output/$backup_file];
then
	echo "  backupfile already exist,del it" >> $log_file
	rm -rf $output/$backup_file	
fi
mv $output/$backup_file $output/../

echo "[$date] upload to ftp servier" >> $log_file
ftp -v -n $ftphost << END
user $ftpuser $ftppass
type binay
passive on
cd $ftpbackup
delete $old_backup_file
put $output/../$backup_file $ftpbackup/$backup_file
bye
END

 

一段linux启动脚本(python版)

公司项目用到需要开机自动执行相关程序,奈何shell不是很精通,老大给了段python版的,我也分享下,供大家参考

#!/usr/bin/env python

# init.d script for the Mytut CS Repo Server; John Wang 14 Feb 2011

import sys,subprocess,time

cmmd    = '/home/fred/test.py'#启动/关闭执行命令

port    = '12600'

decp    = 'start process program....'

cmmdln  = ['nohup',cmmd,'-p',port]

def start():

print 'Starting %s...' % decp

subprocess.Popen(cmmdln)

print 'Started'

def stop():

print 'Stopping %s...' % decp

subprocess.Popen(cmmdln)

print 'Stopped'

return 0

def restart():

if stop()==1:

print 'Stopping error. Maybe already stopped ?. starting anyway ...'

else:

time.sleep(1)

start()

def run(argv):

fns={

    'start':start,

    'stop':stop,

    'restart':restart,

    'reload':restart,

}

fn=fns.get(argv[1],None) if len(argv)>1 else None

if not fn:

print >> sys.stderr,"Usage: %s {%s}" % (argv[0],'|'.join(fns.keys()))

sys.exit()

fn()

if __name__ == '__main__':

run(sys.argv)

比较简单~

前文介绍过,放在/etc/rc3.d 目录下即可,linux启动后会自动执行这个目录里面的脚本,默认使用start参数启动

Linux自动运行脚本

windows下开机启动某个程序比较简单,只需要把程序添加到”程序-启动”栏即可.

对于linux下开机自动运行程序笔记麻烦. 以Apache Tomcat为例. 做开机自动启动


				SERVICE_HOME="/home/tomcat"

				SERVICE_DESC="Apache Tomcat"

				SERVICE_USER="tomcat"

				CONSOLE_LOG="$SERVICE_HOME/console.log"

				START_SCRIPT="startup.sh"

				SHUTDOWN_SCRIPT="shutdown.sh"

				start(){

				echo "Starting $SERVICE_DESC Server ..."

				cd $SERVICE_HOME/bin

				sudo -u $SERVICE_USER ./$START_SCRIPT > $CONSOLE_LOG 2> $CONSOLE_LOG &

				}

				stop(){

				echo "Stopping $SERVICE_DESC Server ... "

				cd $SERVICE_HOME/bin

				sudo -u $SERVICE_USER ./$SHUTDOWN_SCRIPT > $CONSOLE_LOG 2> $CONSOLE_LOG &

				}

				restart(){

				stop

				# give stuff some time to stop before we restart

				sleep 5s

				start

				}

				case "$1" in

				start)

				start

				;;

				stop)

				stop

				;;

				restart)

				restart

				;;

				*)

				echo "Usage: tomcat {start|stop|restart}"

				exit 1

				esac

				exit 0

 

 

设置:

1、保存脚本到/ect/init.d/目录下,保存名tomcat.sh

2、进入/etc/rc3.d/目录,新建一个软链接 sudo ln -s  ../init.d/tomcat.sh tomcat

 

注:ect目录下有很多rc1.d、rc2.d….这类的目录,这里是linux用来设置不同程序启动顺序用,数字越小启动优先级越高,一般而言我们自己的程序放在rc3.d目录下即可

 

 

 

Linux(debian)下ffmpeg编译与运行

Why write this article?

   网上关于如何编译的文章很多,但有2个很明显的趋势

   1. 国内的大多东抄点西抄点,时间滞后不说,当你google的结果大部分都大同小异后就会有抓狂的感觉,究其原因还是国内站长们‘爬虫’太多.
   2. 国外优秀文章不错,很多,比如这篇 因此本文的目的主要是为了国内阅读英文较困难的同学服务,务必做到阅读完本文后,能自行编译ffmpeg.并简单操作.

Audience

    ffmpeg初学者,并对linux相关命令不了解

What is ffmpeg?

    简单来说就是一个跨平台、开源的流媒体处理工具.几乎集成了流媒体处理的所有功能,几乎’无所不能’.著名的’暴风影音’,’QQ影音’…都有’幸’加入了ffmpeg耻辱柱.

How to use?

    ffmpeg主要2种使用方式 1、命令行  2、使用lib库

    前者最方便,几乎不需要编程方面的知识,参考具体文档即可.

Compile

    因为ffmpeg是主要几乎linux开发且官方不提供现成的二进制文件,需要用户自行编译,这就大大增加了初学者入门的难度

    windows下有现成的编译库SDK,可以直接下载. 这里将如何在linux(debian)下编译ffmpeg.

    网上可以找到很多教程,在正式安装ffmpeg需要安装许多东西,其实那些都并不是必须的.比如lame

    Debian的确很强大,强大到不需要本文,只需要几个apt-get 命令即可实现整个过程.当然这里不是本文的重点,懒人可以直接用下面的代码直接安装二进制包,有兴趣的朋友继续看下文,我们来手动编译

    懒人方法::

apt-get install ffmpeg 如果提示不完整 继续输入 apt-get –f install

    手动编译:

1. 安装gcc编译器. gcc是linux下一个c的编译器,用来对c源码进行编译.使用 apt-get install gcc 下载
2. 下载ffmpeg源码包 wget http://www.ffmpeg.org/releases/ffmpeg-0.6.tar.gz wget是linux下比较方便的下载命令
3. 解压ffmpeg, tar zxvf ffmpeg-0.6.tar.gz 即可
4. cd ffmpeg-0.6 进入ffmpeg目录
5. 运行./configure –help 可以查看编译参数. 看看就可以了,具体详细参考这份文档.
6. 这里我们运行 ./configure --prefix=/home/fred/ffmpeg --enable-gpl --enable-shared 简单说下
--prefix指定编译后的路径,默认是编译到/usr /opt 等目录中去,个人不是很喜欢这种方式,初学者建议不启用该项.

--enable-gpl 启用gpl编码

--enable-shared 允许共享lib包

7. make 开始编译,看电脑情况,一般几分钟时间是要的.耐心等待吧

8. make install 把编译后的so,co这些二进制文件都转移到prefix指定的目录中去

    如果前面设置过prefix的朋友看这里,使用默认的可以忽略,这段作用是把ffmpeg执行命令加入到环境变量中去

 

$ cd /home/fred

$ vi .bashrc
插入 export ffmpeg=/home/fred/ffmpeg
export PATH = $ffmpeg/bin;$PATH

 

    到了这里,如果一切顺利的话,可以运行下面命令测试下

ffmpeg –-help

 

   如果打印出大量字符提示信息,那就说明安装正确了.

Example

    如果前面都没有问题,运行下面命令,这条命令作用是把flv转成mpg格式

 

ffmpeg -i kitty.flv -target ntsc-dvd -aspect 4:3 kitty.mpg

Debian网络设置

一直记不住这些设置~ 这里记录下,省的到处找

IP地址配置文件: /etc/network/interface

// 动态DHCP获得

# 启动系统激活设备
# Loop回环地址
auto lo
iface lo inet loopback

# 启动系统激活设备
# 网卡eth0设置为DHCP类型
auto eth0
iface eth0 inet dhcp

// 静态Static获得

# 启动系统激活设备
# Loop回环地址
auto lo
iface lo inet loopback

# 启动系统激活设备
# 网卡eth0设置为Static类型
auto eth0
iface eth0 inet static

# 指定IP地址、子网掩码、广播、网关
address 192.168.0.1
netmask 255.255.255.0 
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.1

# 指定DNS服务器地址
dns-nameservers 202.103.0.117
dns-search somedomain.org

========================

 

DNS服务器配置文件: /etc/resolv.conf

// 必须设置.否则无法访问任何URL

nameserver 202.103.0.117
nameserver 211.95.193.97