Linode 从配置到优化
本文最近更新于 2019 年 03 月 19 日 ,日本
- 关于 Linode
- 为什么选择 Linode?
- 购买 Linode
- 部署系统
- 选择 Apache 还是 Nginx?
- 安装&优化 Apache
- 安装&优化 Nginx
- 安装、优化和创建 MySQL
- 安装&优化 PHP
- 安装&配置 Git
- 安装&配置 Supervisor
本文链接:https://jsntn.com/go/linode.html
关于 Linode
美国 VPS 提供商,专注于基于 KVM1 虚拟的 VPS,成立于 2003 年,办公地点在新泽西。
为什么选择 Linode?
- Linode 的稳定性是有口皆碑的。稳定到你的 VPS 可以几十天,甚至几个月不宕机,所以你的 VPS 的 uptime 会一直很高。
- 强大的后台管理,支持手机 App 管理。
- 多机房选择。测速 https://www.linode.com/speedtest
- 无缝升级与数据迁移。所有的套餐可以无缝升级到更高一级的套餐,而不用重装系统,对数据无影响。另外,Linode 的亮点在于,可以在 5 个机房之间直接进行 VPS 的无缝搬迁,并且这一过程是无需人工干预的,也不必担心数据丢失。自动搬迁完毕后,VPS 马上就能启动了。
- 完善的帮助文件。Linode 提供了简洁清晰的文档,从后台的基本操作到配置,安全问题,相关软件的安装等等,让人一看就明白自己的问题要从哪找答案。对用户很有帮助,甚至其他 VPS 的用户都能从 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 主机,云主机或者独享主机之后,主机服务商会默认地为你分配一个主机名,而且这个主机名与我们所知的网站域名并没有什么联系,即使你不做任何修改,也不会对网站访问有任何影响。
登录服务器后,使用以下命令查看主机名:
hostname -f
例如,你会看到类似以下的信息:
li123-45.members.linode.com
如果你不在意这些,可以跳过这一步。
配置 /etc/hostname
,通过以下命令修改主机名:
echo "myhostname" > /etc/hostname hostname -F /etc/hostname
配置 /etc/default/dhcpcd
(如果配置文件 /etc/default/dhcpcd
存在,将这个文件内的这段内容注释掉):
#SET_HOSTNAME='yes'
配置 /etc/hosts
(将 myhostname 替换成你的主机名,mydomain.com 替换成你服务器的域名,123.123.12.12 替换为你服务器的 IP 地址):
127.0.0.1 localhost.localdomain localhost 123.123.12.12 myhostname.mydomain.com myhostname
重启 networking 服务
/etc/init.d/networking restart
测试结果:
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 优秀在哪呢?
Nginx 的所有模块都是全静态编译的,启动 Nginx 后,Nginx 的模块被自动加载,静态库执行效率更高。
Nginx 支持多进程的工作方式,Nginx 启动后会有一个 master 进程,一个或多个 worker 进程。
master 进程的作用是?
读取并验证配置文件
nginx.conf
,管理 worker 进程。
worker 进程的作用是?
每一个 worker 进程都维护一个线程(避免线程切换),处理连接和请求。注意 worker 进程的个数由配置文件决定,一般和 CPU 个数相关(有利于进程切换),配置几个就有几个 worker 进程。
master-worker 模式:
master-worker 设计模式核心思想是将原来串行的逻辑并行化,并将逻辑拆分成很多独立模块并行执行。其中主要包含两个主要组件 master 和 worker,master 主要将逻辑进行拆分,拆分为互相独立的部分,同时维护了 worker 队列,将每个独立部分下发到多个 worker 并行执行,worker 主要进行实际逻辑计算,并将结果返回给 master。
这种进程模式的好处是采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快重新启动新的 worker 进程。当然,worker 进程的异常退出,肯定是程序有 bug 了,异常退出,会导致当前 worker 上的所有请求失败,不过不会影响到所有请求,所以降低了风险。
- 处理大并发的请求内存消耗非常小。在 3 万并发连接下,开启的 10 个 Nginx 进程才消耗 150M 内存(15M*10=150M)。
扩展阅读:
Nginx 官网:https://www.nginx.org/
Apache 官网:https://www.apache.org/
安装&优化 Apache
通过这面的命令即可安装 Apache:
sudo apt-get install apache2
安装 Apache 很容易,但是如果使用默认配置,则很可能会遇到内存不足的情况。下面以 Linode 1GB 为例优化 Apache(如果是 Linode 2GB 可以将相应参数 x 2 进行配置)。
注意:修改之前建议先备份一份配置文件,不仅针对于这里的 Apache 配置,总有一天你会发现事先备份的好处。通过下面的命令备份:
sudo cp /etc/apache2/apache2.conf /etc/apache2/apache2.conf.orig
编辑 /etc/apache2/apache2.conf
文件,在 apache2.conf
文件末尾添加如下内容:
KeepAlive Off
...
<IfModule mpm_prefork_module>
StartServers 2
MinSpareServers 6
MaxSpareServers 12
MaxClients 30
MaxRequestsPerChild 3000
</IfModule>
保存配置,使用下面的命令重启 Apache 使其生效。
sudo service apache2 restart
现在 Apache 已经被优化,接下来就可以开始通过 Apache 部署网站了。
首先,禁用默认的 Apache Virtual Host:
sudo a2dissite *default
举例,为 example.com 网站创建目录:
cd /var/www
sudo mkdir example.com
sudo mkdir -p example.com/public_html
sudo mkdir -p example.com/log
sudo mkdir -p example.com/backups
通过下面的命令为网站生成 virtual host 文件:
sudo vi /etc/apache2/sites-available/example.com.conf
注意:将文件名 example.com 替换成自己的域名。
编辑上面的文件,例如使用下面的基本设置:
# domain: example.com
# public: /var/www/example.com/public_html/
<VirtualHost *:80>
# Admin email, Server Name (domain name), and any aliases
ServerAdmin [email protected]
ServerName www.example.com
ServerAlias example.com
# Index file and Document Root (where the public files are located)
DirectoryIndex index.html index.php
DocumentRoot /var/www/example.com/public_html
# Log file locations
LogLevel warn
ErrorLog /var/www/example.com/log/error.log
CustomLog /var/www/example.com/log/access.log combined
</VirtualHost>
保存配置并启用:
sudo a2ensite example.com.conf
该命令会在相应目录生成一个软链接以用来激活 virtual host。
最后重启 Apache 服务使其生效。
sudo service apache2 restart
如果要在 VPS 上部署多个网站,继续为每个网站重复上述步骤。现在上传网站内容,并修改域名 DNS 就可以看到你的网站了!
附:如何停止 Apache?
sudo service apache2 stop
附:如何卸载 Apache?
输入以下的命令进行卸载:
sudo apt-get --purge remove apache2
sudo apt-get --purge remove apache2.2-common
sudo apt-get --purge remove apache2-utils
sudo apt-get autoremove
卸载完毕后,删除一些原来的目录,记得备份相关文件。
删掉 /etc/apache2
文件夹:
sudo rm -r /etc/apache2
删掉 /etc/init.d/apache2
文件:
sudo rm -r /etc/init.d/apache2
删掉 libapache2-mod-jk
文件:
sudo rm -rf /etc/libapache2-mod-jk
为了删除的更干净,我们最好查找一些配置文件并删除:
sudo find /etc -name "*apache*" -exec rm -rf {} \;
删除关联,清理残留:
dpkg -l | grep apache2
dpkg -l | grep apache2 | awk '{print $2}'| xargs dpkg -P
安装&优化 Nginx
执行下面的命令安装 Nginx,然后启动:
sudo apt-get install nginx
sudo service nginx start
如果安装和启动都没有问题,我们再调整几个参数就可以了:
找到 /etc/nginx/nginx.conf
,做以下几个改动:
- 把
worker_processes
设置为服务器的 CPU 核数 - 在
event
里增加use epoll
- 把
worker_connections
的值设置大一点,如果是 1G 内存,不要大于100000/worker_processes
其他的采用默认值即可,然后重新加载参数:
sudo nginx -s reload
关于其他的 Nginx 优化配置,建议 Google 和研读官方文档。
每一个项目,每一个模块,甚至每一行代码都有着自己的故事,这些故事都应该被留存在自己的历史档案里,而我们大部分的时间都只是他们的过客而已。
— 《OpenStack 设计与实现》
安装、优化和创建 MySQL
MySQL 是应用最为广泛的开源数据库,技术成熟,安装简单:
sudo apt-get install mysql-server
Linode 2GB 的 MySQL 优化实例:
打开 my.cnf
:
sudo vi /etc/mysql/my.cnf
注释掉 key_buffer
行。
编辑下面的值:
max_allowed_packet = 1M
thread_stack = 128K
...
max_connections = 75
将下面的内容添加到 my.cnf
末尾:
table_open_cache = 32M
key_buffer_size = 32M
保存,重启 MySQL 进程:
sudo service mysql restart
接下来就可以创建数据库了,登录 MySQL:
mysql -u root -p
创建一个数据库(将 exampleDB 替换为要创建的数据库名字):
CREATE DATABASE exampleDB;
在 MySQL 中创建一个用户(将 example_user 替换为要创建的用户名,password 为密码):
GRANT ALL ON exampleDB.* TO 'example_user' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
退出:
quit
MySQL 部分完成。
参考:
安装&优化 PHP
安装 PHP:
sudo apt-get install php5 php-pear
sudo apt-get install php5-mysql
sudo apt-get install php5-fpm
php5-fpm 是 PHP FastCGI 的实现之一,能够更好的管理 PHP 进程,控制内存使用,平滑重载等。
配置 PHP:
sudo vim /etc/php5/fpm/php.ini
找到 cgi.fix_pathinfo=1
这一行,把 1
改为 0
。值为 1
时,PHP 的解释器会尽可能的去解析客户端请求的文件各种类型,这会引发一些安全漏洞,设置为 0
时,解释器只会去解析特定的文件类型,设置为 0
是一种相对安全的处理策略。
修改 www.conf
:
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 manager
,pm
可以设置为 static
,dynamic
或者 ondemand
。
以一种 pm = dynamic
配置为例:
pm = dynamic #如何控制子进程,选项有 static,dynamic 和 ondemand。如果选择 static,则由 pm.max_children 指定固定的子进程数。如果选择 dynamic,则由下开参数决定:
pm.max_children #子进程最大数
pm.start_servers #启动时的进程数
pm.min_spare_servers #保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程
pm.max_spare_servers #保证空闲进程数最大值,如果空闲进程大于此值,此进行清理
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
为例:
; Choose how the process manager will control the number of child processes.
pm = ondemand
pm.max_children = 75
pm.process_idle_timeout = 10s
pm.max_requests = 500
这样设置之后,只有当有需要的时候,子进程才会被产生。子进程执行完以后,会留在内存中 10 秒钟时间(pm.process_idle_timeout = 10s
),然后自己退出。
重新启动 PHP,PHP 的安装和配置就算完成了:
sudo service php5-fpm restart
安装&配置 Git
安装:
sudo apt-get install git
在 Linode 上为网站创建 repository,便于迭代更新网站:
sudo mkdir /var/gitRepos
cd /var/gitRepos
sudo git init --bare example.com.git
编辑 hooks:
cd /var/gitRepos/example.com.git/hooks
vi post-receive
post-receive
内容如下:
#!/bin/bash -l
GIT_REPO=/var/gitRepos/example.com.git
TMP_GIT_CLONE=/var/tmp/example.com
PUBLIC_WWW=/var/www/example.com
git clone --depth=1 $GIT_REPO $TMP_GIT_CLONE
rm -rf $PUBLIC_WWW}*
cp -rf $TMP_GIT_CLONE/* $PUBLIC_WWW
rm -rf $TMP_GIT_CLONE
增加执行权限,重启 Nginx 服务使其生效:
chmod +x post-receive
service nginx restart
为本地 Git repository 添加远端库:
git remote add origin [email protected]:/var/gitRepos/example.com.git
接下来就可以完成首次提交了。例如:
git push origin master
参考:
安装&配置 Supervisor
有些服务在服务器运行可能会不稳定,所以我们将其运行管理任务交给 Supervisor,这样如果进程挂了,Supervisor 会帮我们自动将其重新启动,保证稳定性。
Supervisor 由 Python 编写,官网是 supervisord.org
安装&配置:supervisord.org/installing.html
一个参考实例(生成的 supervisor 默认配置文件为 /etc/supervisor/supervisord.conf
):
# 在 /etc/supervisor/supervisord.conf 文件最后添加服务实例,代码如下
# 这一段配置如果配置错误,会导致 Supervisor 的启动失败
[program:shadowsocks]
command = ss-server -c /home/xxx/config2.json
user = user
autostart = true
autoresart = true
stderr_logfile = /var/log/supervisor/ss.stderr.log
stdout_logfile = /var/log/supervisor/ss.stdout.log
command
是服务的运行命令;user
是执行命令的用户;autostart
和autoresart
指自动启动和自动重启;stdout_logfile
重定向程序输出到此文件;stderr_logfile
重定向程序错误到此文件;
运行 Supervisor:
supervisord -c /etc/supervisor/supervisord.conf #使用 -c 指定配置文件
或者
supervisord #如果不指定配置文件,那么配置文件会依次从下面的文件夹中寻找:$CWD/supervisord.conf;$CWD/etc/supervisord.conf;/etc/supervisord.conf
当我们修改配置后,为了使新的配置生效,我们需要通知 Supervisor 使新配置文件生效,我们使用下面的命令:
supervisorctl update
当 Supervisor 运行后,管理它就不能用 supervisord
了,而是 supervisorctl
。例如下面是一些常用的运行命令:
supervisorctl start all
supervisorctl stop all
supervisorctl restart all
supervisorctl stop shadowsocks
supervisorctl start shadowsocks
supervisorctl restart shadowsocks
service supervisor restart
supervisorctl status
supervisorctl reload
supervisorctl update
使 Supervisor 开机自启动:
vi /etc/rc.local
在 exit 0
前添加以下内容:
supervisord -c /etc/supervisor/supervisord.conf
更新历史:
2015/11/21#曼谷 - 初稿
2017/02/14#大连 - 发布
2017/11/19#东京 - 更新
2018/01/19#大连 - 增加php-fpm
配置
2019/03/19#日本 - 更新 Nginx 的「master 进程」和「worker 进程」部分内容
- KVM 为完全虚拟化技术,各 VPS 之间互相独立,基本互不影响,而且可以任意修改内核。 [return]
最近更新: