Linode VPS with Nginx的进一步优化

  • 清理系统服务

    可以关闭不必要的系统服务,linux下常用chkconfig,在ubuntu系统上最常用sysv-rc-conf,界面更友好使用更方便,直接通过源安装即可运行。

    sudo apt-get install sysv-rc-conf
    sudo sysv-rc-conf
    

    通过软件可以发现,Linode提供的系统已经关闭了很多不必要的服务,但是系统自带了apache,直接取消选择关闭即可。

  • nginx过期设置

    在nginx中,可以对部分类型资源配置过期时间,以利用客户端缓存,降低服务器端负载,某些媒体资源可以禁用log。

    在对应的nginx配置文件youdomain.com中添加

    location ~* ^.+\.(gif|jpg|jpeg|png|bmp|ico|swf)$ {
        root /home/myname/wwwroot/yourdomain.com;
        access_log off;
        expires 7d;
    }
    location ~* ^.+\.(js|css)$ {
        root /home/myname/wwwroot/yourdomain.com;
        expires 24h;
    }
    
  • wordpress静态化

    cos-html-cache是WP的静态化插件,他可以将WP通过UrlRewrite优化过的Url链接彻底静态化。你只需要在WP后台设置固定链接为某种静态文件类似的形式(例如/archives/%post_id%.html),你就可以使用该插件生成对应的静态文件,从此用户将直接访问此静态文件,而不必再通过php解释,极大提高运行效率。

    具体操作上面链接描述很详细,无需赘述。

    不过我在启用此插件后,发现能正常生成网站根目录下index.html,但无法生成/archives/%post_id%.html。我写了一个php脚本放在网站根目录下测试,也无法在/archives目录下生成文件,提示找不到该目录。在cos-html-cache源文件中可以找到,生成html文件的脚本,路径信息是通过$_SERVER[“DOCUMENT_ROOT”]获取的,但是尝试打印该值发现无值。最后我发现必须在Nginx站点配置文件中在php-fast-cgi的配置项里增加网站的root路径如下

    location / {
        root   /home/myname/wwwroot/yourdomain.com;
        index  index.html index.htm index.php;
        if (-f $request_filename) {
            break;
        }
        if (-d $request_filename) {
            break;
        }
        rewrite ^(.+)$ /index.php?q=$1 last;
    }
    location ~ \.php$ {
        #必须定义root -----------------------------------------
        root   /home/myname/wwwroot/yourdomain.com;
        #------------------------------------------------------
        fastcgi_pass    127.0.0.1:9000;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME  /home/myname/wwwroot/yourdomain.com$fastcgi_script_name;
        include     /usr/local/nginx/conf/fastcgi_params;
    }
    
    

    如果不添加该root信息,在php中则无法正确获取$_SERVER[“DOCUMENT_ROOT”]参数,会导致路径定位错误。不过按照一般逻辑,这个应该是继承前面的root设置,不必重复定义。也许是因为fastcgi是从nginx转向到另一个新的进程的缘故,所以需要具体定义参数传递。不过nginx应该自动获取该值,避免重复手工操作。

hosts

hack GFW是选用国外主机的一大优势……

最近似乎twitter和facebook的访问速度又慢了,写了一个php脚本在站点上跑了下,获取了最新的hosts

128.121.146.228 twitter.com
128.121.146.228 www.twitter.com
168.143.162.69 assets0.twitter.com
168.143.162.69 assets1.twitter.com
168.143.162.69 assets2.twitter.com
168.143.162.69 assets3.twitter.com
168.143.162.69 assets4.twitter.com
168.143.162.69 static.twitter.com
67.219.156.130 help.twitter.com
208.96.32.3 apiwiki.twitter.com
69.63.181.12 www.facebook.com
69.63.184.142 facebook.com
69.63.181.22 login.facebook.com
69.192.18.110 s-static.ak.facebook.com
69.63.176.69 secure-profile.facebook.com
69.63.176.59 secure-media-sf2p.facebook.com
69.63.178.15 ssl.facebook.com
77.67.91.82 profile.ak.facebook.com
208.19.38.26 b.static.ak.facebook.com

前端有dns轮询的,不过我们能用一个就ok,再跑一次脚本,或者用下面这个

128.121.146.100 twitter.com
128.121.146.100 www.twitter.com
128.121.146.229 assets0.twitter.com
128.121.146.229 assets1.twitter.com
128.121.146.229 assets2.twitter.com
128.121.146.229 assets3.twitter.com
128.121.146.229 assets4.twitter.com
128.121.146.229 static.twitter.com
67.219.156.130 help.twitter.com
208.96.32.3 apiwiki.twitter.com
69.63.181.16 www.facebook.com
69.63.181.11 facebook.com
69.63.181.26 login.facebook.com
69.192.18.110 s-static.ak.facebook.com
69.63.176.69 secure-profile.facebook.com
69.63.176.59 secure-media-sf2p.facebook.com
69.63.178.15 ssl.facebook.com
77.67.91.82 profile.ak.facebook.com
208.19.38.9 b.static.ak.facebook.com

