守望的麦子

Linode 从配置到优化

2017-2-14    大连 /linux/2017/02/14/linode.html linux ubuntu, linode, nginx, apache, mysql, php, git, supervisor,

本文最近更新于 2018 年 1 月 19 日,大连

本文链接:https://wheat.at/go/linode.html

关于 Linode

美国 VPS 提供商,专注于基于 KVM[KVM 为完全虚拟化技术,各 VPS 之间互相独立,基本互不影响,而且可以任意修改内核。] 虚拟的 VPS,成立于 2003 年,办公地点在新泽西。

网址:https://www.linode.com

为什么选择 Linode?

购买 Linode

Linode 只支持信用卡购买,你可以选择月付或者年付。

购买链接:https://www.linode.com (注册时 Referral Code 处输入 075548fdc450305bd72ce717a0f5604c11211bcc)

部署系统

1.登录/进入控制中心 – 进入 Dashboard – Deploy a Linux Distribution
2.选择 Linux 发行版(Distribution) – 设定磁盘大小(单位 MB)- 选择是否使用交换空间(swap) – 设定 root 密码(以后还能改)等,然后点击 Deploy 就开始安装系统了。

安装好系统之后,首次登陆通常会收到系统更新提醒,及时更新可以获得最新的安全补丁和系统修复包。

这些操作都是一目了然的,没什么难度,特别是 Linode 还有详细的新手指南。配置优化 LAMP 服务器就比较费事了,下面是 LAMP 过程中的一些总结和记录。

基于 Linux Distribution: Ubuntu 14.04 LTS
切记:因为系统不同,指令可能有所不同;硬件不同,配置方式也可能有些不同。

需要修改 hostname 吗?

当购买了 VPS 主机,云主机或者独享主机之后,主机服务商会默认地为你分配一个主机名,而且这个主机名与我们所知的网站域名并没有什么联系,即使你不做任何修改,也不会对网站访问有任何影响。

登录服务器后,使用以下命令查看主机名:

1 hostname -f

例如,你会看到类似以下的信息:

1 li123-45.members.linode.com

如果你不在意这些,可以跳过这一步。

配置 /etc/hostname,通过以下命令修改主机名:

1 echo "myhostname" > /etc/hostname hostname -F /etc/hostname

配置 /etc/default/dhcpcd(如果配置文件 /etc/default/dhcpcd 存在,将这个文件内的这段内容注释掉):

1 #SET_HOSTNAME='yes'

配置 /etc/hosts(将 myhostname 替换成你的主机名,mydomain.com 替换成你服务器的域名,123.123.12.12 替换为你服务器的 IP 地址):

1 127.0.0.1 localhost.localdomain localhost 123.123.12.12 myhostname.mydomain.com myhostname

重启 networking 服务

1 /etc/init.d/networking restart

测试结果:

1 hostname -f

选择 Apache 还是 Nginx?

Nginx 是一款高性能的 HTTP 服务器软件,由俄罗斯的 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。其将源代码以类 BSD 许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。作为 HTTP 服务器软件市场的新贵,目前国内很多大型网站都采用了 Nginx 作为默认的 web 服务器,比如阿里、腾讯、新浪等等,国外就更多了。

在 Nginx 之前,HTTP 服务器软件主要被 Apache 垄断。Nginx 比 Apache 优秀在哪呢?

master-worker 设计模式核心思想是将原来串行的逻辑并行化,并将逻辑拆分成很多独立模块并行执行。其中主要包含两个主要组件 master 和 worker,master 主要将逻辑进行拆分,拆分为互相独立的部分,同时维护了 worker 队列,将每个独立部分下发到多个 worker 并行执行,worker 主要进行实际逻辑计算,并将结果返回给 master。

这种进程模式的好处是采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快重新启动新的 worker 进程。当然,worker 进程的异常退出,肯定是程序有 bug 了,异常退出,会导致当前 worker 上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

Nginx 官网:https://www.nginx.org/

Apache 官网:https://www.apache.org/

安装&优化 Apache

通过这面的命令即可安装 Apache:

1 sudo apt-get install apache2

安装 Apache 很容易,但是如果使用默认配置,则很可能会遇到内存不足的情况。下面以 Linode 1GB 为例优化 Apache(如果是 Linode 2GB 可以将相应参数 x 2 进行配置)。

注意:修改之前建议先备份一份配置文件,不仅针对于这里的 Apache 配置,总有一天你会发现事先备份的好处。通过下面的命令备份:

1 sudo cp /etc/apache2/apache2.conf /etc/apache2/apache2.conf.orig

编辑 /etc/apache2/apache2.conf 文件,在 apache2.conf 文件末尾添加如下内容:

 1 KeepAlive Off
 2 
 3 ...
 4 <IfModule mpm_prefork_module>
 5 StartServers 2
 6 MinSpareServers 6
 7 MaxSpareServers 12
 8 MaxClients 30
 9 MaxRequestsPerChild 3000
10 </IfModule>

保存配置,使用下面的命令重启 Apache 使其生效。

1 sudo service apache2 restart

现在 Apache 已经被优化,接下来就可以开始通过 Apache 部署网站了。

首先,禁用默认的 Apache Virtual Host:

1 sudo a2dissite *default

举例,为 example.com 网站创建目录:

1 cd /var/www
2 sudo mkdir example.com
3 sudo mkdir -p example.com/public_html
4 sudo mkdir -p example.com/log
5 sudo mkdir -p example.com/backups

通过下面的命令为网站生成 virtual host 文件:

1 sudo vi /etc/apache2/sites-available/example.com.conf

注意:将文件名 example.com 替换成自己的域名。

编辑上面的文件,例如使用下面的基本设置:

 1 # domain: example.com
 2 # public: /var/www/example.com/public_html/
 3 
 4 <VirtualHost *:80>
 5   # Admin email, Server Name (domain name), and any aliases
 6   ServerAdmin webmaster@example.com
 7   ServerName  www.example.com
 8   ServerAlias example.com
 9 
10   # Index file and Document Root (where the public files are located)
11   DirectoryIndex index.html index.php
12   DocumentRoot /var/www/example.com/public_html
13   # Log file locations
14   LogLevel warn
15   ErrorLog  /var/www/example.com/log/error.log
16   CustomLog /var/www/example.com/log/access.log combined
17 </VirtualHost>

保存配置并启用:

1 sudo a2ensite example.com.conf

该命令会在相应目录生成一个软链接以用来激活 virtual host。

最后重启 Apache 服务使其生效。

1 sudo service apache2 restart

如果要在 VPS 上部署多个网站,继续为每个网站重复上述步骤。现在上传网站内容,并修改域名 DNS 就可以看到你的网站了!

停止 Apache

1 sudo service apache2 stop

卸载 Apache

输入以下的命令进行卸载:

1 sudo apt-get --purge remove apache2
2 sudo apt-get --purge remove apache2.2-common
3 sudo apt-get --purge remove apache2-utils
4 sudo apt-get autoremove

卸载完毕后,删除一些原来的目录,记得备份相关文件。

删掉 /etc/apache2 文件夹:

1 sudo rm -r /etc/apache2

删掉 /etc/init.d/apache2 文件:

1 sudo rm -r /etc/init.d/apache2

删掉 libapache2-mod-jk 文件:

1 sudo rm -rf /etc/libapache2-mod-jk

为了删除的更干净,我们最好查找一些配置文件并删除:

1 sudo find /etc -name "*apache*" -exec rm -rf {} \;

删除关联,清理残留:

1 dpkg -l | grep apache2
2 dpkg -l | grep apache2 | awk '{print $2}'| xargs dpkg -P

安装&优化 Nginx

执行下面的命令安装 Nginx,然后启动:

1 sudo apt-get install nginx
2 sudo service nginx start

如果安装和启动都没有问题,我们再调整几个参数就可以了:

找到 /etc/nginx/nginx.conf,做以下几个改动:

其他的采用默认值即可,然后重新加载参数:

1 sudo nginx -s reload

关于其他的 Nginx 优化配置,建议 Google 和研读官方文档。

每一个项目,每一个模块,甚至每一行代码都有着自己的故事,这些故事都应该被留存在自己的历史档案里,而我们大部分的时间都只是他们的过客而已。
— 《OpenStack 设计与实现》

安装、优化和创建 MySQL

MySQL 是应用最为广泛的开源数据库,技术成熟,安装简单:

1 sudo apt-get install mysql-server

Linode 2GB 的 MySQL 优化实例:

打开 my.cnf

1 sudo vi /etc/mysql/my.cnf

注释掉 key_buffer 行。

编辑下面的值:

1 max_allowed_packet = 1M
2 thread_stack = 128K
3 ...
4 max_connections = 75

将下面的内容添加到 my.cnf 末尾:

1 table_open_cache = 32M
2 key_buffer_size = 32M

