1. 安装nginx

安装ngin需要相关的依赖库,我们先进行库的安装。

1.1 安装gcc gcc-c++

1
yum install -y gcc gcc-c++

1.2 安装PCRE库

1
2
3
4
5
6
7
8
9
10
11
12
13
cd /usr/local/

wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz

tar -xvf pcre-8.37.tar.gz

cd pcre-8.37

./configure

make && make install

pcre-config --version

 

1.3 安装 openssl 、zlib 、 gcc 依赖

1
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel

1.4 安装nginx

安装nginx一定要在local文件夹下

1
2
3
4
5
6
7
8
9
10
11
cd /usr/local/

wget http://nginx.org/download/nginx-1.17.9.tar.gz

tar -xvf nginx-1.17.9.tar.gz

cd nginx-1.17.9

./configure

make && make install

 

修改配置文件server 80 端口下的root项 为/home/www/website; tMb6l8.png 放在其他端口也可以的,比如我放的是8080端口,到后面新的域名备案了后我也会放在80端口。

2. 安装Git以及Node.js

2.1 安装Node.js

1
curl -sL https://rpm.nodesource.com/setup_10.x  bash -yum install -y nodejs

查看是否成功

1
2
3
node -v

npm -v

可以显示版本号即为成功

1
2
3
4
[root@VM_0_6_centos ~]# node -v
v10.20.1
[root@VM_0_6_centos ~]# npm -v
6.14.4

2.2 安装Git及配置仓库

安装git及新建git用户

1
2
3
4
5
6
7
yum install git

adduser git

chmod 740 /etc/sudoers

vi /etc/sudoers

 

在这个位置添加git ALL=(ALL) ALL vim指令执行之后按 i 进入输入模式 编辑完成之后按一下Esc 然后输入:wq即可退出。 tMbySf.png 执行以下指令更改文件夹权限

1
2
3
chmod 400 /etc/sudoers

sudo passwd git

切换git用户并且建立密钥(下面第一步su git就是在切换git用户,这一步很重要)

1
2
3
4
5
6
7
8
9
10
11
12
13
su git

cd ~ ::到达git账户的根目录

mkdir .ssh ::新建.ssh文件

cd .ssh ::进入.ssh文件

vim authorized_keys ::这里需要找到你的C:\Users\MEILINFENG\.ssh的id_rsa.pub文件复制粘贴过来

chmod 600 ~/.ssh/authorized_keys ::这里修改相关权限

chmod 700 ~/.ssh

 

创建git仓库

1
2
3
4
5
cd ~

git init --bare blog.git

vi ~/blog.git/hooks/post-receive

 

输入 git --work-tree=/home/www/website --git-dir=/home/git/blog.git checkout -f 保存退出

1
chmod +x ~/blog.git/hooks/post-receive

以上指令都需要在su git 之后执行 如果中途断开重新连接过,需要重新执行 su git指令 进入git账户。 新建/home/www/website文件夹 在root用户下执行,所限先su root切换为root账户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
su root

输入密码

cd /homem

kdir www

cd www

mkdir website

修改文件夹权限
chmod 777 /home/www/website

chmod 777 /home/www

 

在本地电脑输入

1
ssh -v git@服务器的公网的ip

返回如下则成功。 tMbgOg.png 修改本地配置文件。/config.yml

1
2
3
4
deploy:
type: git
repo: git@你的公网IP地址:/home/git/blog.git
branch: master

repo: git@这里改为服务器公网IP:/home/git/blog.git 写入启动脚本 在/etc/init.d/路径下添加脚本文件,名称为nginx,内容如下

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
#!/bin/bash
#Startup script for the nginx Web Server
#chkconfig: 2345 85 15
nginx=/usr/local/nginx/sbin/nginx
conf=/usr/local/nginx/conf/nginx.conf
case $1 in
start)
echo -n "Starting Nginx"
$nginx -c $conf
echo " done."
;;
stop)
echo -n "Stopping Nginx"
killall -9 nginx
echo " done."
;;
test)
$nginx -t -c $conf
echo "Success."
;;
reload)
echo -n "Reloading Nginx"
ps auxww grep nginx grep master awk '{print $2}' xargs kill -HUP
echo " done."
;;
restart)
$nginx -s reload
echo "reload done."
;;
*)
echo "Usage: $0 {startrestartreloadstoptestshow}"
;;
esac

 

然后执行

1
chmod +x nginx

控制指令(两步指令,旨在重启nginx,因为你修改了nginx文件,如果不修改,它会继续延用之前的nginx文件内容。)

1
2
3
cd /usr/local/nginx/sbin

./nginx -s reload

 

大家可以对比一下,

clipboard.png 想必现在小伙伴们电脑都已经升级到 Windows 10 了。不过,你是否发现,你的系统里默默躺着很多系统自带却你从来不用的应用程序呢。这些应用并不会占用多大的空间,有些只是一个启动链接,比如系统自带「迪士尼梦幻王国」游戏,默认不占用多少空间,在你点击后,就会自动下载整个600M的安装包进行安装。 另外,这些自带应用有些都是随系统自动启动的,多少总会占用一点系统资源。 德哥是个强迫症患者,看到这些平时用不着的应用在眼前晃来晃去,总想着除之而后快。

卸载 win10 自带应用的通常方法

卸载这些应用说容易也容易,说不容易也不容易。 最常见的方式,就是点开启动菜单,右键点击你需要卸载的应用,点击卸载即可。 但我们会发现,这些应用有些提供卸载按钮,有些则不提供卸载按钮。

  • 可以卸载应用(邮箱、地图、钱包、新闻、Xbox 等)

clipboard.png

  • 不可卸载应用(应用商店、消息、相机、人脉、闹钟、图片、sticky notes、获取帮助、混合现实门户等)

clipboard.png 当然,你也可以用控制面板的卸载模块进行卸载。 点击开始菜单,点击设置-应用,找到你要卸载的应用即可。 clipboard.png 上面的方法,也适用于自己下载安装的应用程序。

利用第三方应用管理程序进行卸载,比如 CleanMyPC

经常使用 Mac 的小伙伴知道,Mac 上有一款 CleanMyMac 的神器,可以帮你清理你无法清理干净的应用。有个好消息是,这货也出了一款 PC 上的兄弟软件:CleanMyPC。它可以帮你方便的干掉这些难缠的应用。另外,它还有个好处就是可以帮你发现一些 Windows 系统自己发现不了的应用。 clipboard.png 不过,CleanMyPC 是一款收费软件,价格还不菲,有些高级功能需要缴费才能使用。

通过 PowerShell 命令行模式来卸载应用

当我们既想省点钱,又想卸载系统那些不提供卸载按钮的自带应用该怎么办呢? 这时候,就要用到我们的 PowerShell 命令行模式了。 Windows 相比 Linux 和 MacOS,最欠缺的就是命令行模式的灵活性和可编程性太弱。powershell 的诞生,就仿佛给了 Windows 一把瑞士军刀。PowerShell 是一款基于对象的shell, 建立在.Net框架之上, 使命令行用户和脚本编写者可以利用 .NET Framework的强大功能,同时能深入到系统进程中,开展一系列自动化和批处理工作。 下面我们就采用 Windows 10 中 powershell 内置的 Get-AppxPackage 、 Remove-AppxPackage 和 Add-AppxPackage 命令来进行安装卸载操作。

Get-AppxPackage:用于获得 Win 10 系统内置应用信息。 Remove-AppxPackage:用于删除 Win 10 系统内置应用。 Add-AppxPackage:用于安装 Win 10 系统内置应用。

首先,以管理员身份打开PowerShell

如果你的系统是最新版 Windows 10,你只需要按住快捷键 Windows + X,或右键点击左下角的 win 图标,然后从高级用户菜单中选择“Windows PowerShell(管理员)”选项。 clipboard.png 若你的 win10 系统没有及时更新,也可能看到的不是 powershell,而是「命令行」。这样的话,你可以按快捷键 Windows + S,输入powershell,然后右键选择「以管理员身份运行」。 clipboard.png

获取 Win 10 系统内置应用信息

做任何事情,我们都应该做到有「备」无患。 应用信息备份有两种方式:

一是备份当前已装应用的详细信息

输入命令 Get-AppxPackage ,就可以查看当前用户所有已安装的应用。 clipboard.png 将已安装应用列表导出到一个文件,留作备份,可以帮助我们后续重新安装回所需的应用。 复制下面代码到 PowerShell,并输入回车即可:

1
Get-AppxPackage >> D:\AppxPackage.bak1.txt

>> 也可以换成 >,前者是内容追加到文档最后,后者是覆盖文档内容。看您需要合理选择即可。

二是只备份应用包的简称和全称

因为我们重装应用只需要用到应用名称和包全称,其他信息并不需要,所以,我们也可以只备份这两部分内容。 查看应用名称和包全称:

1
get-appxpackage  Select Name, PackageFullName

若要导出为备份,命令如下:

1
get-appxpackage  Select Name, PackageFullName >> D:\AppxPackage.bak2.txt
没有备份的补救措施

如果你没有备份就直接卸载了,又想不起该应用的包信息。我们也可以通过以下命令来找出系统自带所有安装包的信息:

1
get-appxpackage -allusers

如果你知道该包的大致简称,还可以加上该简称信息,如下:

1
get-appxpackage -allusers *windowscalculator*

你将得到「计算器」应用的所有信息。 clipboard.png

用 PowerShell 卸载应用

当你做好备份工作后,你现在就可以开始利用 powershell 进行愉快的卸载安装工作了。 Get-AppxPackage 命令可以帮助你卸载大多数内置的应用程序,甚至那些通常不提供“卸载”选项的应用。但是,请注意,这个技巧不允许你删除一些最重要的内置应用程序,比如 Cortana 和 Edge 浏览器。如果强行删除,只会看到一个报错信息。 下面,我们先尝试一下删除单个应用。

利用 Remove-AppxPackage PackageFullName 命令卸载

首先,我们用前文提到的 Get-AppxPackage Select Name, PackageFullName 命令获得的应用包全称。 比如你不大玩游戏,想删除 Xbox 应用,那么,就找到「Xbox」对应的应用包全称 clipboard.png 再在 PowerShell 输入下面的命令即可:

1
Remove-AppxPackage Microsoft.XboxApp_41.41.18005.0_x64__8wekyb3d8bbwe

打字累的话,PowerShell 支持 Ctrl + C 和 Ctrl + V

利用通配符(*)结合管道命令进行卸载

另外,还可以使用通配符(*)结合管道符来卸载应用,这样,我们只要输入前面的应用简称即可。

1
Get-AppxPackage *xboxapp*  Remove-AppxPackage

OK,就是这么轻松。 如果你想删除其他应用,只需要将 *xboxapp* 换成你想删除应用的名称即可。

有些应用是不能卸载的

Win10 中那些和系统结合紧密的应用是无法删除的,如果碰到无法删除的应用,则会出现错误提示,比如删除微软小娜「Cortana」:

1
Get-AppxPackage *cortana*  Remove-AppxPackage

将出现如下报错: clipboard.png

常用应用列表

下面我给一个常用应用的列表:

应用名称

对应代码

画图3D

3dbuilder

闹钟和时钟

windowsalarms

计算器

windowscalculator

日历和邮件

windowscommunicationsapps

摄像头

windowscamera

联系人

无法删除

Cortana

无法删除

我的office

officehub

入门

getstarted

Groove 音乐

zunemusic

地图

windowsmaps

Edge

无法删除

棋牌游戏

solitairecollection

记账

bingfinance

电影和电视

zunevideo

新闻

bingnews

OneNote

onenote

人脉

people

Phone Companion

windowsphone

照片

photos

应用商店

windowsstore

运动

bingsports

录音

soundrecorder

天气

bingweather

Feedback

无法删除

Xbox

xboxapp

用 powershell 批量卸载内置应用

是不是感觉一个个卸载应用太麻烦,其实,你完全可以利用通配符 * ,一条命令实现内置应用的批量卸载。 卸载「Xbox」相关的所有应用:

1
Get-AppxPackage *Xbox*  Remove-AppxPackage

卸载所有系统内置应用:

1
Get-AppxPackage *  Remove-AppxPackage

你将在一片红色警告和黄色提示后,重新得到一个干净清爽的系统。 当然,那些 Windows 死活都不愿意你卸载的应用还是没有办法的,因为去掉那些应用,你的系统可能就运行不正常了。

重新安装内置应用

重装单个应用

比如,我们不小心把系统自带的计算器给删除了,那该怎么安装回去呢? 很简单,我们先找到这个应用的包全名。 命令行下输入:

1
Get-AppxPackage -allusers *windowscalculator*

得到如下信息: clipboard.png 拷贝查到的 InstallLocation,黏贴到如下命令中:

1
Add-AppxPackage -register "C:\Program Files\WindowsApps\Microsoft.WindowsCalculator_10.1805.1201.0_x64__8wekyb3d8bbwe\appxmanifest.xml" -DisableDevelopmentMode

不同的包,替换命令中橘色背景部分的 InstallLocation内容即可。 clipboard.png 不用重启电脑,计算器应用又可以使用了。

重装所有内置应用

如果你有一天后悔了,想重装全部应用,又不想一个个复制包全称进行安装。办法也是有的,用管理员权限打开 PowerShell,复制黏贴如下命令并回车即可:

1
Get-AppxPackage -AllUsers Foreach {Add-AppxPackage -DisableDevelopmentMode -Register "$($_.InstallLocation)\AppXManifest.xml"}

这条命令会将 Windows 10 所有内置的默认应用都重新安装回来。如果看到错误提示,不必理会,重启系统即可。 现在,你的系统是不是已经按照你的要求定制了呢,如果还没有,赶快动手吧! Enjoy it!^_^

Win10系统自带的软件全都可以卸载。 方法如下: 一、借助第三方应用将其卸载 如腾讯旗下的电脑管家中的软件管理可以将其卸载,这也是最简单的一种方法,但是重新创建账号的时候,它又会自动的预装上这些软件。 二、利用WIN10系统中自带的软件POWERSHELL WINDOWS POWERSHELL是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用 .NET FRAMEWORK的强大功能。 在开始菜单中找到它,右键“以管理员身份运行”,这一点很重要。然后我们以卸载ONENOTE为例,利用快捷键CTRL+C和CTRL+V进行复制和粘贴命令 “GET-APPXPACKAGE *ONENOTE*  REMOVE-APPXPACKAGE”到POWERSHELL中,敲一下回车,等待它自行卸载,卸载过程中会弹出很多错误信息,实际已经卸载了,不用理会。 其他自带的应用的也用此方法可卸载。卸载后的软件可以在应用商店里重新下载。 扩展资料: 下面给出一些WINDOWS 10预装应用删除的命令: 卸载ONENOTE GET-APPXPACKAGE *ONENOTE*  REMOVE-APPXPACKAGE 卸载3D BUILDER GET-APPXPACKAGE *3D*  REMOVE-APPXPACKAGE 卸载邮件和日历 GET-APPXPACKAGE *COMMUNI*  REMOVE-APPXPACKAGE、 卸载新闻订阅 GET-APPXPACKAGE *BING*  REMOVE-APPXPACKAGE 卸载CAMERA相机 GET-APPXPACKAGE *CAMERA*  REMOVE-APPXPACKAGE 卸载地图 GET-APPXPACKAGE *MAP*  REMOVE-APPXPACKAGE 卸载GROOVE音乐、电影与电视 GET-APPXPACKAGE *ZUNE*  REMOVE-APPXPACKAGE 卸载人脉 GET-APPXPACKAGE *PEOPLE*  REMOVE-APPXPACKAGE 卸载手机助手 GET-APPXPACKAGE *PHONE*  REMOVE-APPXPACKAGE 卸载照片 GET-APPXPACKAGE *PHOTO*  REMOVE-APPXPACKAGE 卸载纸牌游戏 GET-APPXPACKAGE *SOLIT*  REMOVE-APPXPACKAGE 卸载录音机 GET-APPXPACKAGE *SOUNDREC*  REMOVE-APPXPACKAGE 卸载XBOX GET-APPXPACKAGE *XBOX*  REMOVE-APPXPACKAGE 卸载当前账户预装的所有应用 GET-APPXPACKAGE  REMOVE-APPXPACKAGE 卸载所有账户中的预装应用 GET-APPXPACKAGE -ALLUSERS  REMOVE-APPXPACKAGE 彻底卸载系统中的预装应用(创建新的账号中不再重新预装应用,慎用) GET-APPXPROVISIONEDPACKAGE -ONLINE  REMOVE-APPXPROVISIONEDPACKAGE–ONLINE 参考资料: 百度百科——Windows 10

