Build A Website
Last updated on March 15, 2024 pm
阿里云服务器 + Cloudflare + Hexo建站
1. 建站简介
目前搭建个人网站主要有两种选择:
- 动态网站:通常包括前端和后端两个部分,是通过数据库进行架构的网站,用户访问时网站会从数据库中提取信息并实时变更网站内容。这种网站通常利于维护、可交互性强,功能相对强大,但网站本身更加臃肿,用户访问时网页的打开速度也较慢。主流的动态博客框架有Wordpress、Typecho等。
- 静态网站:指全部通过html代码格式页面组成、所有内容都保存在html页面中的网站。可维护性较差,修改网页内容需要重新生存html页面,但访问速度极快、简洁、轻量。主流静态博客框架有Hexo、Hugo等。
部署方式也主要有两种选择:
- 托管至Github Pages上:借用Github的这一功能部署网站,操作简单、免费,但国内访问速度较慢,且无法被百度爬虫爬取收录。
- 部署至自己的云服务器上:需要花钱购买服务器、域名,但自主性强,可以随意折腾。
2. SSL证书
1. 添加域名
将你的域名添加到 Cloudflare,由于笔者早已完成添加,此处借用官网文档的这张图来说明。[1]
2 修改 Name Server
在购买域名的服务商的管理后台,修改域名的 Name Server,修改成 Cloudflare 的域名服务器。请填写 Dashboard 中给出的地址,不一定和笔者的完全一样,地址格式是 *.ns.cloudflare.com
。
图 2: 修改域名的名称服务器
3 添加 DNS 解析
点亮橙色小云朵,表示经过 Cloudflare 的代理,客户的请求由 CF 转发到我们的源服务器,即客户不知道也不能直连我们的服务器 IP。
图 3: 启用 DNS 解析 + 请求代理
注:一般服务器都应该配置,不能直接用 IP 访问,以免被 Script Boy 全网段扫描。
4 开启 Full SSL/TLS
在顶部的菜单条(新版在侧边栏),找到锁标志(SSL/TLS),修改通信链路加密方式为:Full(strict)。
图 4: 选择 Full SSL/TLS 严格端对端加密
这里有四个 SSL 加密选项,然而本页面的文字描述都比较简单,这几种模式之间具体有什么区别呢?
笔者先读了一遍官方的说明文档,对各自适用的场景有了大致的了解;并参阅了森见鹿博客的学习笔记,加深了理解;最后结合自己上手的实践过程,分别展开说明如下表。[2]
表 1: Cloudflare SSL 加密参数说明表
参数 | 含义 | 优点 | 缺点 |
---|---|---|---|
OFF | 完全不加密,即不使用 Https 协议 | 无 | 无加密,明文裸奔容易遭受到中间人攻击Chrome 等浏览器会显示该网站不安全影响搜索引擎收录 |
Flexible | 你的网站用户和 Cloudflare 之间有加密连接,但是从 Cloudflare 到你的服务器没有加密。即半程加密。 | 就算你的网站没有 SSL 证书,用户也能实现 SSL 加密访问。 | 不安全,在 Cloudflare 到源站中仍存在中间人攻击的风险你的服务器开启了 Http 转 Https,会导致 Redirect 死循环,浏览器报错 Too Many Redirects |
Full | 全程加密,从用户到 CDN 服务器再到你的网站,全程都是 SSL 加密的,反之亦同。只要你的服务器有 SSL 证书,就可以实现 SSL 加密访问。 | 不限制证书。 openssh 自签名证书还是正规机构签发的 SSL 都可用 | 在 Cloudflare 到源站中仍存在中间人攻击的风险(包括通过证书劫持和伪造等方式,与严格模式不同,Cloudflare 不会对源站的证书进行审核) |
Full (strict) | 全程加密,它与 Full SSL 的区别在于你的服务器必须是安装了已受信任的 SSL 证书(即购买的或正规机构签发的 SSL 证书),否则无法开启 SSL 加密访问。 | 安全 新增了对证书的认证,源站如果配置了自签证书、非可信证书或过期证书,那么 Cloudflare 会回复客户端访问失败并返回 526 响应码 | 无 |
了解更多关于Cloudflare 的端到端加密 。[3]
注:这四种模式仅在启用了 Cloudflare 的 CDN 后——即点亮了橙色小云朵——才有效。如果只是把 Cloudflare 用作 DNS 解析,那么上述的加密模式都不会起作用!
若是有选择困难症,森见鹿同学整理了常用需求对应的模式,请参照下面的流程图:
图 5: 加密模式选择流程图
5 创建 CF 证书
切换到 Origin Server 选项卡,创建 Origin Server Cetificate 源服务器证书(由 Cloudflare 免费签名)。
图 6: 创建 SSL 证书
6 填写证书的生成参数
图 7: 选填待生成证书的参数
- 密钥类型:2048 位的 RSA 私钥
- 作用域名:适用于哪些域名(子域名),支持通配符匹配。默认作用范围是
your.site
,*.your.site
。如果要添加域名的其它级别,例如,通配符未覆盖的级别(如one.two.your.site
)可在文本框中追加。 - 有效年限:15 年
7 获取生成的证书和密钥
图 8: 获取公私钥对
- 密钥格式:根据你的使用环境来选择公私匙对的格式。
- 大部分基于 OpenSSL Web 服务(如 Apache and NGINX)都是使用 PEM 文本文件(Base64 encoded ASCII),同时也兼容二进制格式的 DER 文件;
- Windows 系统或 Apache Tomcat 服务则是 PKCS#7 格式。
分别拷贝源证书和私钥内容,保存在服务器上。为了安全考虑,应限制只有 Web 服务能够读取。例如,笔者使用的 Nginx,它是以 www-data
用户运行的,因此,文件的权限设置成 root
才能写入,而 www-data
用户只能读取,权限细节如下:
1 |
|
图 9: 公私钥权限
注意:私钥内容不会存在 Cloudflare。一旦创建完成后,公共证书可以重复下载,但私钥内容无法从 CF 后台再次拷贝,请自行妥善保管。
8 更新 Web 服务器配置
以 Nginx 为例,更新 site-enabled 已启用的站点配置,修改
ssl_certificate
:指向你的证书,pem 后缀ssl_certificate_key
:指向你的私钥,key 后缀
1 |
|
1 |
|
注:其它类型的 Web 服务器的证书配置,可参考官方文档。[4]
5 总结
图 11: 确认证书有效期
至此,等 Nginx 重启完,刷新网站的页面,你就可以看到你的网站已经可以使用 HTTPS 加密访问了。
6 参考链接
- Change your authoritative nameservers (Full setup) | Cloudflare⤴
- Cloudflare 四种 SSL/TLS 加密模式的功能解析及实践 | 森见鹿的博客⤴
- SSL Encryption Modes | Cloudflare⤴
- Deploy an Origin CA certificate | Cloudflare⤴
- 在 NGINX 上安装 SSL 证书 | CertCloud
3. LNMP
原文地址:如何手动在ECS实例上搭建LNMP环境_云服务器 ECS-阿里云帮助中心 (aliyun.com)
Nginx是一款小巧而高效的Web服务器软件,可帮您在Linux系统下快速方便地搭建出LNMP Web服务环境。本文介绍如何手动在ECS实例上搭建LNMP环境,其中LNMP分别代表Linux、Nginx、MySQL和PHP。
1. 前提条件
已创建ECS实例并为实例分配了公网IP。
本教程中,创建的ECS实例配置说明如下。建议您与教程保持一致的操作系统版本,避免因版本问题导致的命令执行报错。
- 实例规格:ecs.c6.large
- 操作系统:Ubuntu 20.04
- 网络类型:专有网络VPC
- IP地址:公网IP
已在实例所属的安全组的入方向添加安全组规则并放行22、80、443端口。具体操作,请参见添加安全组规则。
说明
基于服务器数据安全考虑,本教程仅说明部署与测试LNMP环境所必须放行的端口,您可以根据实际需求,放行其他应用所需的端口号。例如,远程连接MySQL数据库时,需要放行MySQL默认占用的3306端口。
2. 背景信息
本教程适用于熟悉Linux操作系统,刚开始使用阿里云进行建站的个人用户。
本教程的示例操作中,使用的软件及软件版本信息如下:
- Nginx:1.18.0
- MySQL:8.0.27
- PHP:7.4.3
3. 准备工作
重要
为避免因使用管理员权限不当造成不可预期的风险,建议您使用普通用户操作。如果普通用户没有sudo权限,具体操作,请参见如何为普通用户添加sudo权限。
远程连接需要部署LNMP环境的ECS实例。
具体操作,请参见连接方式概述。
关闭系统内部防火墙。
运行以下命令,检查防火墙当前状态。
1
sudo ufw status
- 如果防火墙状态为Status: inactive,则表示防火墙为关闭状态。
- 如果防火墙状态为Status: active,则表示防火墙为开启状态。
可选:关闭防火墙。
如果您的防火墙为开启状态,需要运行以下命令,关闭防火墙并关闭开机自启动防火墙。
1
sudo ufw disable
说明:
如果您想重新开启防火墙并开启开机自启动防火墙,请运行
sudo ufw enable
命令。
4. 安装Nginx
运行以下命令,更新Ubuntu系统内的软件包。
1
sudo apt update
运行以下命令,安装Nginx。
1
sudo apt -y install nginx
运行以下命令,查看Nginx版本。
1
sudo nginx -v
返回结果如下所示,查看到Nginx的版本信息为1.18.0。同时也表示Nginx已成功安装。
1
nginx version: nginx/1.18.0 (Ubuntu)
Linux下Nginx无权访问文件问题
问题说明:
使用命令查看nginx启动用户与使用用户是否一致:
1
>ps aux | grep nginx
当前版本下nginx安装后默认配置文件
/etc/nginx/nginx.conf
中设置user: nginx
,表示nginx运行用户。我们正常思维都只是修改当前用户下的文件夹权限,所以会导致确定当前用户对文件夹权限的情况下,nginx无权访问问题。
解决办法:
/etc/nginx/nginx.conf
配置中修改user为当前用户(推荐)- 切换为nginx用户,并给予相应文件夹权限
卸载apache2
sudo apt-get remove apache2
这个命令会删除Apache2及其所有配置文件。如果您想保留配置文件,可以使用以下命令:
sudo apt-get purge apache2
这个命令不仅会删除Apache2,还会删除与其相关的所有配置文件。如果您想彻底删除Apache2,包括所有依赖项和配置文件,可以使用以下命令:
sudo apt-get autoremove apache2
这个命令会自动删除Apache2及其所有依赖项和配置文件。
除了以上方法,还可以使用以下命令来停止Apache2服务并从启动项中删除它:
sudo service apache2 stop
sudo systemctl disable apache2
这个命令将停止Apache2服务并从启动项中删除它,以确保Apache2不再在系统启动时自动运行。
5. 安装并配置MySQL
安装MySQL。
运行以下命令,安装MySQL。
1
sudo apt -y install mysql-server
运行以下命令,查看MySQL版本。
1
sudo mysql -V
返回结果如下所示,表示MySQL已成功安装,MySQL的版本为8.0.27。
1
mysql Ver 8.0.27-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu))
配置MySQL。
运行以下命令,进入MySQL。
1
sudo mysql
运行以下命令,设置root用户密码。
1
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by 'mynewpassword';
本示例中密码以
Mysql@1234
为例,示例命令:1
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by 'Mysql@1234';
运行以下命令,退出MySQL数据库。
1
exit;
运行以下命令,对MySQL进行安全性配置。
1
sudo mysql_secure_installation
根据命令行提示,依次完成以下配置项。
输入root用户的密码。本示例中输入
Mysql@1234
。1
2
3
4
5root@iZbp19jsi7s0g7m4zgc****:~# sudo mysql_secure_installation
Securing the MySQL server deployment.
Enter password for user root:说明
在输入密码时,系统为了最大限度地保证数据安全,命令行将不做任何回显。您只需要输入正确的密码信息,然后按Enter键即可。
输入Y,设置密码验证策略。
1
2
3
4
5
6VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?
Press y|Y for Yes, any other key for No: Y根据提示,选择密码验证策略。
本示例输入0。
1
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 0
输入Y,更改root用户密码。
1
Change the password for root ? ((Press y|Y for Yes, any other key for No) : Y
输入root用户密码。
1
2
3
4
5New password:
Re-enter new password:
Estimated strength of the password: 100输入Y,确认使用已设置的密码。
1
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y
输入Y删除MySQL自带的匿名用户。
1
2
3
4
5
6
7
8By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.
Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y输入Y,禁止MySQL的root用户的远程登录权限。
1
2
3
4
5Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y输入Y,移除test数据库。
1
2
3
4
5
6
7By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.
Remove test database and access to it? (Press y|Y for Yes, any other key for No) :输入Y,重新加载授权表。
1
2
3
4Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y当命令行回显All done!时,表示配置完成。
测试登录MySQL数据库。
运行以下命令,登录MySQL数据库。
1
sudo mysql -uroot -p
在命令行回显的Enter password:后输入已设置的数据库密码。
说明
在输入密码时,系统为了最大限度的保证数据安全,命令行将不做任何回显。您只需要输入正确的密码信息,然后按Enter键即可。
成功登录MySQL数据库后,命令行信息如下所示。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15root@iZbp19jsi7s0g7m4zgc****:~# sudo mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 8.0.29-0ubuntu0.20.04.3 (Ubuntu)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>运行以下命令,退出MySQL数据库。
1
exit;
6. 安装并配置PHP
安装PHP。
运行以下命令,安装PHP。
1
sudo apt -y install php-fpm
运行以下命令,查看PHP版本。
1
sudo php -v
返回结果如下所示,表示PHP已成功安装,可查看到PHP版本为7.4.3。
1
2
3
4PHP 8.1.2-1ubuntu2.14 (cli) (built: Aug 18 2023 11:41:11) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
with Zend OPcache v8.1.2-1ubuntu2.14, Copyright (c), by Zend Technologies
修改Nginx配置文件以支持PHP。
运行以下命令,打开Nginx默认的配置文件。
1
sudo vim /etc/nginx/sites-enabled/default
按i进入编辑模式,修改Nginx配置文件。
在
server{}
内,找到index
开头的配置行,在该行中添加index.php
。在
server{}
内找到location ~ \.php$ {}
,去除以下配置行的注释符号。1
2
3
4location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}
按Esc退出编辑模式,然后输入
:wq
并按Enter键,保存并退出文件。运行以下命令,重启Nginx服务。
1
sudo systemctl restart nginx.service
配置PHP。
运行以下命令,在Nginx网站根目录中,新建phpinfo.php文件。
1
sudo vim <网站根目录>/phpinfo.php
*<网站根目录>*为变量,可通过Nginx配置文件查看。本教程中Nginx配置文件为默认文件/etc/nginx/sites-enabled/default,您可以运行cat /etc/nginx/sites-enabled/default命令查看文件内容,其中如下图所示的
/var/www/html
部分即为网站根目录。因此,对应的运行命令为:
1
sudo vim /var/www/html/wordpress/phpinfo.php
按i进入编辑模式,添加以下配置信息。
phpinfo()
函数会展示PHP的所有配置信息。1
<?php echo phpinfo(); ?>
按Esc退出编辑模式,然后输入
:wq
并按Enter键,保存并退出文件。运行以下命令,启动PHP。
1
sudo systemctl start php8.1-fpm
7. 测试访问PHP配置信息页面
在本地Windows主机或其他具有公网访问能力的Windows主机中,打开浏览器。
在浏览器的地址栏输入
http://<ECS实例公网IP地址>/phpinfo.php
进行访问。访问结果如下图所示,成功查看到PHP配置信息页面,表示LNMP环境部署成功。
8. 后续步骤
成功搭建LNMP环境后,建议您删除phpinfo.php测试文件,消除数据泄露风险。
1 |
|
本教程中网站根目录为/var/www/html
,则需要运行以下命令删除测试文件。
1 |
|
若缺少mysql-php数据库:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
sudo apt install mysql-php
# 4. Hexo框架
官网:[Hexo](https://hexo.io/zh-cn/)
## 1. Hexo简介
Hexo是一个基于Node.js的简洁、快速的轻量级博客框架,支持Markdown,可以很方便地解析Markdown语言并渲染生成静态网页。此外,Hexo的用户相对较多,在搜索引擎上能搜索到很多支持文章及第三方插件,便于快速定位各种问题,想美化、拓展自己的网页也很容易。
Node.js:一种脚本语言,可以简单地理解为运行在服务器端的JavaScript,常用于web开发。
Markdown:一种轻量级标记语言。
## 2. 工作原理

了解整个博客架构的工作原理有助于理解下面各个步骤的意义。我们需要在本地安装Hexo程序,并在本地hexo目录内书写博客。书写的博客将会保存在source目录内,当我们输入 `hexo generate` 命令时,hexo将会把我们写的markdown文件渲染成静态文件(即网页文件);输入 `hexo deploy` 时,hexo会通过我们配置好的免密登录连接至服务器,并将生成的静态文件推送到服务器的Git仓库内。Git仓库内容的变更触发钩子文件,将仓库内的内容部署至网站根目录下。
同时,我们还需要配置好nginx服务和域名解析。当用户访问我们博客的域名时,域名将被重定向为服务器的ip地址,并通过nginx服务访问网站根目录里的静态文件。
Git:一个版本管理系统,可供开发者方便地管理不同版本的代码。
nginx:一个HTTP和反向代理web服务器,本文中我们用到反向代理功能,用户通过该功能以访问服务器内的资源。
## 3. 框架安装
### 1. 本地安装 Node.js
Linux(DEB/RPM-based):从 [NodeSource](https://github.com/nodesource/distributions) 安装。
For Mac / Linux 用户
如果在尝试安装 Hexo 的过程中出现 `EACCES` 权限错误,请遵循 [由 npmjs 发布的指导](https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally) 修复该问题。强烈建议 **不要** 使用 root、sudo 等方法覆盖权限
### 2. 本地安装 Hexo
所有必备的应用程序安装完成后,即可使用 npm 安装 Hexo。$ npm install -g hexo-cli
1 |
|
验证:
1 |
|
4. 部署配置-本地
1. Git
1 |
|
2. 修改配置
1 |
|
在文件末尾增加信息:
type:git
repo:git@服务器ip:git仓库目录
barnch:master
这样在执行部署命令时,hexo就会用git用户登录服务器,并将生成的网页文件push到服务器的git仓库中。
5. 部署配置-服务器
在云服务器的普通用户根目录下创建 git 仓库和 hexo 部署目录。
1
2
3
4
5
6
7#git仓库
mkdir -P repo;
cd repo;
git init --bare blog.git #创建一个名为blog的仓库,--bare参数为创建裸库
#hexo部署目录
mkdir -P www/hexo;配置钩子文件
1
2
3cd repo/blog.git/hooks
touch post-receive
vim post-receivepost-receive输入以下内容并保存,其中work-tree填写hexo的部署目录,git-dir填写Git仓库的目录。
1
git --work-tree=/home/snowed16/www/hexo --git-dir=/home/snowed16/repo/blog.git checkout -f
这里我们使用的是 post-receive
钩子,当Git收到push请求的时候就会调用这个钩子。这个钩子中添加的语句执行的操作为:删除hexo部署目录中原有的文件,然后将Git仓库中的内容clone至hexo部署目录下。这样我们在本地更新博客并且执行部署命令后,网页文件会被push至服务器的Git仓库内,钩子文件则会将Git仓库内的网页文件复制到hexo部署目录下,从而实现自动部署功能。
6. 部署验证
本地生成静态网页并推送至服务器端
1
2
3cd /home/snowed16/www/hexo #进入本地 hexo 初始化目录
hexo clean && hexo generate && hexo deploy
#在本地生成静态文件,通过钩子文件部署到服务器端 nginx 根目录,此时可在服务器端 hexo 部署目录看到推送的静态文件。配置服务器 nginx
1
sudo vim /etc/nginx/sites-enabled/default
修改根目录路径
浏览器输入域名,出现hexo欢迎页即部署成功。
7. 附录
1. 常用Hexo命令
1 |
|
更多命令可访问Hexo官网的帮助文档获取。
2. 错误排除
- hexo部署目录内无文件:检查hexo部署目录、git仓库目录、钩子文件的权限配置;检查本地博客的
public
目录内是否存在成功渲染的网页文件;重启实例 - 无法访问服务器ip地址:完成上一步骤的检查;检查nginx是否处于开启状态;检查
nginx.conf
配置文件 - 无法访问域名:完成上一步骤的检查;检查域名解析状态;确认ICP备案是否已经完成
8. 参考链接
5. WordPress框架
6. Action 自动部署
1. Hexo 远程仓库
在GitHub上新建一个仓库,仓库名 snowed,类型选择private。
在本地根目录下即 www/snowed文件夹下,初始化git,输入以下指令:
1 |
|
2. 使用 Action
新建.github/workflows/hexo_depoly.yml
文件,内容如下:
1 |
|
1. Deploy to Pages
ACCESS_TOKEN
:
依次点开头像 - settings - developer settings - Personal access tokens,新建一个tokens,Expiration选择no expiration,Select scopes全选,生成Github令牌并复制保存。
2. Deploy to ESC
SSH_DEPLOY_KEY
:服务器端生成 ssh 密钥对,将id_rsa.pub
内容复制到authorized_keys
, 将id_rsa
的内容设置为SSH_DEPLOY_KEY
. Action 无法保存文件,借由服务器生成的 ssh 密钥对进行免密访问。REMOTE_HOST
:服务器IP地址;REMOTE_USER
:登录用户(snowed16);TARGET
:Hexo 源码路径(/home/snowed16/www/snowed).
3. 参考链接
7*. jemalloc优化内存
本站托管在自购的CN2 GIA VPS服务器上,内存只有2G,偶尔会出现内存紧张而导致系统把Redis、Mysql等内存大户kill掉的情况。增加swap可以解决这个问题,但swap性能比内存差太多,因此想到使用jemalloc优化内存占用。
1. jemalloc介绍
jemalloc是facebook推出的内存分配器,目前在firefox、facebook服务器、android 5.0 等服务中大量使用。 jemalloc最大的优势是其强大的多核/多线程分配能力,在内存足够大时, CPU的核心数量越多,程序线程数越多,jemalloc的分配速度越快。根据测试数据,在高并发时性能优于Google推出的tcmalloc和Glibc的ptmalloc。
除了性能高,jemalloc还降低了内存碎片化,能更好的利用内存。
2. 使用jemalloc优化Mysql、PHP内存占用
Redis默认使用了jemalloc,redis-cli info memory
有如下输出:
1 |
|
Mariadb/mysql、PHP等则默认使用系统自带的ptmalloc,因此可以替换成jemalloc获得更好的内存使用率。
首先安装jemalloc:
1 |
|
安装完成后,CentOS系统在/usr/bin
目录下会有jemalloc.sh
文件。可以通过jemalloc.sh 后续命令
执行命令,例如jemalloc.sh node app.js
,从而用上jemalloc分配和管理内存。
对于Ubuntu/Debian系统,或者CentOS系统上以systemctl
启动的服务,需要通过如下方式用上jemalloc:
- 设置
LD_PRELOAD
环境变量:export LD_PRELOAD=libjemalloc.so路径:$LD_PRELOAD
,然后再运行命令/使用systemctl
重启服务。其中CentOS系统下libjemalloc.so的路径是/usr/lib64/libjemalloc.so.2
,Ubuntu/Debian的路径是/usr/lib/x86_64-linux-gnu/libjemalloc.so.2
。聪明如你,应该能想到把export语句放置到.bashrc文件中,以便后续都生效; - 设置系统全局使用,方法是新建
/etc/ld.so.preload
文件,把libjemalloc.so
路径写入文件,然后重启Mariadb、PHP-FPM等服务。
本站采取第二种方式,配置好/etc/ld.so.preload
后重启Mariadb、PHP-FPM,可通过下面的命令查看是否用上了jemalloc:
lsof -Pn -p $(pidof mariadbd) | grep jemalloc
,配置正确的话会有jemalloc.so的输出;cat /proc/$(pidof mariadbd)/smaps | grep jemalloc
,和上述命令有类似的输出。
查看PHP-FPM的方式同理。
3. 总结
本文简要介绍了使用jemalloc优化Mysql、PHP内存占用的方法和操作步骤,并给出查看进程是否用上jemalloc的命令,达到优化内存占用的目的。
通过上述配置,内存优化能有多少呢?说实话对于小内存服务器改进并不大,只是聊胜于无罢了。