SyntaxHighlighter

作为程序员,blog难免要贴不少代码,简单的pre标记显得比较平板,不象ide里面的代码排版颜色那么漂亮。

在网上搜了一把,SyntaxHighlighter应该是目前最美观最全面的代码着色器了,唯一的缺点就是需要引入的文件太多……不过要做到这么全的代码类型覆盖,这也是不可避免的。

官方网站链接:http://alexgorbatchev.com/wiki/SyntaxHighlighter

Setup on Linode.com with ubuntu+nginx+php+fastcgi+mysql 续

嗯嗯,继续。

  • nginx和fastcgi启动配置

    2个配置文件,放于/etc/init.d下面。

    cd /etc/init.d
    touch fast-cgi
    touch nginx
    sudo chmod +x /etc/init.d/nginx /etc/init.d/fast-cgi

    nginx

    #! /bin/sh
    
    ### BEGIN INIT INFO
    # Provides:          nginx
    # Required-Start:    $all
    # Required-Stop:     $all
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: starts the nginx web server
    # Description:       starts nginx using start-stop-daemon
    ### END INIT INFO
    
    PATH=/usr/local/nginx/sbin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    DAEMON=/usr/local/nginx/sbin/nginx
    NAME=nginx
    DESC=nginx
    
    test -x $DAEMON || exit 0
    
    # Include nginx defaults if available
    if [ -f /etc/default/nginx ] ; then
    	. /etc/default/nginx
    fi
    
    set -e
    
    . /lib/lsb/init-functions
    
    test_nginx_config() {
      if nginx -t
      then
        return 0
      else
        return $?
      fi
    }
    
    case "$1" in
      start)
    	echo -n "Starting $DESC: "
            test_nginx_config
    	start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
    		--exec $DAEMON -- $DAEMON_OPTS || true
    	echo "$NAME."
    	;;
      stop)
    	echo -n "Stopping $DESC: "
    	start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \
    		--exec $DAEMON || true
    	echo "$NAME."
    	;;
      restart|force-reload)
    	echo -n "Restarting $DESC: "
    	start-stop-daemon --stop --quiet --pidfile \
    		/var/run/$NAME.pid --exec $DAEMON || true
    	sleep 1
            test_nginx_config
    	start-stop-daemon --start --quiet --pidfile \
    		/var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS || true
    	echo "$NAME."
    	;;
      reload)
            echo -n "Reloading $DESC configuration: "
            test_nginx_config
            start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/$NAME.pid \
                --exec $DAEMON || true
            echo "$NAME."
            ;;
      configtest)
            echo -n "Testing $DESC configuration: "
            if test_nginx_config
            then
              echo "$NAME."
            else
              exit $?
            fi
            ;;
      status)
    	status_of_proc -p /var/run/$NAME.pid "$DAEMON" nginx && exit 0 || exit $?
    	;;
      *)
    	echo "Usage: $NAME {start|stop|restart|reload|force-reload|status|configtest}" >&2
    	exit 1
    	;;
    esac
    
    exit 0

    fast-cgi

    #! /bin/sh
    
    ### BEGIN INIT INFO
    # Provides:          fast-cgi
    # Required-Start:    $all
    # Required-Stop:     $all
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: starts the fast-cgi web server
    # Description:       starts fastcgi using start-stop-daemon
    ### END INIT INFO
    
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    
    NAME=spawn-fcgi
    DESC=spawn-fcgi
    DAEMON=/usr/local/bin/spawn-fcgi
    
    DAEMON_OPTS="-u www-data -g www-data -C 8 -a 127.0.0.1 -p 9000 -P /var/run/$NAME.pid -- /usr/bin/php5-cgi"
    
    test -x $DAEMON || exit 0
    
    set -e
    
    case "$1" in
      start)
    	echo -n "Starting $DESC: "
    	start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS || true
    	echo "$NAME."
    	;;
      stop)
    	echo -n "Stopping $DESC: "
    	start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON || true
    	echo "$NAME."
    	;;
      restart|force-reload)
    	echo -n "Restarting $DESC: "
    	start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON || true
    	sleep 1
    	start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS || true
    	echo "$NAME."
    	;;
      reload)
          echo -n "Reloading $DESC configuration: "
          start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON || true
          echo "$NAME."
          ;;
      *)
    	N=/etc/init.d/$NAME
    	echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
    	exit 1
    	;;
    esac
    exit 0

    这两个脚本需要注意的是目录的定位,如果在编译阶段加入了目录设置的参数,那么你同时需要在这里修改定义。另外fast-cgi需要注意DAEMON_OPTS的参数设置。

    这2个脚本都有一个同样的问题,就是无法正常停止服务。我虽然不太了解shell程序,但是根据我其他编程经验,两个脚本都是通过start-stop-daemon命令来开启和停止服务。但我使用的情况是可以正常开启,但无法正常关闭。所以我不得不写了一个简单的关闭并重启nginx服务的脚本,是通过直接kill进程来实现的。

    cd ~
    mkdir tools
    cd tools
    touch reset_nginx
    chmod +x reset_nginx

    reset_nginx内容

    sudo kill `cat /usr/local/nginx/logs/nginx.pid`
    sudo /etc/init.d/nginx start

    但是fast-cgi的服务即使我kill进程并删除pid文件也无济于事,fast-cgi仍然照常运行……这有点不合逻辑,也许我操作错误,或者是权限问题。不过fast-cgi开启后一般也没有必要进行重启或其他操作,这个问题留待以后解决吧。或者有哪位同学知道的,请不吝赐教!

    最后这2个脚本需要注册为系统服务,需要安装rcconf。

    sudo apt-get install rcconf
    sudo rcconf

    嗯,很怀旧的DOS操作界面……呵呵,大家选择2个脚本,再ok退出即可。

  • nginx站点配置

    由于dreamhost的习惯,并且这个虚拟机还要放callaly的blog(http://callaly.net),所以nginx的站点我放到用户目录下去了。

    cd ~
    mkdir wwwroot
    cd wwwroot
    mkdir yourdomain.com

    编辑/usr/local/nginx/conf/nginx.conf

    user www-data;
    worker_processes 2;
    
    events {
    	worker_connections  1024;
    	use epoll;
    }
    
    http {
    	include       mime.types;
    	default_type  application/octet-stream;
    
    	sendfile       on;
    	tcp_nopush     on;
    	tcp_nodelay    on;
    
    	keepalive_timeout  65;
    
    	gzip  on;
    
    	#设置默认站点,禁止所有IP访问
    	server {
    		listen 80 default;
    		return 403;
    	}
    
    	#包含其他站点配置
    	include /usr/local/nginx/sites-enabled/*;
    
    }

    创建站点文件

    cd /usr/local/nginx
    sudo mkdir sites-available
    sudo mkdir sites-enabled
    sudo touch sites-available/yourdomain.com
    sudo ln -s sites-available/yourdomain.com sites-enabled/yourdomain.com
    	

    编辑sites-available/yourdomain.com

    server {
    	listen       80;
    	server_name  www.yourdomain.com yourdomain.com;
    
    	access_log	/home/myname/wwwroot/log/yourdomain.com.access.log;
       	error_log	/home/myname/wwwroot/log/yourdomain.com.error.log;
    
    	location / {
    		root   /home/myname/wwwroot/yourdomain.com;
    		index  index.html index.htm index.php;
    
    		# WordPress URL优化
    		if (-f $request_filename) {
    			break;
    		}
    		if (-d $request_filename) {
    			break;
    		}
    
    		# WordPress URL重写,如果你的wp目录不在根目录,请修改路径
    		rewrite ^(.+)$ /index.php?q=$1 last;
    	}
    
    	location ~ \.php$ {
    		fastcgi_pass	127.0.0.1:9000;
    		fastcgi_index	index.php;
    		fastcgi_param	SCRIPT_FILENAME /home/myname/wwwroot/yourdomain.com$fastcgi_script_name;
    		include		/usr/local/nginx/conf/fastcgi_params;
    	}
    
    	#如果前面编译nginx时添加了with-http_stub_status_module参数
    	#就可以通过此设置访问yourdomain.com/status(名称自定)查看站点状态
    	location /status {
    		stub_status on;
    		access_log off;
    	}
    }

    nginx的站点配置基本ok

  • wordpress备份和恢复

    需要把dreamhost主机上的内容迁移过来,可操作方法很多,最好在服务器端直接操作,速度更快。文件操作很简单不赘述,关于数据库的备份和恢复简单说下。

    #导出 - 在原服务器
    mysqldump -h old_host -p old_dbname -u old_dbuser >wp_bak.sql
    
    #登录mysql
    mysql -h new_host -u new_dbuser
    
    #创建新数据库,注意编码
    create database 'new_dbname' default character set utf8 collate utf8_general_ci;
    
    #导入 - 确保备份sql文件在当前目录
    use new_dbname;
    source wp_bak.sql;

    至此整个站点配置已经基本完成,可以敲域名访问了。

这篇文章大部分内容来自于网上,我东拼西凑来的,特在此列出供大家参考。

Setup on Linode.com with ubuntu+nginx+php+fastcgi+mysql

我对Linux系统还处于初入门阶段,在配置安装Linode VPS的服务过程中学到了不少东西,了解了不少概念,特记之。

  1. 启用

    Linode的网站设计非常简洁,一个粗略认识英文的同学都可以轻易申请搞定,就不需要再介绍了。

    在选择服务器网络物理位置的时候,Linode提供了一个下载测试列表供大家测试,你可以选择访问速度最优的位置。网上其它同学很多选择Fremont,不过我测试下来(杭州ADSL4M)Newark最快,浏览器单线程下载速度稳定达到300K+,所以我选择了Newark。估计各地网络不同有所区别,大家选用建议自行测试。

    系统我选择的是ubuntu(嗯,已经提供9.10Server了),主要是出于我对ubuntu桌面版的使用习惯和偏爱。网上很多说法是ubuntu服务器版不够专业,不过我本来也不太够专业,也不知道ubuntu哪里不够专业,呵呵,也就无所谓了。

  2. 环境基本配置

    在web面板开启虚拟机以后,你就可以通过root用户和密码在客户端(推荐putty)登录。登陆后第一件事情,增加一个新账号(用你的常用名 例如myname)。

    adduser myname
    visudo
    

    在该文件中增加以下行

    myname ALL=(ALL) ALL
    

    此操作使myname用户可以使用sudo命令,如果要给其他账号提供sudo操作权限,类推。

    ok,exit命令退出putty登录再重启,通过myname账号和你设置的密码重新登录系统。Linode默认提供的ubuntu的源缺少一些开发包,所以我们先编辑一下源。

    sudo vi /etc/apt/source.list
    

    我们需要做的仅仅是将文件中已经注释掉的几行源去掉前面的“#”,重新开启即可——不需要为具体的源担心,默认的已经飞速了。然后我们需要刷新一下

    sudo apt-get update
    

    我习惯使用vim,所以先安一个

    sudo apt-get install vim
    

    我们还需要一个中文UTF的本地环境,不过这得看情况,也许你不需要?

    sudo locale-gen zh_CN.UTF-8
    sudo /usr/sbin/update-locale LANG=zh_CN.UTF-8
    

    将服务器时间设置为上海时间

    sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    
  3. nginx+spawn-fastcgi+php+mysql

    我们先来安一个编译包吧

    sudo apt-get install build-essential
    

    然后php和mysql安装最方便,直接从apt源安装即可

    sudo apt-get -y install php5-common php5-mysql php5-sqlite php5-tidy php5-xmlrpc php5-xsl php5-cgi php5-mcrypt php5-curl php5-gd php5-memcache php5-mhash php5-pspell php5-sqlite libmagick9-dev php5-cli
    sudo apt-get install mysql-server mysql-client libmysqlclient15-dev
    

    php的安装命令我是copy的,然后去掉了一些不必要的包,如果你觉得不必要也可以去掉,真正基本环境必须的只有php5 php5-cgi而已。mysql在安装过程中会让你设置root的密码,不要设置太简单了,也不要和系统root密码一样。

    然后我们需要安装nginx

    cd ~
    mkdir source
    cd source
    wget http://sysoev.ru/nginx/nginx-0.7.64.tar.gz
    tar -zxvf nginx-0.7.64.tar.gz
    cd nginx-0.7.64
    sudo apt-get install libssl-dev libpre3-dev zlib1g-dev
    ./configure --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --with-md5-asm --with-md5=/usr/include --with-sha1-asm --with-sha1=/usr/include --with-http_stub_status_module
    make
    sudo make install
    

    在configure的时候可以定义很多参数,官方的参考文档在这里。我在网上看的相关的文章,定义了很多路径的参数,也许有什么特别的理由或习惯需要特别定义,我不太了解,所以我都去掉了,就用默认的路径就好。nginx默认的安装路径是/usr/local/nginx,其中包含了配置、基本的html页面、log、站点设置等。with-md5-asm和with-sha1-asm官方wiki说只建议使用一种,不过只用一种我无法通过编译,不知道问题所在。另外with-http_stub_status_module可以开通nginx内置的状态统计功能,建议都配置上,后面会开启该功能。

    然后我们来安装spawn-fcgi,这是lighttpd的fastcgi管理器,目前已经是独立项目了,当前最新版本是1.6.3。

    cd ~/source
    wget http://www.lighttpd.net/download/spawn-fcgi-1.6.3.tar.gz
    tar -zxvf spawn-fcgi-1.6.3.tar.gz
    cd spawn-fcgi-1.6.3
    sudo ./configure && make && make install
    

………

做的事情不多,要写清楚真累,太长了,休息下,明天再整理。