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应该自动获取该值,避免重复手工操作。

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
    

………

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