# ubuntu-server-deploy **Repository Path**: janpoem/ubuntu-server-deploy ## Basic Information - **Project Name**: ubuntu-server-deploy - **Description**: Ubuntu服务安装包,针对Ubuntu Server 14.04 LTS。现已支持 16.04 LTS。 - **Primary Language**: Shell - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 10 - **Forks**: 5 - **Created**: 2015-04-12 - **Last Updated**: 2021-11-02 ## Categories & Tags **Categories**: lamp **Tags**: None ## README #Ubuntu服务器常用组件安装包 * 本安装包目前包含tengine、php、memcached、mcrouter的自动下载、自动编译、自动生成配置、自动部署的功能。 * 本安装包基于Ubuntu Server 14.04 LTS,理论上ubuntu系应该都可以使用,centos就不包括了。 * 本安装包提供一系列的变量允许用户进行重载,以定制自己的需要的发布环境,用户重载的定义,在项目根目录下添加`user`目录,并在该目录下添加任意.sh的文件即可(加载模式是ls ./user/.sh,暂时无排序顺序,以后会考虑加入)。 * 系统启动的服务,通过sysv-rc-conf进行管理。 补充说明一下,我管理的服务器比较多,我的做法是,先获取这个项目的代码到服务器`git clone https://git.oschina.net/janpoem/ubuntu-server-deploy.git`,然后再通过`svn checkout http://anyhost/php-server/ ./user`,将某个服务器的配置文件从svn中导出。之后执行所需的安装命令即可。 一般来说,都不会在一台服务器上集中全部功能组件,一般会区分如:tengine_node_blancer、tengine_php_server、memcached_cluster、memcached_router等。这个安装包的作为开源项目,只提供了一个基础的环境,而具体的服务器配置,则保存在用户自己的版本库中(这个项目的user目录已经设置了忽略)。 ##todo ###phase1 * server,服务器环境初始化,已完成。 * tengine,tengine编译、配置初始化,已完成。 * 增加upstream的配置需求,未完成 * php,php编译、配置初始化,主线部分已完成 * 增加一个需求,ext的下载和自动编译,未完成 * memcache,安装memcached、mcrouter(facebook/folly)部署,已完成。 * 增加go部署,未完成 ###phase2 * 将各自的脚本,整合为一个文件:deploy,执行命令的情况:deploy php install、deploy tengine rebuild等。 * 提供一个全自动安装的机制。 * 可能需要换成高级语言实现,bash写得实在太痛苦了。 ##server.sh ```shell ./tengine.sh init|prepare|timezone|upgrade|clean|dns ``` 这个脚本主要执行apt-get upgrade和修正服务器的时区。 * prepare|init,初始化服务器环境,除了upgrade和修正时区以外,还会安装必须的packages,**每次第一次初始化服务器环境的时候,都应该执行该操作**。 * timezone,重复执行修正时区 * upgrade,重复执行upgrade * clean,清除本地的修正时区和upgrade的记录 * dns设置,Ubuntu的DNS设置是比较坑爹的事情,增加一个DNS写入的方法,该方法主要通过修改`/etc/resolvconf/resolv.conf.d/head`文件实现,会根据用户定义的DNS变量,注释掉该文件中正在使用的nameserver,并追加新的DNS。 **用户可修改变量** ```bash #!/usr/bin/env bash # file: user/dns.sh # oneDNS DNS[1]=112.124.47.27 DNS[2]=114.215.126.16 # 时区 TIMEZONE=Asia/Shanghai # 有需要追加的安装包,请使用这个变量,但最好使用+=的方式追加。 SERVER_REQUIRE_PKGS+="...需要增加的包..." ``` ##tengine.sh **可用的命令** ```shell ./tengine.sh install|rebuild|conf|conf-all|conf-main|conf-deny|conf-common|conf-php|script|sh|test|ensite|enphpsite ``` * install,编译安装tengine,如果tengine已经存在则会退出 * rebuild,强制重新编译安装tengine,如果tengine存在,会强制覆盖(包括配置文件) * conf|conf-all,初始化tengine的配置文件、必须的目录,如果指定的配置文件存在,会直接删除。该操作不包含php的tengine配置 * conf-main,初始化或重新初始化tengine的主配置文件,必须的目录等。 * conf-deny,初始化或重新初始化deny_settings的配置文件 * conf-common,初始化或重新初始化tengine/common的配置信息 * conf-php,初始化或重新初始化php的tengine设置,`./tengine.sh conf-php 127.0.0.1:8832 php53_settings` * 第1个参数为fcgipass的句柄, * 第2个参数为将要保存的配置文件名,这个参数提供多个php版本环境共存的配置可能性。 * script|sh,初始化或重新初始化/etc/init.d/tengine的服务启动脚本 * test,测试当前配置环境是否生效 * ensite,添加一个站点,`./tengine.sh ensite default 80 default` * 第1个参数为要创建的站点名称,他会根据这个名称生成配置文件,如default.conf,在未指定第3个参数,站点的目录时,他也会默认使用站点名称作为站点目录的名称。 * 第2个参数为添加的站点的网站端口号。 * 第3个参数为站点要创建的目录名,如果不指定,则默认使用第1个参数 * enphpsite,添加一个支持PHP的站点,`./tengine.sh enphpsite default 80 default`,参数如ensite,注意,该命令会出发自动执行conf-php的命令。所以如果要确保php环境的正确性,请先提前手动执行`./tengine.sh conf-php`。 上述的所谓重新初始化,是指,修改了配置,并按照最新的配置覆盖到指定的配置文件。 **用户可修改变量** ```bash # 所需要的包的版本号……这个最好和要下载的包名称保持一致,这里需要调整一下 TENGINE_NAME=tengine-2.1.0 PCRE_NAME=pcre-8.36 ZLIB_NAME=zlib-1.2.8 OPENSSL_NAME=openssl-1.0.2a # www_user和www_group,这个配置也对应到php编译使用 WWW_USER=www-data WWW_GROUP=www-data # tengine的目录,呃,这个不用怎么修改 TENGINE_CONF_DIR=/etc/tengine # tengine pidfile 这个也不用改了吧 TENGINE_PID_FILE=/var/run/tengine.pid # ...不说了 TENGINE_LOG_DIR=/var/log/tengine TENGINE_TMP_DIR=/var/tmp/tengine # ...不说了 TENGINE_TMP_CLIENT=${TENGINE_TMP_DIR}/client_body TENGINE_TMP_PROXY=${TENGINE_TMP_DIR}/proxy TENGINE_TMP_FCGI=${TENGINE_TMP_DIR}/fcgi TENGINE_TMP_UWSGI=${TENGINE_TMP_DIR}/uwsgi TENGINE_TMP_SCGI=${TENGINE_TMP_DIR}/scgi # tengine config配置变量 TENGINE_WORK_PROS=8 TENGINE_RLIMIT=102400 TENGINE_WORKER_CONNS=102400 TENGINE_DEFAULT_MIME_TYPE=text/html TENGINE_DEFAULT_CHARSET=text/html TENGINE_VHOST_LOG_DIR=/var/log/vhost TENGINE_VHOST_CONF_DIR=${TENGINE_CONF_DIR}/vhost # www的根目录 TENGINE_WWW_HOME=/var/www ``` ##mc.sh memcached和mcrouter相关的安装和配置。 [mcrouter](https://github.com/facebook/mcrouter),facebook团队荣誉出品,安装过程十分费劲,所以也打包在这个脚本里面了。 > Mcrouter is a memcached protocol router for scaling memcached (http://memcached.org/) deployments. It's a core component of cache infrastructure at Facebook and Instagram where mcrouter handles almost 5 billion requests per second at peak. **可用的命令** ```shell ./mc.sh install|conf|mcr-install|mcr-build|mcr-fb-build|mcr-conf|mcr-script|mcr-sh ``` * install,安装memcached * conf,初始化或重新覆盖memcached的配置文件。要构造用户自定义的conf,可在user.sh中定义所需的变量(其它的配置也适用)。 * mcr-install,安装mcrouter,其中包括编译安装double-conversion、facebook/folly,并初始化mcrouter的配置文件和服务脚本。 * mcr-conf,生成mcrouter的配置文件,可重复执行重复生成。因为配置文件是json格式,比较奇葩,参考下面的user.sh的`MCR_POOL_SERVERS` * mcr-script|mcr-sh,生成mcrouter的服务脚本,可重复执行重复生成。 * mcr-build,和mcr-install一样,如果要强制重新安装,需要加个任意的参数,如:`./mc.sh mcr-build 1` * mcr-fb-build,采用facebook的安装方式进行安装,facebook的安装,会需要下载gtest的项目的代码进行测试,不过国内无法正常的下载,所以使用facebook的安装方式,确保你能有效的下载到gtest。 如果你的服务器已经安装过facebook/folly,再执行mcr-install的时候,安装过程无异常,但是安装完毕,当你执行mcrouter --help,有可能会报出如下的错误: > mcrouter: error while loading shared libraries: libfolly.so.35: cannot open shared object file: No such file or directory 不管你如何重新编译安装folly,都无法解决,目前可行的方案是用facebook提供的方式进行安装,不过他会将你的gcc和g++用4.8替换掉。 如果你是全新的服务器安装,执行mcr-install都不会有这个异常出现,如果你已经自己手动编译安装过folly,则可能会出现上述的问题。发生这个问题的时候,请使用mcr-fb-build。 并且,mcr-fb-build和mcr-install安装的目标目录是不同的。 这个问题已经提交到mcrouter的issues了。https://github.com/facebook/mcrouter/issues/39 **用户可修改变量** ```bash # memcached的配置 MC_HOST=127.0.0.1 MC_PORT=11211 MC_LOG_FILE=/var/log/memcached.log MC_USER=memcache MC_SIZE=64 # mcrouter配置 MCR_PORT=5000 MCR_CONF_FILE=/etc/mcrouter.json MCR_LOG_FILE=/var/log/mcrouter.log MCR_PID_FILE=/var/run/mcrouter.pid # mcrouter pooled servers配置,这里当时没想清楚,所以实现的好,以后会改成数组的模式 MCR_POOL_SERVERS="\"${MC_HOST}:${MC_PORT}\",\"other_ip:other_port\"" ``` ###/etc/init.d/mcrouter使用说明 执行./mc.sh mcr-sh,会生成一个服务启动的脚本`/etc/init.d/mcrouter`,这个脚本用于日常启动、重启、停止mcrouter服务使用。 ```shell service mcrouter start|stop|restart|status|proc ``` * start,启动服务 * stop,停止服务 * restart,重启服务 * status,查看服务是否在运行 * proc,输出在运行的mcrouter的进程实例列表 **调试** 如上所述,因为folly的这个问题,所以适当的调试是必要的。如果当你执行`service mcrouter start`,看到他输出了ok,并且在PIDFILE也看到了进程id,但实际上当你执行`service mcrouter status`或`service mcrouter proc`时,却没有在运行的状态,这时多半是启动过程发生了异常。 这时你可以尝试直接执行:`mcrouter --help`来看看是不是有什么异常,如果help输出正常,那么就需要对/etc/init.d/mcrouter进行一些小修改: ```bash # 上面省略.... # 在这一行开始 . /lib/lsb/init-functions ${DAEMON} ${DAEMON_ARGS} exit 1 # 下面省略.... ``` 然后执行`/etc/init.d/mcrouter`来直接启动服务,你可能会看到一些其它的异常,比如他会提示你,端口被占用什么的。 当调试完毕服务已经可以正常启动了,再执行`mc.sh mcr-sh`,会重新生成这个服务启动脚本,并覆盖你修改的内容。 ##php.sh ```shell ./php.sh install|rebuild|fpm-conf|fpm-sh|ini|bin ``` * install,基本安装,如果安装目标已经存在,则会跳过编译过程。 * rebuild,强制重新安装 * fpm-conf,生成php-fpm的配置,配置文件存放在`/php编译目录/etc/php-fpm.conf`,而非/etc/php-fpm.conf * fpm-sh,生成php-fpm的服务脚本 * ini,生成php.ini文件,`/php编译目录/lib/php.ini` * bin,生成相关的phpbin文件,包括php、php-fpm、phpize、php-pecl、php-pear。 **用户可修改变量** 以下只列出推荐用户修改的 ```bash # PHP源代码下载的目录,可以留空,会以ubuntu-server-deploy/temp作为下载目录 PHP_TEMP_DIR= # 所需要的PHP版本,注意,目前这个编译,测试过php5.5和php5.6,其它的版本要实际测试 PHP_VER=5.5.23 # php的下载连接,注意,这里可选的有:${PHP_HK_SOURCE}、${PHP_CN_SOURCE}、${PHP_US_SOURCE} PHP_SOURCE=${PHP_HK_SOURCE} # php可执行命令的前缀,提供这个变量,主要为了能让系统同时存在多个php的版本,比如有些开源代码只支持php5.3... PHP_BIN_PREFIX=php # 需要追加apt-get的包名称,如果要多行,请用双引号包起来 PHP_REQ_PKGS= # php编译的命令,如果不是必要,最好不要直接修改这个命令,而是使用+=的方式追加,如下: PHP_CONF_CMD+="...追加的编译配置..." # php日志、pid文件 PHP_FPM_LOG_DIR=/var/log/${PHP_BIN_PREFIX}-fpm PHP_FPM_PID_FILE=/var/run/${PHP_BIN_PREFIX}-fpm.pid PHP_FPM_ERR_FILE=${PHP_FPM_LOG_DIR}/error.log PHP_FPM_LOG_LEVEL=warning # FPM最大进程数、超时时间、RLIMIT PHP_FPM_PROCESS_MAX=10 PHP_FPM_PROCESS_TIMEOUT=30 PHP_FPM_RLIMIT=65535 # FPM listen,你可以修改为unix:.... PHP_FPM_LISTEN="127.0.0.1:9902" # listen mode PHP_FPM_LISTEN_MODE=0666 # FPM PM设定 PHP_FPM_PM_MODE=static PHP_FPM_PM_START=10 PHP_FPM_PM_MAX_CHILDREN=10 PHP_FPM_PM_MAX_REQUESTS=0 # php.ini设置相关 PHP_INI_MAX_EXECUTION_TIME=60 PHP_INI_MAX_INPUT_TIME=60 PHP_INI_DEFAULT_CHARSET=UTF-8 PHP_INI_POST_MAX_SIZE=10M PHP_INI_UPLOAD_MAX_SIZE=10M ``` ##user.sh示例 ```bash #!/usr/bin/env bash MC_HOST=192.168.55.122 MC_PORT=11212 MC_LOG_FILE=/var/log/memcached.log MC_USER=memcache MC_SIZE=64 MCR_POOL_SERVERS="\"${MC_HOST}:${MC_PORT}\"" ``` ##ubuntu的中国源 如果你需要使用中国的apt-get更新源,请使用sohu源,已知163源在一些包的版本上有错误,谨慎谨慎。 **sohu源** ```bash deb http://mirrors.sohu.com/ubuntu/ trusty main restricted universe multiverse deb http://mirrors.sohu.com/ubuntu/ trusty-security main restricted universe multiverse deb http://mirrors.sohu.com/ubuntu/ trusty-updates main restricted universe multiverse deb http://mirrors.sohu.com/ubuntu/ trusty-proposed main restricted universe multiverse deb http://mirrors.sohu.com/ubuntu/ trusty-backports main restricted universe multiverse deb-src http://mirrors.sohu.com/ubuntu/ trusty main restricted universe multiverse deb-src http://mirrors.sohu.com/ubuntu/ trusty-security main restricted universe multiverse deb-src http://mirrors.sohu.com/ubuntu/ trusty-updates main restricted universe multiverse deb-src http://mirrors.sohu.com/ubuntu/ trusty-proposed main restricted universe multiverse deb-src http://mirrors.sohu.com/ubuntu/ trusty-backports main restricted universe multiverse ```