NVIDIA的GeForce Experience(简称GFE)最新版在网上引起了轩然大波,一个游戏优化软件竟然也注册为服务,还在收集用户隐私数据并上传到服务器。这个遥测功能使得很多人不放心 如果你对这些辅助功能没什么需求,其实也可以完全不安装GFE软件,所以需要绿色版的驱动 先使用DDU将以前安装的驱动卸载干净,

卸载完成之后,在NVIDIA官网下载对应的显卡驱动,下载完成后右键解压一下,

然后用Cmd进入Display.Driver目录,看清楚是Cmd进入,并不是进那个文件夹,然后执行下面两行命令

For %1 in (*.dl_) do expand %1 %n1.dll & For %1 in (*.ex_) do expand %1 %n1.exe & For %1 in (*.sy_) do expand %1 %n1.sys & For %1 in (*.bi_) do expand %1 %n1.bin

del /f /s /q *.dl_ *.ex_ *.sy_ *.bi_

最后,进入设备管理器,选择你的显卡,点更新驱动程序,目录指向刚刚操作过的 Display.Driver 目录,点下一步即可,设备管理器将会自动完成驱动安装工作,如果已经是最新驱动,则会提示你已经安装。

  1. 初次接触Markdown,很多地方需要熟悉一下,转来这篇小教程,算是练练手,也为以后使用留个参考。Markdown

    Cmd Markdown 简明语法手册


    1. 斜体和粗体

    使用 * 或 ** 包裹文字表示斜体和粗体。 示例: 这是 *斜体*,这是 **粗体**。 表现: 这是 斜体,这是 粗体

    2. 分级标题

    使用 === 表示一级标题,使用 — 表示二级标题。 你也可以选择在行首加井号表示不同级别的标题 (H1-H6),例如:# H1, ## H2, ### H3,#### H4。 示例: 这是一个一级标题 ============================ 这是一个二级标题 ————————————————– ### 这是一个三级标题 表现:

    这是一个一级标题

    这是一个二级标题

    这是一个三级标题

    3. 外链接

    使用 [描述](链接地址) 的形式为文字增加外链接。 示例: 这是去往 [本人博客](https://www.offodd.com) 的链接。 表现: 这是去往 本人博客 的链接。

    4. 无序列表

    行首使用 * 或 + 或 - 开头表示无序列表。 行首使用 空格 缩进可添加二级列表 示例: * 无序列表项一 ﹏* 表项1(此行左侧有一个不可见的空格) + 无序列表项二 ﹏+ 表项2(此行左侧有一个不可见的空格) - 无序列表项三 ﹏- 表项3(此行左侧有一个不可见的空格) 表现:

    • 无序列表项一
      • 表项1(此行左侧有一个不可见的空格)
    • 无序列表项二
      • 表项2(此行左侧有一个不可见的空格)
    • 无序列表项三
      • 表项3(此行左侧有一个不可见的空格)

    5. 有序列表

    行首使用 数字和点 开头表示有序列表。 示例: 1. 有序列表项一 2. 有序列表项二 3. 有序列表项三 表现:

    1. 有序列表项一
    2. 有序列表项二
    3. 有序列表项三

    6. 文字引用

    行首使用 > 表示文字引用,使用多个 >> 可多级嵌套引用。 示例: > 离离原上草,一岁一枯荣。 >> 野火烧不尽,春风吹又生。 表现:

    离离原上草,一岁一枯荣。

    野火烧不尽,春风吹又生。

    7. 行内代码块

    使用 `代码` 表示行内代码。 示例: 让我们聊聊 `html`。 表现: 让我们聊聊 html

    8. 代码块

    行首使用 四个缩进空格 或 一个制表符(Tab) 开头表示代码块。 或在代码块前后一行使用 ``` 包裹代码块。 示例: ﹏﹏﹏﹏这是一个代码块    //此行左侧有四个不可见的空格。 ``` 这也是一个代码块 ``` 表现:

    1
    这是一个代码块    //此行左侧有四个不可见的空格。
    1
    这也是一个代码块

    9. 插入图像

    使用 ![描述](图片链接地址) 的形式插入图像。 示例: ![我的Logo](https://www.offodd.com/logo.png) 表现: 我的Logo

    10. 删除线

    使用 ~~ 表示删除线。 示例: 这是一段错误的文本。 表现: 这是一段错误的文本。

    11. 分割线

    分割线最常使用就是三个或三个以上的 - 或 * 示例: ——– ******** 表现:



    Cmd Markdown 高阶语法手册


    1. 注脚

    使用 [^keyword] 表示注脚,然后使用 [^keyword]: 表示注脚的解释。 示例: 这是一个注脚[^footnote]的样例。(注脚解释在页脚) 这是第二个注脚[^footnote2]的样例。(注脚解释在页脚) [^footnote]: 这是一个 *注脚* 的 **解释文本**。 [^footnote2]: 这是另一个 *注脚* 的 **解释文本**。 表现: 这是一个注脚1的样例。(注脚解释在页脚) 这是第二个注脚2的样例。(注脚解释在页脚)

    2. 表格支持

    用 表示表格纵向边界,表头和表体用 - 隔开;用 : 进行对齐设置,在左边则表示左对齐,在右边则表示右对齐,两边都有:则表示居中,若不加 : 则默认左对齐。

    • -—:为右对齐
    • :—-为左对齐
    • :—:为居中对齐
    • -—-为默认左对齐

    示例:

    1
    2
    3
    4
    5
    项目         价格     数量  
    -------- -----: :----:
    计算机 \$1600 5
    手机 \$12 12
    管线 \$1 234

    表现:

    项目

    价格

    数量

    计算机

    $1600

    5

    手机

    $12

    12

    管线

    $1

    234

    3. Html 标签

    支持在 Markdown 语法中嵌套 Html 标签,譬如,你可以用 Html 写一个纵跨两行的表格: 示例:

    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
    <table>
    <tr>
    <th rowspan="2">值班人员</th>
    <th>星期一</th>
    <th>星期二</th>
    <th>星期三</th>
    </tr>
    <tr>
    <td>李强</td>
    <td>张明</td>
    <td>王平</td>
    </tr>
    </table>
    <table>
    <tr>
    <th rowspan="2">值班人员</th>
    <th>星期一</th>
    <th>星期二</th>
    <th>星期三</th>
    </tr>
    <tr>
    <td>李强</td>
    <td>张明</td>
    <td>王平</td>
    </tr>
    </table>

    表现:

    值班人员

    星期一

    星期二

    星期三

    李强

    张明

    王平

    值班人员

    星期一

    星期二

    星期三

    李强

    张明

    王平

    本文参考

    作业部落:https://www.zybuluo.com/mdeditor Markdown的基本语法:https://www.jianshu.com/p/250e36bb5690


    1. 这是一个 注脚 的 解释文本。 
    2. 这是另一个 注脚 的 解释文本。 

ttyd 是一个简单的命令行工具,用于在 Web 上共享终端,简单点说就是可以实现在网页上使用SSH终端服务,并且该软件是免费开源的。

安装ttyd

ttyd作者已经提供编译好的二进制文件,直接下载即可使用,最新版下载地址为:https://github.com/tsl0922/ttyd/releases,这里以CentOS 7为例:

1
2
3
4
5
6
#下载ttyd
wget -O ttyd https://github.com/tsl0922/ttyd/releases/download/1.6.0/ttyd_linux.x86_64
#添加执行权限
chmod +x ttyd
#移动目录
mv ttyd /usr/sbin

通过上面的几个步骤,我们已经完成ttyd安装,输入命令ttyd -v可查看当前版本:

1
2
[root@hosta29d0ffef5 ~]# ttyd -v
ttyd version 1.6.0-c15cfb7

运行ttyd

输入命令ttyd bash运行ttyd,注意防火墙需要放行7681端口,然后浏览器访问http://IP:7681即可打开WEB终端,如下图。 不过ttyd并没有保持后台运行,访问7681也不需要任何密码验证,非常不安全,接下来我们为ttyd创建一个systemd服务并设置用户名、密码验证。 新建服务 创建一个ttyd.service文件:vi /etc/systemd/system/ttyd.service内容如下:

1
2
3
4
5
6
7
8
9
[Unit]
Description=ttyd
After=network.target

[Service]
ExecStart=/usr/sbin/ttyd -c xiaoz:xiaoz.me bash

[Install]
WantedBy=multi-user.target

创建完毕后输入命令:systemctl daemon-reload让daemon生效。 上面使用了-c参数,这个参数的含义是设置用户名、密码验证,格式为-c 用户名:密码,上方设置的用户名为xiaoz,密码为xiaoz.me,请自行修改为自己的用户名、密码。 服务创建后,我们可以使用systemd命令来进行管理了,命令如下:

1
2
3
4
5
6
7
8
#启动ttyd
systemctl start ttyd
#停止ttyd
systemctl stop ttyd
#重启ttyd
systemctl restart ttyd
#开机启动
systemctl enable ttyd

Nginx反向代理

如果您不喜欢通过IP + 端口的访问形式,也可以设置Nginx反向代理通过域名访问,配置如下: 如果是网站根目录

1
2
3
4
5
6
7
8
9
location / {
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://127.0.0.1:7681;
}

如果是网站二级目录

1
2
3
4
5
6
7
8
9
location ~ ^/ttyd(.*)$ {
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://127.0.0.1:7681/$1;
}

注意上面的ttyd可以修改为自己想要的路径。

ttyd参数说明

输入ttyd -h可以查看ttyd帮助,说明如下:

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
USAGE:
ttyd [options] <command> [<arguments...>]

VERSION:
1.6.0

OPTIONS:
-p, --port Port to listen (default: 7681, use `0` for random port)
-i, --interface Network interface to bind (eg: eth0), or UNIX domain socket path (eg: /var/run/ttyd.sock)
-c, --credential Credential for Basic Authentication (format: username:password)
-u, --uid User id to run with
-g, --gid Group id to run with
-s, --signal Signal to send to the command when exit it (default: 1, SIGHUP)
-a, --url-arg Allow client to send command line arguments in URL (eg: http://localhost:7681?arg=foo&arg=bar)
-R, --readonly Do not allow clients to write to the TTY
-t, --client-option Send option to client (format: key=value), repeat to add more options
-T, --terminal-type Terminal type to report, default: xterm-256color
-O, --check-origin Do not allow websocket connection from different origin
-m, --max-clients Maximum clients to support (default: 0, no limit)
-o, --once Accept only one client and exit on disconnection
-B, --browser Open terminal with the default system browser
-I, --index Custom index.html path
-b, --base-path Expected base path for requests coming from a reverse proxy (eg: /mounted/here)
-6, --ipv6 Enable IPv6 support
-S, --ssl Enable SSL
-C, --ssl-cert SSL certificate file path
-K, --ssl-key SSL key file path
-A, --ssl-ca SSL CA file path for client certificate verification
-d, --debug Set log level (default: 7)
-v, --version Print the version and exit
-h, --help Print this text and exit

Visit https://github.com/tsl0922/ttyd to get more information and report bugs.

总结

使用ttyd可以很方便快速的搭建一个WebSSH服务,但便利就意味着要承担更多的安全风险,虽然ttyd提供了基本的密码验证,但这种验证方式仍然不安全,使用ttyd的同时意味着你的服务器也多了一个入口,所以不建议用在生产环境,自己折腾倒是无所谓。

Dnsmasq提供DNS缓存和DHCP服务、Tftp服务功能。作为域名解析服务器(DNS),Dnsmasq可以通过缓存DNS请求来提高对访问过的网址的连接速度。作为DHCP服务器,Dnsmasq可以为局域网电脑提供内网ip地址和路由。DNS和DHCP两个功能可以同时或分别单独实现。Dnsmasq轻量且易配置,适用于个人用户或少于50台主机的网络。此外它还自带了一个PXE服务器。 Dnsmasq工作原理 当接受到一个DNS请求时,Dnsmasq首先会查找/etc/hosts这个文件,然后查找/etc/resolv.conf中定义的外部DNS。所以说Dnsmasq是一个很不错的外部DNS中继。 配置Dnsmasq为DNS缓存服务器,同时在/etc/hosts文件中加入本地内网解析,这样一来每当内网机器查询时就会优先查询hosts文件,这就等于将/etc/hosts共享给全内网机器使用,从而解决内网机器互相识别的问题。相比逐台机器编辑hosts文件或者添加Bind DNS记录,仅编辑一个hosts文件,这简直太容易了。

安装Dnsmasq

  • Ubuntu/Debian
1
$ apt-get install dnsmasq
1
$ yum install dnsmasq

配置Dnsmasq

Dnsmasq处理DNS设置与BIND等其他DNS服务有所不同。所有的配置都在一个文件中完成/etc/dnsmasq.conf。默认情况下dnsmasq.conf中只开启了最后include项,可以在/etc/dnsmasq.d中自己写任意名字的配置文件。

配置文件说明

Dnsmasq配置文件是/etc/dnsmasq.conf,下面对Dnsmasq中和DNS相关的配置项进行说明。

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
用指定的端口代替默认的DNS 53端口,如果设置为0,则完全禁止DNS功能,只使用dhcp服务
port=5353

以下两个参数告诉Dnsmasq过滤一些查询:1.哪些公共DNS没有回答 2.哪些root根域不可达。

从不转发格式错误的域名
#domain-needed

从不转发不在路由地址中的域名
#bogus-priv

resolv-file配置Dnsmasq额外的向流的DNS服务器,如果不开启就使用linux主机默认的/etc/resolv.conf里的nameserver,通过下面的选项指定其他文件。
resolv-file=/etc/dnsmasq.d/upstream_dns.conf

默认情况下Dnsmasq会发送查询到它的任何上游DNS服务器上,如果取消注释,则Dnsmasq则会严格按照/etc/resolv.conf中的DNS Server顺序进行查询。
#strict-order

以下两个参数控制是否通过/etc/resolv.conf确定上游服务器,是否检测/etc/resolv.conf的变化,则取消注释。

如果你不想Dnsmasq读取/etc/resolv.conf文件或者其他文件,获得它的servers
# If you don't want dnsmasq to read /etc/resolv.conf or any other
# file, getting its servers from this file instead (see below), then
# uncomment this.
#no-resolv

如果你不允许Dnsmasq通过轮询/etc/resolv.conf或者其他文件来获取配置的改变,则取消注释。
#no-poll

增加一个name server,一般用于内网域名
#server=/localnet/192.168.0.1

设置一个反向解析,所有192.168.3.0/24的地址都到10.1.2.3去解析
#server=/3.168.192.in-addr.arpa/10.1.2.3

增加一个本地域名,会在/etc/hosts中进行查询
#local=/localnet/

增加一个域名,强制解析到你指定的地址上
#address=/double-click.net/127.0.0.1

同上,还支持ipv6
#address=/www.thekelleys.org.uk/fe80::20d:60ff:fe36:f83

增加查询yahoo google和它们的子域名到vpn、search查找
# Add the IPs of all queries to yahoo.com, google.com, and their
# subdomains to the vpn and search ipsets:
#ipset=/yahoo.com/google.com/vpn,search

你还可以控制Dnsmasq和Server之间的查询从哪个网卡出去
# server=10.1.2.3@eth1

指定源地址携带10.1.2.3地址和192.168.1.1的55端口进行通讯
# and this sets the source (ie local) address used to talk to
# 10.1.2.3 to 192.168.1.1 port 55 (there must be a interface with that
# IP on the machine, obviously).
# server=10.1.2.3@192.168.1.1#55

改变Dnsmasq默认的uid和gid
#user=
#group=

如果你想Dnsmasq监听某个端口为dhcp、dns提供服务
#interface=

你还可以指定哪个端口你不想监听
#except-interface=

设置想监听的地址,如果你本机要使用写上127.0.0.1。
#listen-address=


如果你想在某个端口只提供dns服务,则可以进行配置禁止dhcp服务
#no-dhcp-interface=

# On systems which support it, dnsmasq binds the wildcard address,
# even when it is listening on only some interfaces. It then discards
# requests that it shouldn't reply to. This has the advantage of
# working even when interfaces come and go and change address. If you
# want dnsmasq to really bind only the interfaces it is listening on,
# uncomment this option. About the only time you may need this is when
# running another nameserver on the same machine.
#bind-interfaces

如果你不想使用/etc/hosts,则取消下面的注释
#no-hosts

如果你项读取其他类似/etc/hosts文件,则进行配置
addn-hosts=/etc/banner_add_hosts

自动的给hosts中的name增加一个域名
#expand-hosts

给dhcp服务赋予一个域名
#domain=thekelleys.org.uk

给dhcp的一个子域赋予一个不同的域名
#domain=wireless.thekelleys.org.uk,192.168.2.0/24

同上,不过子域是一个范围
#domain=reserved.thekelleys.org.uk,192.68.3.100,192.168.3.200

dhcp分发ip的范围,以及每个ip的租约时间
#dhcp-range=192.168.0.50,192.168.0.150,12h

同上,不过给出了掩码
#dhcp-range=192.168.0.50,192.168.0.150,255.255.255.0,12h

自动加载conf-dir目录下的配置文件
conf-dir=/etc/dnsmasq.d

设置dns缓存大小,默认为150条
cache-size=150

 

配置实例

配置上游服务器地址

resolv-file配置Dnsmasq额外的上游的DNS服务器,如果不开启就使用Linux主机默认的/etc/resolv.conf里的nameserver。

  • 通过下面的选项指定其他文件来管理上游的DNS服务器
1
2
3
$ vi /etc/dnsmasq.conf

resolv-file=/etc/resolv.dnsmasq.conf
  • 在指定文件中增加转发DNS的地址
1
2
3
4
$ vi /etc/resolv.dnsmasq.conf

nameserver 8.8.8.8
nameserver 8.8.4.4
本地启用Dnsmasq解析
1
2
3
$ vi /etc/resolv.conf

nameserver 127.0.0.1

 

添加解析记录
  • 使用系统默认hosts

编辑hosts文件,简单列举一下格式

1
2
3
4
5
$ vi /etc/hosts

127.0.0.1 localhost
192.168.101.107 web01.mike.com web01
192.168.101.107 web02.mike.com web02

 

hosts文件的强大之处还在于能够劫持解析,譬如mirror.centos.org是CentOS仓库所在,几乎是机器正常必访问一个域名,我将它解析成一个内网地址,搭建一个内网镜像站,不仅内网机器也可以及时得到安全更新,每月还可以节省很多流量。

  • 使用自定义hosts文件

修改配置,增加自定义hosts文件位置。

1
2
3
$ vi /etc/dnsmasq.conf

addn-hosts=/etc/dnsmasq.hosts

 

在/etc/dnsmasq.hosts文件中添加DNS记录

1
2
3
4
$ vi /etc/dnsmasq.hosts

192.168.101.107 web01.mike.com web01
192.168.101.107 web02.mike.com web02
  • 使用自定义conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ vi /etc/dnsmasq.d/address.conf

# 指定dnsmasq默认查询的上游服务器,此处以Google Public DNS为例。
server=8.8.8.8
server=8.8.4.4

# 把所有.cn的域名全部通过114.114.114.114这台国内DNS服务器来解析
server=/cn/114.114.114.114

# 给*.apple.com和taobao.com使用专用的DNS
server=/taobao.com/223.5.5.5
server=/.apple.com/223.5.5.5

# 把www.hi-linux.com解析到特定的IP
address=/www.hi-linux.com/192.168.101.107

在这里hi-linux.com相当于*.mike.com泛解析
address=/hi-linux.com/192.168.101.107

 

注:也可以直接添加到/etc/dnsmasq.conf中,不过/etc/dnsmasq.d/*.conf的优先级大于/etc/dnsmasq.conf。

修改iptables配置

  • 允许本机的53端口可对外访问
1
2
$ iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
$ iptables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
  • 转发DNS请求
1
2
3
4
5
6
7
8
9
10
# 开启流量转发功能
$ echo '1' > /proc/sys/net/ipv4/ip_forward
$ echo '1' > /proc/sys/net/ipv6/ip_forward # IPv6 用户选用

# 添加流量转发规则,将外部到53的端口的请求映射到Dnsmasq服务器的53端口
$ iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53
$ iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53

# 如果要限制只允许内网的请求,方法如下
$ iptables -t nat -A PREROUTING -i eth1 -p upd --dport 53 -j REDIRECT --to-port 53
  • 保存规则并重启
1
2
$ service iptables save
$ service iptables restart

 

测试Dnsmasq

  • 启动Dnsmasq
1
$ service dnsmasq start
  • 测试Dnsmasq

将其他机器的DNS换成dnsmasq所在的IP即可,就这么容易。

1
$ dig @192.168.101.104 www.hi-linux.com

一些Dnsmasq技巧

Dnsmasq性能优化

我们都知道Bind不配合数据库的情况下,经常需要重新载入并读取配置文件,这是造成性能低下的原因。根据这点教训,我们可以考虑不读取/etc/hosts文件。而是另外指定一个在共享内存里的文件,比如/dev/shm/dnsrecord.txt ,这样就不费劲了,又由于内存的非持久性,重启就消失,可以定期同步硬盘上的某个内容到内存文件中。 具体实现步骤

  • 配置dnsmasq
1
2
3
4
$ vim /etc/dnsmasq.conf

no-hosts
addn-hosts=/dev/shm/dnsrecord.txt
  • 解决同步问题
1
2
3
4
5
6
# 开机启动
$ echo "cat /etc/hosts > /dev/shm/dnsrecord.txt" >>/etc/rc.local

# 定时同步内容
$ crontab -e
*/10 * * * * cat /etc/hosts > /dev/shm/dnsrecord.txt

Dnsmasq选择最快的上游DNS服务器

经常会有这样的情景,Dnsmasq服务器配了一堆上游服务器,转发本地的dns请求,缺省是Dnsmasq事实上是只挑了一个上游dns服务器来查询并转发结果,这样如果选错服务器的话会导致DNS响应变慢。 解决方法

1
2
3
4
5
$ vi /etc/dnsmasq.conf

all-servers
server=8.8.8.8
server=219.141.136.10

 

all-servers表示对以下设置的所有server发起查询,选择回应最快的一条作为查询结果返回。 上面我们设置了两个dns server,8.8.8.8(谷歌dns)和219.141.136.10(移动的dns),会同时查询这两个服务器,询问dns地址谁返回快就采用谁的结果。

dnsmasq-china-list项目

dnsmasq-china-list项目维护了一张国内常用但是通过国外DNS会解析错误的网站域名的列表,保证List中的国内域名全部走国内DNS服务器解析。 项目地址: https://github.com/felixonmars/dnsmasq-china-list dnsmasq-china-list使用

  • 取消dnsmasq.conf里conf-dir=/etc/dnsmasq.d这一行的注释
  • 获取项目文件
1
$ git clone https://github.com/felixonmars/dnsmasq-china-list.git
  • 将accelerated-domains.china.conf, bogus-nxdomain.china.conf,google.china.conf(可选)放到/etc/dnsmasq.d/目录下(如目录不存在则建立一个)。
  • dnsmasq-update-china-list放到/usr/bin/,这是一个批量修改DNS服务器的工具(可选)。

参考文档

http://www.google.com http://purplegrape.blog.51cto.com/1330104/1083354 https://i-meto.com/archives/iptables_PREROUTING.html http://blog.itphp.org/archives/225

  overture开源项目:https://github.com/shawn1m/overture overture是一个DNS服务程序,RainDNS也是采用这款程序搭建的,最大的特点就是小巧、快速,支持Linux和Windows环境,且是开源项目放心安全,可以用来搭建企业DNS服务。 overture工作配置流程 overture工作配置流程

下载overture

前往Github下载: https://github.com/shawn1m/overture/releases 由于我的系统是Centos7 64位的,所以我下载了overture-linux-amd64.zip

释放overture

1
unzip -d /usr/local/overture overture-linux-amd64.zip

修改config.json

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
{
"BindAddress": ":53",
"PrimaryDNS": [
{
"Name": "RainDNS",
"Address": "119.28.28.28:53",
"Protocol": "udp",
"SOCKS5Address": "",
"Timeout": 6,
"EDNSClientSubnet": {
"Policy": "auto",
"ExternalIP": ""
}
}
],
"AlternativeDNS": [
{
"Name": "RainPOd",
"Address": "119.29.29.29:53",
"Protocol": "udp",
"SOCKS5Address": "",
"Timeout": 6,
"EDNSClientSubnet": {
"Policy": "auto",
"ExternalIP": ""
}
}
],
"OnlyPrimaryDNS": false,
"RedirectIPv6Record": false,
"IPNetworkFile": "./ip_network_sample",
"DomainFile": "./domain_sample",
"DomainBase64Decode": true,
"HostsFile": "./hosts_sample",
"MinimumTTL": 0,
"CacheSize" : 0,
"RejectQtype": [255]
}

【BindAddress】DNS端口,默认为53 【PrimaryDNS】主DNS 其他配置信息可以阅读overture的Github底部

修改防火墙

1
2
3
firewall-cmd --permanent --add-port=53/udp
firewall-cmd --permanent --add-port=53/tcp
firewall-cmd --reload

配置开机启动 vi /etc/systemd/system/overture.service

1
2
3
4
5
6
7
8
[Unit]
Description=overture
After=network.target
[Service]
ExecStart=/usr/local/overture/overture-linux-amd64 -c /usr/local/overture/config.json
Restart=on-abort
[Install]
WantedBy=multi-user.target

启动overture

1
2
systemctl enable overture
systemctl start overture

好了,DNS服务器已经搭建好了!   转载:https://www.iprain.cn/archives/79.html

最近发现博客的内存老是隔三差五地被“吃掉”了,登录到后台后偶尔会出卡顿的情况,一开始怀疑是Swap不够导致的,于是给VPS主机增加了几个G的Swap,观察了一段时间后发现再大的Swap也被慢慢地“吃掉”了! 很显然是PHP某些服务一直在占用着VPS的内存没有释放,导致物理内存耗尽后调用了Swap,显然Swap没有物理内存运行的效率高,于是就出现了进程卡死的情况了。考虑到挖站否现在用的Wordpress用的主题与插件过多,出现这样的情况也是正常。 LNMP架构中PHP是运行在FastCGI模式下,按照官方的说法,php-cgi会在每个请求结束的时候会回收脚本使用的全部内存,但是并不会释放给操作系统,而是继续持有以应对下一次PHP请求。而php-fpm是FastCGI进程管理器,用于控制php的内存和进程等。 Linux的php-fpm优化心得-php-fpm进程占用内存大和不释放内存 所以,解决的办法就是通过php-fpm优化总的进程数和单个进程占用的内存,从而解决php-fpm进程占用内存大和不释放内存的问题。更多的Linux服务器优化方法以及建站心得,还有:

  1. Linux Crontab命令定时任务基本语法与操作教程-VPS/服务器自动化
  2. 阿里云日本VPS主机速度性能评测-日本软银SoftBank\香港NTT线路
  3. DNS域名解析启用DNSSEC防止DNS劫持-Google Cloud DNS设置DNSSEC

**PS:2018年12月14日更新,**如果你的VPS主机的内存和性能不是很好的话,这时最好是启用缓存可以大大节省资源消耗:WordPress开启Nginx fastcgi_cache缓存加速方法-Nginx配置实例。 **PS:2019年9月29日更新,**由于Google主导开发的服务器优化神器ngx_pagespeed,集成了图片延迟加载、自适应webp、JS和CSS优化、图片优化等一整套优化工具:PageSpeed服务器优化神器-Nginx部署ngx_pagespeed模块和加速效果体验

一、分析判断php-fpm内存占用情况

如果你发现VPS主机出现了卡顿的情况,首先查看一下内存的占用情况,常用的命令就是Top、Glances、Free等,不了解这些命令的朋友可以先看看挖站否做的专题:Linux系统监控命令整理汇总-掌握CPU,内存,磁盘IO等找出性能瓶颈。 使用Glances命令,再按下m,就可以查看到当前VPS主机进程内存占用情况了,按照占用内存由多到少排序(或者使用Top命令,按下M,效果是一样的)。如下图(点击放大): php-fpm内存占用情况 这是一张重启后进程内存占用情况图,从前后对比中可以发现:随着开机时间的增长,php-fpm占用的内存越来越大,最终php-fpm耗尽了VPS所有物理内存。 php-fpm重启后内存 查看当前php-fpm总进程数,命令:ps -ylC php-fpm --sort:rss。其中RSS就是占用的内存情况。如下图: php-fpm进程总数 查看当前php-fpm进程的内存占用情况及启动时间,命令如下:

1
ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid'grep wwwsort -nrk5

从下图可以看出当前php-fpm所有进程平均每个进程占用了60-70MB的内存,启动时间,是当天的话就是3:12,否则会显示是X月X日。 php-fpm启动时间 查看当前php-fpm进程平均占用内存情况,一般来说一个php-fpm进程占用的内存为30-40MB,本次查询的结果是60MB,显然是多了。命令如下:

1
2
ps --no-headers -o "rss,cmd" -C php-fpm  awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'
结果61M

二、熟悉php-fpm配置文件说明

php-fpm.conf就是php-fpm的配置文件,路径一般在:/usr/local/php/etc,如下图: php-fpm配置路径 php-fpm.conf几个重要的参数说明如下:

1
2
3
4
5
6
7
8
pm = dynamic #指定进程管理方式,有3种可供选择:static、dynamic和ondemand。
pm.max_children = 16 #static模式下创建的子进程数或dynamic模式下同一时刻允许最大的php-fpm子进程数量。
pm.start_servers = 10 #动态方式下的起始php-fpm进程数量。
pm.min_spare_servers = 8 #动态方式下服务器空闲时最小php-fpm进程数量。
pm.max_spare_servers = 16 #动态方式下服务器空闲时最大php-fpm进程数量。
pm.max_requests = 2000 #php-fpm子进程能处理的最大请求数。
pm.process_idle_timeout = 10s
request_terminate_timeout = 120

pm三种进程管理模式说明如下:

pm = static,始终保持一个固定数量的子进程,这个数由pm.max_children定义,这种方式很不灵活,也通常不是默认的。 pm = dynamic,启动时会产生固定数量的子进程(由pm.start_servers控制)可以理解成最小子进程数,而最大子进程数则由pm.max_children去控制,子进程数会在最大和最小数范围中变化。闲置的子进程数还可以由另2个配置控制,分别是pm.min_spare_servers和pm.max_spare_servers。如果闲置的子进程超出了pm.max_spare_servers,则会被杀掉。小于pm.min_spare_servers则会启动进程(注意,pm.max_spare_servers应小于pm.max_children)。 pm = ondemand,这种模式和pm = dynamic相反,把内存放在第一位,每个闲置进程在持续闲置了pm.process_idle_timeout秒后就会被杀掉,如果服务器长时间没有请求,就只会有一个php-fpm主进程。弊端是遇到高峰期或者如果pm.process_idle_timeout的值太短的话,容易出现504 Gateway Time-out错误,因此pm = dynamic和pm = ondemand谁更适合视实际情况而定。

三、解决php-fpm进程占用内存大问题

3.1  调整管理模式

static管理模式适合比较大内存的服务器,而dynamic则适合小内存的服务器,你可以设置一个pm.min_spare_servers和pm.max_spare_servers合理范围,这样进程数会不断变动。ondemand模式则更加适合微小内存,例如512MB或者256MB内存,以及对可用性要求不高的环境。 php-fpm调整管理模式

3.2  减少php-fpm进程数

如果你的VPS主机的内存被占用耗尽,可以检查一下你的php-fpm进程数,按照php-fpm进程数=内存/2/30来计算,1GB内存适合的php-fpm进程数为10-20之间,具体还得根据你的PHP加载的附加组件有关系。 Linux的php-fpm加载情况

3.3  php-fpm配置示例

这里以1GB内存的VPS配置php-fpm为演示,实际操作来看设置数值还得根据服务器本身的性能、PHP等综合考虑。

1
2
3
4
5
pm = dynamic #dynamic和ondemand适合小内存。
pm.max_children = 15 #static模式下生效,dynamic不生效。
pm.start_servers = 8 #dynamic模式下开机的进程数量。
pm.min_spare_servers = 6 #dynamic模式下最小php-fpm进程数量。
pm.max_spare_servers = 15 #dynamic模式下最大php-fpm进程数量。

四、解决php-fpm进程不释放内存问题

上面通过减少php-fpm进程总数来达到减少php-fpm内存占用的问题,实际使用过程中发现php-fpm进程还存长期占用内存而不释放的问题。解决的方法就是减少pm.max_requests数。 php-fpm减少进程数 最大请求数max_requests,即当一个 PHP-CGI 进程处理的请求数累积到 max_requests 个后,自动重启该进程,这样达到了释放内存的目的了。以1GB内存的VPS主机设置为例(如果你设置的数值没有达到释放内存可以继续调低):

1
pm.max_requests = 500 

php-fpm释放内存 当php-fpm进程达到了pm.max_requests设定的数值后,就会重启该进程,从而释放内存。下图是我测试后的效果,可以看出php-fpm进程被强制结束并释放了内存。 php-fpm重启进程释放内存

五、总结

对于大内存以及对并发和可用性要求的话,建议使用static管理模式+最大的pm.max_children。如果是小内存的服务器,建议使用dynamic或者ondemand模式,同时降低pm.start_servers和pm.max_spare_servers进程数。 为什么我调整了参数没有达到应有的效果?根据wzfou.com的经验,php-fpm配置文件参数不能一概而论,必须要结合服务器自身的性能、WEB动态内容以及对可用性的要求来进行调整,内存长期占用最好是再检查一下是否有内存泄露。 **2019年10月9日更新,**如果你的php-fpm参数调整得过小,有可能出现502错误,解决办法:解决WordPress后台编辑保存菜单出现502错误

使用WordPress建站的过程中,对于优化Wordpress性能、加快网站访问速度这一环节走了不少的“弯路”。当网站出现访问缓慢、CPU内存耗尽的情形时,最开始想到的是升级服务器配置,后来发现有些无良的VPS商家背后限制资源严重,加钱升级真的很伤人。 最大的体会就是同样的配置,在不同的VPS商家那里跑同一个网站,在同样的流量情况下,居然一个顺畅而另一个卡顿,这个给我最大的感受就是在购买VPS之前一定要看看别人的评测,尤其是VPS主机性能评测这一块,一定要仔细对比,否则容易花不少冤枉钱。 后来给Wordpress做优化时,关注在页面缓存上,之前用过的缓存插件包括但不限于WordPress Super Cache、WP Fastest Cache、W3 Total Cache、cos-html-cache、Cachify……总得来说,安装了缓存插件后提速还是有效果的,但是也带来了不少的问题。 例如配置复杂、生成规则、插件冲突以及无法应对突发流量,也就是说使用缓存插件还是无法达到应对大流量冲击的情况。最后,在朋友的推荐下启用了Nginx fastcgi_cache缓存,直接使用Nginx为页面生成缓存,效率比使用PHP缓存插件要高得多,特别适合小配置的VPS上使用。 Wordpress开启Nginx fastcgi_cache缓存加速方法-Nginx配置实例 更多的关于Wordpress和服务器优化的经验文章,这里还有:

  1. Linux的php-fpm优化心得-php-fpm进程占用内存大和不释放内存问题
  2. WordPress添加支付宝,微信打赏按钮制作实例和Paypal.me打赏链接
  3. Linux Crontab命令定时任务基本语法与操作教程-VPS/服务器自动化

**PS:2018年12月19日更新,**WordPress自带的站内搜索不仅搜索慢而且还无法搜索更多的关键字,我们可以自建一个或者使用第三方的搜索嵌入WP:改进网站站内搜索-百度,Google自定义搜索和Elasticsearch自建搜索。 **PS:2019年9月29日更新,**由于Google主导开发的服务器优化神器ngx_pagespeed,集成了图片延迟加载、自适应webp、JS和CSS优化、图片优化等一整套优化工具:PageSpeed服务器优化神器-Nginx部署ngx_pagespeed模块和加速效果体验

一、安装Nginx ngx_cache_purge模块

网站:

  1. http://labs.frickle.com/files/

1.1  LNMP

如果你用的是LNMP一键安装包,编辑lnmp安装包目录下的 lnmp.conf 文件,在Nginx_Modules_Options=”  的单引号中加上 –add-module=/root/ngx_cache_purge-2.3 保存,升级一下nginx就安装上了,其他模块也参考这个就行。 ngx_cache_purge-2.3需要你从frickle.com官网中下载安装包并解压,目前最新版是2.3。 Nginx fastcgi_cache直接编译

1.2  Oneinstack

如果你用的是OneinStack面板,可以通过以下命令来编译ngx_cache_purge模块。

# nginx -V 2>&1 grep -o ngx_cache_purge 查看ngx_cache_purge是否安装,没有数据表示未安装
cd /root/oneinstack/src
wget http://labs.frickle.com/files/ngx\_cache\_purge-2.3.tar.gz
tar xzf ngx_cache_purge-2.3.tar.gz

#以下几个安装包都是Oneinstack自带的,不同的版本可能会不同,请根据情况调整
tar xzf nginx-1.14.0.tar.gz
tar xzf pcre-8.42.tar.gz
tar xzf openssl-1.0.2o.tar.gz
cd /root/oneinstack/src/nginx-1.14.0

nginx -V #查看nginx编译参数,最后加上–add-module=../ngx_cache_purge-2.3
./configure –prefix=/usr/local/nginx –user=www –group=www –with-http_stub_status_module –with-http_v2_module –with-http_ssl_module –with-http_gzip_static_module –with-http_realip_module –with-http_flv_module –with-http_mp4_module –with-openssl=../openssl-1.0.2o –with-pcre=../pcre-8.42 –with-pcre-jit –with-ld-opt=-ljemalloc –add-module=../ngx_cache_purge-2.3

make #编译
mv /usr/local/nginx/sbin/nginx{,_`date +%F`} #备份nginx
cp objs/nginx /usr/local/nginx/sbin
nginx -V 2>&1 grep -o ngx_cache_purge

显示ngx_cache_purge表示已经安装成功

使用Nginx -V查看编译参数添加add-module时,一定要根据你自己的Nginx的编译参数来操作,也就是说保留原来的Nginx参数再加上add-module。例如我的: Nginx fastcgi_cache查看编译参数 安装Nginx ngx_cache_purge模块成功。 Nginx fastcgi_cache安装成功

1.3  其它面板

如果你用的是其它的面板(专题:服务器控制面板榜单),例如WDCPBT宝塔面板等,请查阅官网的文档。 Nginx fastcgi_cache参考文档

二、Nginx开启fastcgi_cache缓存-配置实例

2.1  配置实例

下面我直接贴出wzfou.com的Nginx开启fastcgi_cache缓存配置实例,详细的说明如下:

#路径需要提前创建好
fastcgi_cache_path /tmp/nginx-cache levels=1:2 keys_zone=WORDPRESS:250m inactive=1d max_size=500m;
fastcgi_temp_path /tmp/nginx-cache/temp;
fastcgi_cache_key “$scheme$request_method$host$request_uri”;
fastcgi_cache_use_stale error timeout invalid_header http_500;
#忽略一切nocache申明,避免不缓存伪静态等
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

server {
listen 80;
listen 443 ssl http2;
…………………此部省略……………………

set $skip_cache 0;
#post访问不缓存
if ($request_method = POST) {
set $skip_cache 1;
}
#动态查询不缓存
if ($query_string != “”) {
set $skip_cache 1;
}
#后台等特定页面不缓存(其他需求请自行添加即可)
if ($request_uri ~* “/wp-admin//xmlrpc.phpwp-.*.php/feed//zhuye//wzfou.com//question//bbs//dongtai//haoyou//qun/index.phpsitemap(_index)?.xml”) {
set $skip_cache 1;
}
#对登录用户、评论过的用户不展示缓存
if ($http_cookie ~* “comment_authorwordpress_[a-f0-9]+wp-postpasswordpress_no_cachewordpress_logged_in”) {
set $skip_cache 1;
}
#这里请参考你网站之前的配置,特别是sock的路径,弄错了就502了!
location ~ [^/]\.php(/$) {
#fastcgi_pass remote_php_ip:9000;
fastcgi_pass unix:/dev/shm/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
add_header Strict-Transport-Security “max-age=63072000; includeSubdomains; preload”;
#新增的缓存规则
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
add_header X-Cache “$upstream_cache_status From $host”;
add_header Cache-Control max-age=0;
add_header Nginx-Cache “$upstream_cache_status”;
add_header Last-Modified $date_gmt;
add_header X-Frame-Options SAMEORIGIN; # 只允许本站用 frame 来嵌套
add_header X-Content-Type-Options nosniff; # 禁止嗅探文件类型
add_header X-XSS-Protection “1; mode=block”; # XSS 保护
etag on;
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 301 302 1d;
}

#缓存清理配置(可选)
location ~ /purge( /.*) { #为防止转义,请去掉{ /之间的空格
allow 127.0.0.1;
#此处填写你的服务器IP
allow 89.208.xxx.xxx;
deny all;
#请注意此处的WORDPRESS要与上面的keys_zone保持一致
fastcgi_cache_purge WORDPRESS “$scheme$request_method$host$1”;
}
…………………此部分省略……………………

}

2.2  有关说明

本地or内存?在fastcgi_cache_path和fastcgi_temp_path中,有人会建议将它设置为内存路径,例如:/dev/shm/nginx-cache levels=1:2 keys_zone=WORDPRESS:100m inactive=60m;,如果你的磁盘IO很慢的话建议采用此方式,毕竟内存的读写速度非常快。 Nginx fastcgi_cache本地缓存 add_header Cache-Control 如果是动态内容要实时更新的话,可以设置为0,否则可以设置时间大一些。 Nginx fastcgi_cache控制缓存

三、安装Nginx Helper插件-自动刷新缓存

通过上面的方法我们已经配置好了fastcgi_cache缓存,接下来我们就要解决当Wordpress有新评论、新文章时自动刷新Nginx缓存页面了。直接搜索Nginx Helper插件下载,然后是设置,首先是开启,清除方式选择本地文件。 Nginx fastcgi_cache开启插件 插件还提供了其它的一些设置,例如发表新文章、新评论时是否更新Nginx缓存。 Nginx fastcgi_cache更新文章缓存 由于插件作者定义的缓存路径是 /var/run/nginx-cache ,而我们可能会根据服务器实际情况来自定义缓存路径,这样一来缓存路径的不同就会导致插件无法找到缓存文件并删除! 解决办法是在 WordPress 根目录下的 wp-config.php 中新增如下代码即可:

//根据实际情况定义缓存的存放路径
define( ‘RT_WP_NGINX_HELPER_CACHE_PATH’,’/tmp/wpcache’);

如果你发现上述定义路径的代码不生效,你可以采用“自然”博主的建议:

一是修改插件,将插件中路径改成你自己的,二是使用软连接,/var/run/nginxcache 和/tmp/wpcache

三、Nginx fastcgi_cache效果预览

启用了Nginx fastcgi_cache后,我们就可以在浏览器Header 头部信息中看到已经命中了。 Nginx fastcgi_cache看到命中 对于已经设置了不缓存的页面,Nginx fastcgi_cache会直接显示BYPASS。 Nginx fastcgi_cache不缓存 另外,对于已经登录的用户还有发表过评论的用户,Nginx fastcgi_cache也会直接BYPASS。 Nginx fastcgi_cache评论用户不缓存 同时,我们服务器的缓存路径中也能看到Nginx fastcgi_cache生成的缓存文件。 Nginx fastcgi_cache生成的文件 如果你发现你的评论过的用户依然用的是缓存,那应该是WP没有记住cookie,把以下代码加入到functions.php 中即可。

add_action(‘set_comment_cookies’,’coffin_set_cookies’,10,3);
function coffin_set_cookies( $comment, $user, $cookies_consent){
$cookies_consent = true;
wp_set_comment_cookies($comment, $user, $cookies_consent);
}

四、总结

Nginx开启fastcgi_cache缓存对于加快网页响应速度以及节省服务器资源有着非常重要的意义,下图是alibabacloud.com的测试结果,可以看出来启用缓存后服务器的承载能力有了非常大的提升。 Nginx fastcgi_cache启用效果 wzfou.com挖站否在启用fastcgi_cache缓存时,发现在Nginx配置文件中添加了Cache-Control信息,但是总是不生效。HTTP头部信息会总会包含以下信息:

Cache-Control: no-store,no-cache,must-revalidate,post-check=0,pre-check=0 和 Pragma: no-cache,

经过排查,问题出在了LNMP和Oneinstack一键包中的session.cache_limiter的PHP.ini设置部分, 默认值是nocache,我们需要将它设置为none即可。 Nginx fastcgi_cache修改PHP配置

0%