保存,重启 MySQL 进程:

1 sudo service mysql restart

接下来就可以创建数据库了,登录 MySQL:

1 mysql -u root -p

创建一个数据库(将 exampleDB 替换为要创建的数据库名字):

1 CREATE DATABASE exampleDB;

在 MySQL 中创建一个用户(将 example_user 替换为要创建的用户名,password 为密码):

1 GRANT ALL ON exampleDB.* TO 'example_user' IDENTIFIED BY 'password';
2 FLUSH PRIVILEGES;

退出:

1 quit

MySQL 部分完成。

via https://www.linode.com/docs/websites/hosting-a-website/

安装&优化 PHP

安装 PHP:

1 sudo apt-get install php5 php-pear
2 sudo apt-get install php5-mysql
3 sudo apt-get install php5-fpm

php5-fpm 是 PHP FastCGI 的实现之一,能够更好的管理 PHP 进程,控制内存使用,平滑重载等。

配置 PHP:

1 sudo vim /etc/php5/fpm/php.ini

找到 cgi.fix_pathinfo=1 这一行,把 1 改为 0。值为 1 时,PHP 的解释器会尽可能的去解析客户端请求的文件各种类型,这会引发一些安全漏洞,设置为 0 时,解释器只会去解析特定的文件类型,设置为 0 是一种相对安全的处理策略。

修改 www.conf

1 sudo vi /etc/php5/fpm/pool.d/www.conf

listen = 127.0.0.1:9000 修改为 listen = /var/run/php5-fpm.sock,前者是走 TCP socket,后者是 Unix domain socket,如果服务都在同一台机器上,建议使用后者,效率更好一些。

同时,建议根据个人服务器配置 process managerpm 可以设置为 staticdynamic 或者 ondemand

以一种 pm = dynamic 配置为例:

1 pm = dynamic #如何控制子进程,选项有 static,dynamic 和 ondemand。如果选择 static,则由 pm.max_children 指定固定的子进程数。如果选择 dynamic,则由下开参数决定:
2 pm.max_children #子进程最大数
3 pm.start_servers #启动时的进程数
4 pm.min_spare_servers #保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程
5 pm.max_spare_servers #保证空闲进程数最大值,如果空闲进程大于此值,此进行清理
6 pm.max_requests = 1000 #设置每个子进程重生之前服务的请求数,对于可能存在内存泄漏的第三方模块来说是非常有用的。如果设置为 0 则一直接受请求,等同于 PHP_FCGI_MAX_REQUESTS 环境变量。默认值为 0。

那么,对于我们的服务器,选择哪种执行方式比较好呢?事实上,跟 Apache 一样,运行的 PHP 程序在执行完成后,或多或少会有内存泄露的问题。这也是为什么开始的时候一个 php-fpm 进程只占用 3M 左右内存,运行一段时间后就会上升到 20-30M 的原因了。

对于内存大的服务器(比如 8G 以上)来说,指定静态(static)的实际上更为妥当。因为这样不需要进行额外的进程数目控制,会提高效率,动态创建回收进程对服务器资源也是一种消耗,所以内存够大的情况下开静态效果会更好。pm.max_children 数量如果根据内存/30M计算,比如 8GB 内存可以设置为 100,那么 php-fpm 耗费的内存就能控制在 2G-3G 的样子(由于一般个人站 Nginx、MySQL 都在一台机器上,所以通常要预留至少一半内存给它们)。如果内存稍微小点,比如 1G,那么指定动态的进程数量会更加有利于服务器的稳定,这样可以保证 php-fpm 只获取够用的内存,将不多的内存分配给其他应用去使用,会使系统的运行更加畅通。

对于小内存的服务器来说,比如 256M 内存的 VPS,即使按照一个 20M 的内存量来算,10 个 php-cgi 进程就将耗掉 200M 内存,那系统的崩溃就应该很正常了。因此应该尽量地控制 php-fpm 进程的数量,大体明确其他应用占用的内存后,给它指定一个静态的小数量,会让系统更加平稳一些。或者使用动态方式,因为动态方式会结束掉多余的进程,回收释放一些内存,所以推荐在内存较少的服务器或 VPS 上使用。最大数量如果根据内存/20M计算,比如说 512M 的 VPS,建议 pm.max_spare_servers 设置为 20。至于 pm.min_spare_servers,则建议根据服务器的负载情况来设置,比较合适的值在 5~10 之间。

再以一个 pm = ondemand 为例:

1 ; Choose how the process manager will control the number of child processes.
2 pm = ondemand
3 pm.max_children = 75
4 pm.process_idle_timeout = 10s
5 pm.max_requests = 500

这样设置之后,只有当有需要的时候,子进程才会被产生。子进程执行完以后,会留在内存中 10 秒钟时间(pm.process_idle_timeout = 10s),然后自己退出。

重新启动 PHP,PHP 的安装和配置就算完成了:

1 sudo service php5-fpm restart

安装&配置 Git

安装:

1 sudo apt-get install git

在 Linode 上为网站创建 repository,便于迭代更新网站:

1 sudo mkdir /var/gitRepos
2 cd /var/gitRepos
3 sudo git init --bare example.com.git

编辑 hooks:

1 cd /var/gitRepos/example.com.git/hooks
2 vi post-receive

post-receive 内容如下:

1 #!/bin/bash -l
2 GIT_REPO=/var/gitRepos/example.com.git
3 TMP_GIT_CLONE=/var/tmp/example.com
4 PUBLIC_WWW=/var/www/example.com
5 git clone --depth=1 $GIT_REPO $TMP_GIT_CLONE
6 rm -rf $PUBLIC_WWW}*
7 cp -rf $TMP_GIT_CLONE/* $PUBLIC_WWW
8 rm -rf $TMP_GIT_CLONE

增加执行权限,重启 Nginx 服务使其生效:

1 chmod +x post-receive
2 service nginx restart

为本地 Git repository 添加远端库:

1 git remote add origin git@example.com:/var/gitRepos/example.com.git

接下来就可以完成首次提交了。例如:

1 git push origin master

via https://jekyllrb.com/docs/deployment-methods/

安装&配置 Supervisor

有些服务在服务器运行可能会不稳定,所以我们将其运行管理任务交给 Supervisor,这样如果进程挂了,Supervisor 会帮我们自动将其重新启动,保证稳定性。

Supervisor 由 Python 编写,官网是 https://supervisord.org/

安装&配置:https://supervisord.org/installing.html

一个参考实例(生成的 supervisor 默认配置文件为 /etc/supervisor/supervisord.conf):

 1 # 在 /etc/supervisor/supervisord.conf 文件最后添加服务实例,代码如下 
 2 # 这一段配置如果配置错误,会导致 Supervisor 的启动失败 
 3 
 4 [program:shadowsocks] 
 5 command = ss-server -c /home/xxx/config2.json 
 6 user = user 
 7 autostart = true 
 8 autoresart = true 
 9 stderr_logfile = /var/log/supervisor/ss.stderr.log 
10 stdout_logfile = /var/log/supervisor/ss.stdout.log

command 是服务的运行命令;
user 是执行命令的用户;
autostart 和 autoresart 指自动启动和自动重启;
stdout_logfile 重定向程序输出到此文件;
stderr_logfile 重定向程序错误到此文件;

运行 Supervisor:

1 supervisord -c /etc/supervisor/supervisord.conf #使用 -c 指定配置文件

或者

1 supervisord #如果不指定配置文件,那么配置文件会依次从下面的文件夹中寻找:$CWD/supervisord.conf;$CWD/etc/supervisord.conf;/etc/supervisord.conf

当我们修改配置后,为了使新的配置生效,我们需要通知 Supervisor 使新配置文件生效,我们使用下面的命令:

1 supervisorctl update

当 Supervisor 运行后,管理它就不能用 supervisord 了,而是 supervisorctl。例如下面是一些常用的运行命令:

 1 supervisorctl start all 
 2 supervisorctl stop all 
 3 supervisorctl restart all 
 4 supervisorctl stop shadowsocks 
 5 supervisorctl start shadowsocks 
 6 supervisorctl restart shadowsocks
 7 service supervisor restart
 8 supervisorctl status
 9 supervisorctl reload
10 supervisorctl update

使 Supervisor 开机自启动:

1 vi /etc/rc.local 

exit 0 前添加以下内容:

1 supervisord -c /etc/supervisor/supervisord.conf

更新历史:

2015/11/21#曼谷 - 初稿
2017/02/14#大连 - 发布
2017/11/19#东京 - 更新
2018/01/19#大连 - 增加 php-fpm 配置

关于作者
麦子,80 后,现从事通信行业。安卓玩家一个人的书房朗读者。
MRJENGLISH
jsntn
jasonwtien
jasonwtien
更多…… /about.html

最近更新: