子非鱼,安知鱼之乐

越过山丘,才发现无人等候。

当局者迷,旁观者清

一般人迫于实际生活的需要,都把利害认得太真,不能站在适当的距离之外去看人生世相,于是这丰富华严的世界,除了可效用于饮食男女的营求之外,便无其他意义。

子非鱼,安知鱼之乐

各个人都只能直接地了解他自己,都只能知道自己处某种境地,有某种知觉,生某种情感。至于知道旁人旁物处某种境地、有某种知觉、生某种情感时,则是凭自己的经验推测出来的。

坚守疲惫生活中的英雄梦想,愿所有的美好如期而至。

DeepSeek本地快捷部署

本地部署的优势:

  • 数据隐私保护:本地部署DeepSeek可以确保数据不会离开本地服务器,大大提高了数据的安全性,避免了数据泄露的风险。

  • 灵活定制:可以根据业务需求灵活调整模型的参数和功能,满足特定的业务场景需求。

  • 离线使用:无需依赖网络,随时随地都能调用AI能力,特别适合没有稳定网络连接的环境。

部署过程

一、安装Ollama

Ollama 是一个开源工具,旨在帮助你在本地轻松运行和部署大型语言模型。以下是安装 Ollama 的步骤:

  • 访问 Ollama 的官方网站的下载页面

  • 在下载页面选择适合你操作系统环境(Windows、Mac 或 Linux)的安装包。完成下载后,双击安装文件,按照提示一步步完成安装过程。
    对于大多数环境来说,最简便的方法是通过一个简单的命令完成安装:

curl -fsSL https://ollama.com/install.sh | sh
  • 最后,打开终端,输入以下命令来验证 Ollama 是否成功安装
ollama --version

这将显示当前安装的 Ollama 版本信息,如出现以下信息则安装顺利完成。

二、下载模型

  • 模型选择
    自己部署一般下载的模型有1.5B到70B的,可以对照自己的机器配置来进行相关模型的下载与安装

    模型大小 参数量 显存需求 (GPU) CPU 和内存需求 适用场景
    1.5B 15亿 2-4 GB 8 GB 内存 低端设备,轻量推理
    7B 70亿 8-12 GB 16 GB 内存 中端设备,通用推理
    8B 80亿 10-16 GB 16-32 GB 内存 中高端设备,高性能推理
    14B 140亿 16-24 GB 32 GB 内存 高端设备,高性能推理
    32B 320亿 32-48 GB 64 GB 内存 高端设备,专业推理
    70B 700亿 64 GB+ 128 GB 内存 顶级设备,大规模推理
    671B 6710亿 多 GPU (80 GB+) 256 GB+ 内存 超大规模推理,分布式计算
  • 模型下载

  1. 在终端使用ollmam run命令直接下载
    比如要下载1.5b的模型,使用命令:
ollama run deepseek-r1:1.5b

下载过程如图所示:

下载完成后,自动运行了模型,可以随便问一个问题试试:

自此模型简易的搭建就结束了

三、web ui搭建

这里为了方便,直接使用浏览器扩展,推荐 Page Assist 这个扩展,直接搜索安装即可
快捷链接: Edge浏览器扩展链接 Firefox浏览器扩展链接
扩展安装完成后点击浏览器栏的扩展图标,选择Page Assist

在右上角的设置里可以把页面语言改为中文


然后点击左上角的新聊天,就可以开始对话了,有下载了多个模型的,可以选择不同的模型

扩展支持网页搜索

我打开网络搜索问了一下今天是哪一天(写文章这里时是3月18号)
他能正常理解是3月18号

tcpdump抓取指定返回码的http网络包

tcpdump -i any -A -s 0 -n 'port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x48545450) and (tcp[((tcp[12:1] & 0xf0) >> 2)+4:4] = 0x2f312e31) and (tcp[((tcp[12:1] & 0xf0) >> 2)+8:4] = 0x20323030)'

前面的参数比较简单,就不再详细说明了,我们关注下后面被单引号包裹起来的那串长长的让人有点懵逼的过滤表达式:

port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x48545450) and (tcp[((tcp[12:1] & 0xf0) >> 2)+4:4] = 0x2f312e31) and (tcp[((tcp[12:1] & 0xf0) >> 2)+8:4] = 0x20323030)

其中and起到的作用是逻辑运算里面的与操作符,我们把这个表达式分成四个部分:

port 80
这个比较好理解,意思就是说抓取发往80端口和从80端口回来的包;

tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x48545450
这段等式的前半段比较复杂,等式左边表达的意思是tcp数据包开头的四个字节,等式右边其实是ascii字符编码,查阅下ascii字符编码表(在linux系统可以直接通过man ascii查阅ascii字符编码表),0x48545450其实就是HTTP
那么这个等式的意思就是:tcp数据段的头四个字节 = HTTP,也就是说,我们抓取的是HTTP包;

tcp[((tcp[12:1] & 0xf0) >> 2)+4:4] = 0x2f312e31
类似于前面的表达式,表达的意思是:tcp数据段的头四个字节之后出现的四个字节 = /1.1,即http的版本,上面解析出来的HTTP连起来就是HTTP/1.1

tcp[((tcp[12:1] & 0xf0) >> 2)+8:4] = 0x20323030
这段表达式的意思是:tcp数据段的头八个字节之后出现的四个字节 = ‘ 200’

那现在我们来总结下,前面那段垄长的表达式的意思其实比较简单:tcp数据段的前12个字节 = HTTP/1.1 200
这其实就是HTTP响应报文的起始行。

那么tcp[((tcp[12:1] & 0xf0) >> 2):4]这种表达式该怎么理解呢?
我们对这段表达式做一个拆分:
tcp[12:1]
tcp[12:1] & 0xf0
(tcp[12:1] & 0xf0) >> 2
((tcp[12:1] & 0xf0) >> 2):4
第一,tcp[12:1],参考tcp表达式的语法解释,tcp[x:y]表示的意思是:从tcp报文的第x字节(不包括第x字节)之后,读取y个字节,那么tcp[12:1]的意思就是说:读取tcp报文的第12个字节后的一个字节,也就是第13个字节,那么tcp报文的第13个字节是什么呢?来看下tcp报文的结构图:

上面的每一行是32位,也就是4个字节,第13个字节,也就是:4位头部长度 + 6位保留的前四位;

第二,tcp[12:1] & 0xf0, 其实就是把tcp报文的第13个字节读取出来,前四位也就是tcp头部里面的4位头部长度,后四位填充4个0,也就是左移了四位的tcp报文的头部长度,因为我们多读取了后面四位;

第三,(tcp[12:1] & 0xf0) >> 2,为什么要右移两位呢?如果我们要得到tcp报文头部的长度,应该要相应地右移四位对不对,因为前面我们多读了四位。但是,tcp报文头部里面的4位头部长度其实是tcp有多少个4字节。那么,如果我们要得到tcp报文到底有多少个字节的话,要再左移两位

所以,先右移四位去掉向后多读的四位,再左移两位从有多少个4字节换算成有多少个字节,总共就是右移两位。
也就是,(tcp[12:1] & 0xf0) >> 2 tcp头部有多少个字节

第四,((tcp[12:1] & 0xf0) >> 2):4,结合1里面的表达式来理解,意思比较清楚了,读取tcp头部之后的数据段的前四个字节!

那么,tcp数据段开头的四个字节是什么?我们来看下tcp/ip四层协议下的包结构:

在这里,我们记住一点就是,下层的协议数据是在上层的整个包体结构上加上自己的头部,类似于下面的等式关系:

tcp = http + tcp_header

ip = tcp + ip_header

ip = http + tcp_header + ip_header

如果最上层的应用层协议是http协议的话,那么参考http响应包报文:

前12个字节恰好就是HTTP的版本+状态码

下面是使用上面的tcpdump命令示例抓取到的测试机响应报文:

说了这么多,是不是觉得根据http的返回码来抓包还是有点复杂呢,要每次手撸那串表达式估计也是蛮蛋疼的。其实我们可以用shell脚本对tcpdump再进一步封装成httpdump,输入参数就是你想抓取的返回码:
比如这个脚本文件名叫dump.sh,执行
./dump.sh 200
脚本内容参考:

#!/bin/sh

#将输入的http返回码转换成ascii码
code=`echo 1 | hexdump -C | awk '{print234}' | grep -Ev "^"`

#抓包
sudo tcpdump -i any -A -s 0 -n "port 80 and (tcp[((tcp[12:1]&0xf0) >> 2):4] = 0x48545450) and (tcp[((tcp[12:1]&0xf0) >> 2)+4:4] = 0x2f312e31) and (tcp[((tcp[12:1]&0xf0) >> 2)+8:4] = 0x20code)"

使用Nginx阻止别人域名跳转到自己服务器上

在Nginx上设置禁止通过IP或者通过未设置的域名访问访问服务器,只能通过已绑定的域名访问,这样做是为了避免别人把未备案或者有被隔离风险的域名解析到自己的服务器IP而导致服务器被隔离,有以下解决方案:

Nginx的默认虚拟主机在用户通过IP访问,或者通过未设置的域名访问(比如有人把他自己的域名指向了你的IP)的时候生效

最关键的一点是,在server的设置里面添加这一行:

listen 80 defaultt_server;

后面的default_server参数表示这个是默认主机。

这个设置非常有用。
比如别人通过ip或者未知域名访问你的网站的时候,你希望禁止显示任何有效内容,可以给他返回500或者403之类.
就可以这样设置:

server {
  listen 80 defaultt_server;
  return 403;
}

也可以把这些流量收集起来,导入到自己的网站,只要做以下跳转设置就可以:

server {
  listen 80 default;
  rewrite ^(.*) https://jpeng.xyz$1 permanent;
}

按照如上设置后,确实不能通过IP访问服务器了,但是在应该用中出现当server_name后跟多个域名时,其中一个域名怎么都无法访问:

例如:

server {
  listen 80;
  server_name jpeng.xyz www.jpeng.xyz
}

没更改之前,通过server_name中的www.jpeng.xyzjpeng.xyz均可访问服务器,加入禁止IP访问的设置后,通过 www.jpeng.xyz 无法访问服务器了,jpeng.xyz可以访问

nginx -t检测配置文件会提示warning:

[warn]: conflicting server name “jpeng.xyz” on 0.0.0.0:80, ignored
the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
configuration file /usr/local/nginx/conf/nginx.conf test is successful

最后通过在listen 80 default;后再加server_name _;解决,形式如下:

#禁止IP访问
server {
  listen 80 default;
  server_name _;
  return 500;
}

或者

server {
  listen 80 dufault;
  server_name _;
  rewrite ^(.*) https://jpeng.xyz$1 permanent;
}

这样,通过www.jpeng.xyz就能访问服务器了。

Red Hat / CentOS:检查/列出正在运行的服务

有多种方式和工具可以在Fedora / RHEL / CentOS Linux系统下查找并列出所有正在运行的服务。

服务命令列表运行服务

CentOS / RHEL 6.x及更早版本(预系统)的语法如下:

service --status-all
service --status-all | more
service --status-all | grep ntpd
service --status-all | less

打印任何服务的状态

要打印apache(httpd)服务的状态:

service httpd status

列出所有已知服务(通过SysV配置)

chkconfig --list

列出服务及其开放端口

netstat -tulpn

打开/关闭服务

ntsysv
chkconfig service off
chkconfig service on
chkconfig httpd off
chkconfig ntpd on

ntsysv是用于配置运行级别服务的简单界面,也可以通过chkconfig进行配置。默认情况下,它配置当前的运行级别。只需键入ntsysv并选择您想要运行的服务。

有关systemd的RHEL / CentOS 7.x的注意事项

如果您使用的是基于systemd的发行版,例如Fedora Linux v22 / 23/24或RHEL / CentOS Linux 7.x +。尝试使用systemctl命令列出正在运行的服务的以下命令。它控制着systemd系统和服务管理器。

在CentOS / RHEL 7.x +上使用列出systemd服务

语法是:列出所有服务:示例输出:

systemctl
systemctl | more
systemctl | grep httpd
systemctl list-units --type service
systemctl list-units --type mount
systemctl list-unit-files


图01:列出CentOS / RHEL 7 systemd系统上安装的所有设备及其当前状态

要查看与特定服务(cgroup)关联的进程,可以使用systemd-cgtop命令。与top命令一样,systemd-cgtop基于其服务列出正在运行的进程:

systemd-cgtop

示例输出:

路径任务%CPU内存输入/秒输出/秒

/ 85 0.3 240.1M  -   - 
/system.slice/NetworkManager.service 2  -   -   -   - 
/system.slice/auditd.service 1  -   -   -   - 
/system.slice/crond.service 1  -   -   -   - 
/system.slice/dbus.service 1  -   -   -   - 
/system.slice/lvm2-lvmetad.service 1  -   -   -   - 
/system.slice/polkit.service 1  -   -   -   - 
/system.slice/postfix.service 3  -   -   -   - 
/system.slice/rsyslog.service 1  -   -   -   - 
/system.slice/sshd.service 1  -   -   -   - 
/system.slice/...tty.slice/getty@tty1.service 1  -   -   -   - 
/system.slice/systemd-journald.service 1  -   -   -   - 
/system.slice/systemd-logind.service 1  -   -   -   - 
/system.slice/systemd-udevd.service 1  -   -   -   - 
/system.slice/tuned.service 1  -   -   -   - 
/system.slice/wpa_supplicant.service 1  -   -   -   - 
/user.slice/user-0.slice/session-2.scope 1  -   -   -   - 
/user.slice/user-1000.slice/session-1.scope 4  -   -   -   - 

仅在CentOS / RHEL 7.x +使用中列出SysV服务(不包括本地systemd服务)

chkconfig --list

示例输出:

图02:在systemd上列出基于Sysv的服务

whois 查询结果中,域名的注册信息的含义

whois 查询结果中,有相应的中英文信息。
各项信息对应的中英文含义如下:

注册人信息:

域名信息 含义
Domain Name 域名
Name ServerDNS DNS 服务器
Registrant ID 注册人 ID
Registrant Name 注册人姓名
Registrant Organization 注册人单位
Registrant Address 注册人地址
Registrant City 注册人城市
Registrant Province/State 注册人省/州
Registrant Postal Code 注册人邮编
Registrant Country Code 注册人国家代码
Registrant Phone Number 注册人电话号码
Registrant Fax 注册人传真
Registrant Email 注册人电子邮箱

技术联系人信息:

域名信息 含义
Technical ID 技术联系人 ID
Technical Name 技术联系人姓名
Technical Organization 技术联系人单位
Technical Address 技术联系人地
Technical City 技术联系人城市
Technical Province/State 技术联系人省/州
Technical Postal Code 技术联系人邮编
Technical Country Code 技术联系人国家代码
Technical Phone Number 技术联系人电话号码
Technical Fax 技术联系人传真
Technical Email 技术联系人电子邮件

管理联系人信息:

域名信息 含义
Administrative ID 管理联系人 ID
Administrative Name 管理联系人姓名
Administrative Organization 管理联系人单位
Administrative Address 管理联系人地址
Administrative City 管理联系人城市
Administrative Province/State 管理联系人省/州
Administrative Postal Code 管理联系人邮编
Administrative Country Code 管理联系人国家代码
Administrative Phone Number 管理联系人电话号码
Administrative Fax 管理联系人传真
Administrative Email 管理联系人电子邮箱

付费联系人信息:

域名信息 含义
Billing ID 付费联系人 ID
Billing Name 付费联系人
Billing Organization 付费联系人单位
Billing Address 付费联系人地址
Billing City 付费联系人城市
Billing Province/Stat 付费联系人省/州
Billing Postal Code 付费联系人邮编
Billing Country Code 付费联系人国家

Linux平台安装图形界面

注意:
图形化桌面可能会显著降低服务器的性能,如果安装不当,可能会导致操作系统无法正常启动。在安装之前,建议先对创建手工快照备份,以备发生异常时能回滚恢复。

centos 7安装图形化界面:
以安装 MATE 桌面环境为例。
1、远程ssh到 cvm

2、执行yum groups install "MATE Desktop"安装 MATE Desktop。

3、执行 systemctl set-default graphical.target设置默认通过桌面环境启动实例。

4、执行reboot重启 CVM实例。

5、可以通过 CVM页面管理控制台 以vnc 连接实例,测试验证安装情况。

Ubuntu 16 实例安装图形化桌面
以安装 GNOME 桌面环境为例。
通过 CVM 管理控制台 登录实例,运行如下命令安装桌面环境软件包。

apt-get install x-window-system-core 
apt-get install gnome-core 
apt-get install gdm 

运行 startx 启动图形化桌面。

常见问题:
CentOS 安装图形化桌面后无法使用键盘和鼠标

现象:桌面环境安装好后,通过 CVM 管理控制台 管理终端 连接实例,发现无法使用鼠标和键盘。

分析:该问题可能是由于键盘和鼠标驱动异常所致

解决:尝试将驱动修改为 evdev。

执行 yum install xorg-x11-drv-evdev安装 evdev

执行 Xorg -configure创建 /etc/X11/xorg.conf 配置文件。

执行cp xorg.conf.new /etc/X11/xorg.conf复制 X11 配置文件。

修改配置文件 /etc/X11/xorg.conf 的鼠标和键盘驱动为 evdev,如下图所示:

Section "InputDevice" 
Identifier "Keyboard0" 
Driver "evdev" #修改为 evdv 
Option "Device" "/dev/input/event3" 
EndSection 
Section "InputDevice" 
Identifier "Mouse0" 
Driver "evdev" #修改为 evdv 
Option "Device" "/dev/input/event5" 
Option "Mode" "Absolute" 
EndSection 
Comparison

重启实例,测试验证鼠标和键盘使用情况。

CentOS 系统默认关闭 messagebus 无法使用 Gnome
现象:按照正常流程为 CentOS 实例安装 Gnome 桌面环境后,发现无法重启登录系统。输入账户,密码后,系统提示如下:

"You are currently trying to run as the root super user. The super user is a specialized account that is not designed to run a normal user session. Various programs will not function properly, and actions performed under this account can cause unrecoverable damage to the operating system."

分析:可能是桌面环境的 messgebus 和 haldaemon 服务没有自动启动所致。为了提高系统性能和稳定性,默认情况下,云服务器CVM Linux 官方公共镜像未自动启动 messgebus 和 haldaemon 服务。

解决:可以尝试如下方式解决问题:

通过历史快照 回滚 系统。

重新安装桌面环境。

运行以下命令,修改 messgebus 和 haldaemon 服务为自启动。

chkconfig --level 35 haldaemon on 
chkconfig --level 35 messagebus on 

注意:
建议将启动级别修改为 Level 3,然后通过 startx 命令启动桌面环境,测试桌面环境的可用性。当出现问题时,还可以切换到终端模式进行问题排查和处理。最后,在确保桌面环境启动无误后,再将启动级别修改为 Level 5。

SSH连接失败的相关排错

先用ping命令排查是否能够Ping通

使用ssh -v命令

用ssh -v去连有问题的服务器,会有比较详细的调试信息在屏幕上输出,可以帮助判断是哪一步出了问题。

主要是看是客户端还是服务器的问题。如果是客户端的问题,应该log中有写。如果是没有什么有用信息,就可能是服务器端出问题了。

[root@jpeng ~]# ssh -v root@123.207.4.225
OpenSSH_6.6.1, OpenSSL 1.0.1e-fips 11 Feb 2013
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 56: Applying options for *
debug1: Connecting to 10.1.101.35 [10.1.101.35] port 22.
debug1: Connection established.
debug1: permanently_set_uid: 0/0
debug1: identity file /root/.ssh/id_rsa type -1
debug1: identity file /root/.ssh/id_rsa-cert type -1
debug1: identity file /root/.ssh/id_dsa type -1
debug1: identity file /root/.ssh/id_dsa-cert type -1
debug1: identity file /root/.ssh/id_ecdsa type -1
debug1: identity file /root/.ssh/id_ecdsa-cert type -1
debug1: identity file /root/.ssh/id_ed25519 type -1
debug1: identity file /root/.ssh/id_ed25519-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.6.1
ssh_exchange_identification: read: Connection reset by peer

现在看起来是服务器出问题了,虽然不能ssh到服务器,但可以通过售后工具里VNC进去。

排错思路1:

检查 /etc/hosts.deny 里面是否有 SSHD: 开头的行,有此行表示SSH的客户端IP进入了黑名单,将其注释;
再检查/etc/hosts.allow 里面是否也有 SSHD:开头的行,如果是/etc/hosts.deny没有 SSHD相关内容而/etc/hosts.allow里有SSHD相关内容,这就成了白名单,只有在这个文件里面的IP才能通过SSH连接,也可以先注释

排错思路2:

检查/etc/ssh 目录下相关文件的权限
有碰到过很多例是这种情况,客户的SSHD服务相关key文件权限被修改,导致SSHD服务启动异常。
先执行 ls -l /etc/ssh/*key 查看一下相关文件权限是否有问题

这里我是自己改成了777
执行systemctl restart sshd查看能否正常,即使服务重启没有失败,ssh客户端现在也是无法连接的
再执行systemctl ststus sshd -l查看一下服务状态

输出内容中也明显提到了不能载入文件,提示权限错误。
一般来讲,这些相关文件不需要执行权限,而且也只有root用户可以访问,因此正常重新赋予这些文件 600 或者 640 权限即可。
然后再重启一下服务

chmod 640 /etc/ssh/*key 
systemctl restart sshd 
systemctl status sshd -l

如何导出Windows系统日志

windows的系统日志可以帮助我们判断电脑的一些故障,怎么将windows系统日志记录保存到一个文件中呢,具体如下

第一步:

打开管理工具里的事件查看器

第二步:

点击Windows日志里的任意一个子项目

可以点击右边筛选当前日志功能,筛选出你只看的内容

第三步:

可以按照事件级别,任务类型,关键字等进行筛选,比如我这里选择错误和警告。

如图是筛选后的日志内容。

第四步:

右键点击所在子项目,选择“将已筛选的日志另存为”

然后选择导出的日志存放的位置,以及文件名

然后选择语言,最好选择和当前导出日志的服务器环境一样的语言

现在日志就已经导出了,包含主文件和一个文件夹,可以把他们下载到其他Windows系统的计算机查看

直接鼠标双击就可以打开

使用Nginx反向代理Apache下的WordPress,并开启全站HTTPS访问

曾经搞过很多次wordpress站点,想着要写点技术类东西,可临了就搁在手边忘记了。
因为工作需求,也因为自己喜爱折腾,把这次的折腾过程简要记录一下。

正片开始!

首先,配置环境,我的服务器环境是LNAMP编译安装环境,具体的配置过程这里就不详细说了,因为篇幅太大。
可以参考这个链接: CentOS 7.3 LNAMP 安装文档
其他要准备的还有:
一个和博客绑定的域名,以及与该域名的SSL证书。
并设置好相应的解析记录。


由于本篇实验所涉及的Nginx、Apache等环境都是编译安装的,如果你的环境是从软件仓库安装的,那么一些命令或者配置语法会有一些差异。

大体的配置思路:

我的配置过程是:
在Nginx下配置到Apache的反向代理,以及在Nginx下配置站点的SSL。
接着在Apache下配置一个Vhost,用来放WP。
然后还需要修改WP的配置文件,以及在数据库更新相关的表记录。

我们先假定已经编译安装并已经基本配置好了Nginx、Apache、MySQL、PHP的环境。

1.关于Nginx的配置

记得先把申请的证书上传到服务器,Nginx需要crt证书文件和key私钥文件。
在配置文件中需要写到这两个文件的绝对路径。
由于刚开始还没配置WP的HTTPS访问,所以还是需要先使用HTTP方式访问,这里把HTTP配置和HTTPS配置一起写上。

# 以下部分是HTTP的配置
   server {
        listen 80;
        server_name app.jpeng.xyz;
        access_log off;
        error_log off;
         # 由于是实验&&测试,个人习惯关闭访问日志和错误日志
        location / {
          proxy_pass http://127.0.0.1:8083;
           # 这里的8083指的是后端Apache的Vhost的端口
          proxy_set_header X-real-IP remote_addr;
          proxy_set_header Host  app.jpeng.xyz;
           # 这里注意要写你的真实绑定域名,不要写host,否则待会儿修改HTTPS配置后会出现重定向循环问题
          proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for;
          proxy_set_header X-From-IPremote_addr;
                }
        location /.php{
          proxy_pass http://127.0.0.1:8083;
                }
        }
# 以下部分是HTTPS的配置
    server {
        listen 443 ssl;
        server_name app.jpeng.xyz;
        charset utf-8;
        ssl_session_cache  shared:SSL:1m;
        ssl_session_timeout  5m;
        access_log off;
        error_log off;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        ssl_certificate      /usr/local/nginx/conf/cert/1_app.abcba.club_bundle.crt;
         # 这里是证书文件的存放位置,注意写绝对路径
        ssl_certificate_key  /usr/local/nginx/conf/cert/2_app.jpeng.xyz.key;
         # 这里是证书私钥文件的存放位置,注意写绝对路径
        location / {
          proxy_pass http://127.0.0.1:8083;
          proxy_set_header X-real-IPremote_addr;
          proxy_set_header Host  app.jpeng.xyz;
           # 这里注意要写你的真实绑定域名,不要写host,否则待会儿修改HTTPS配置后会出现重定向循环问题
          proxy_set_header X-Forwarded-Forproxy_add_x_forwarded_for;
          proxy_set_header X-From-IP remote_addr;
        }
        location /.php {
          proxy_pass http://127.0.0.1:8083;
                }
        }

2.Apche Vhost配置

Listen 127.0.0.1:8083
<VirtualHost 127.0.0.1:8083>
    ServerAdmin root@jpeng.xyz
    DocumentRoot "/usr/local/apache/htdocs/jpeng.xyz/app"
    ServerName app.jpeng.xyz
</VirtualHost>

这里写的只是简单的Vhost配置,其实还可以加上别名,访问日志,错误日志等配置,由于是实验,就不写这么多了。

3、WordPress 的安装与配置。

上面的Vhost中写了,站点的目录在 /usr/local/apache/htdocs/jpeng.xyz/app
先cd到这个目录
下载WordPress安装包并解压,把文件移动到当前目录。

wget https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
tar zxf wordpress-4.9.4-zh_CN.tar.gz .
mv wordpress/* .

更改所有者权限

chown -R apache.apache .

现在,进入mysql,创建WP的数据库,并单独创建一个只对这个数据库有完全访问权限的mysql用户。

CREATE DATABASE wp_app_abcba DEFAULT CHARACTER SET utf8;
grant all on wp_app_abcba.* to wjpcom@localhost identified by 'qqcctv123';
flush privileges;

接着编辑wp-config.php(WP的主配置文件)

cp wp-config-sample.php wp-config.php
vim wp-config.php

修改以下内容:(从第23行开始)
‘DB_NAME’就是刚才我们在mysql创建的数据库名;
‘DB_USER’就是刚才我们在mysql建立的用户名;
‘DB_PASSWD’就是刚才我们在mysql建立用户时定义的密码;

/** WordPress数据库的名称 */
define('DB_NAME', 'wp_app_abcba');

/** MySQL数据库用户名 */
define('DB_USER', 'wjpcom');

/** MySQL数据库密码 */
define('DB_PASSWORD', 'qqcctv123');

并手动添加一行内容:

$_SERVER['HTTPS'] = 'on';

接下来就是打开浏览器,输入域名,开始WP的安装。
WP的网页安装过程很简单,这里略过。

现在再次进入到mysql里面,执行数据库一些表记录的更新操作。
USE wp_app_abcba;
UPDATE wp_posts SET post_content = replace( post_content, 'http://app.jpeng.xyz','https://app.jpeng.xyz');
UPDATE wp_comments SET comment_content = replace( comment_content, 'http://app.jpeng.xyz','https://app.jpeng.xyz');
UPDATE wp_comments SET comment_author_url = replace( comment_author_url, 'http://app.jpeng.xyz','https://app.jpeng.xyz');
UPDATE wp_options SET option_value = replace( option_value,'http://app.jpeng.xyz','https://app.jpeng.xyz');
注意:mysql语句是以分号结尾。
sql执行语句中的http://app.jpeng.xyz 指的是老域名,而https://app.jpeng.xyz 指的是你的新域名,
在操作时记得更改为你自己的域名。
大功告成,其实这时候已经可以支持HTTPS了,不信你在浏览器的地址栏前面加上https:// 然后再回车试一下。

看看Chrome的小绿锁:

如果是像我一样的强迫症患者,这时候可以在Nginx里把HTTP的配置做一下改变。

在HTTP配置 server 标签内加入一个 location 标签

 location / {
   rewrite ^/(.*)https://app.jpeng.xyz/1 permanent;
      }

大功告成

curl 命令使用小结

curl命令是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称curl为下载工具。作为一款强力工具,curl支持包括HTTP、HTTPS、ftp等众多协议,还支持POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。做网页处理流程和数据检索自动化,curl可以助一臂之力。

curl命令可以用来执行下载、发送各种HTTP请求,指定HTTP头部等操作。如果系统没有curl可以使用yum install curlapt install curl安装。

语法
curl(选项)(参数)
选项参考

-a/--append 上传文件时,附加到目标文件
-A/--user-agent <string>    设置用户代理发送给服务器
-anyauth    可以使用“任何”身份验证方法
-b/--cookie <name=string/file>  cookie字符串或文件读取位置
     --basic    使用HTTP基本验证
-B/--use-ascii  使用ASCII /文本传输
-c/--cookie-jar <file>  操作结束后把cookie写入到这个文件中
-C/--continue-at <offset>   断点续转
-d/--data <data>    HTTP POST方式传送数据
     --data-ascii <data>    以ascii的方式post数据
     --data-binary <data>   以二进制的方式post数据
     --negotiate    使用HTTP身份验证
     --digest   使用数字身份验证
     --disable-eprt 禁止使用EPRT或LPRT
     --disable-epsv 禁止使用EPSV
-D/--dump-header <file> 把header信息写入到该文件中
     --egd-file <file>  为随机数据(SSL)设置EGD socket路径
     --tcp-nodelay  使用TCP_NODELAY选项
-e/--referer    来源网址
-E/--cert <cert[:passwd]>   客户端证书文件和密码 (SSL)
     --cert-type <type> 证书文件类型 (DER/PEM/ENG) (SSL)
     --key <key>    私钥文件名 (SSL)
     --key-type <type>  私钥文件类型 (DER/PEM/ENG) (SSL)
     --pass <pass>  私钥密码 (SSL)
     --engine <eng> 加密引擎使用 (SSL). "--engine list" for list
     --cacert <file>    CA证书 (SSL)
     --capath <directory>   CA目录 (made using c_rehash) to verify peer against (SSL)
     --ciphers <list>   SSL密码
     --compressed   要求返回是压缩的形势 (using deflate or gzip)
     --connect-timeout <seconds>    设置最大请求时间
     --create-dirs  建立本地目录的目录层次结构
     --crlf 上传是把LF转变成CRLF
-f/--fail   连接失败时不显示http错误
     --ftp-create-dirs  如果远程目录不存在,创建远程目录
     --ftp-method [multicwd/nocwd/singlecwd]    控制CWD的使用
     --ftp-pasv 使用 PASV/EPSV 代替端口
     --ftp-skip-pasv-ip 使用PASV的时候,忽略该IP地址
     --ftp-ssl  尝试用 SSL/TLS 来进行ftp数据传输
     --ftp-ssl-reqd 要求用 SSL/TLS 来进行ftp数据传输
-F/--form <name=content>    模拟http表单提交数据
     --form-string <name=string>    模拟http表单提交数据
-g/--globoff    禁用网址序列和范围使用{}和[]
-G/--get    以get的方式来发送数据
-H/--header <line>  自定义头信息传递给服务器
     --ignore-content-length    忽略的HTTP头信息的长度
-i/--include    输出时包括protocol头信息
-I/--head   只显示请求头信息
-j/--junk-session-cookies   读取文件进忽略session cookie
     --interface <interface>    使用指定网络接口/地址
     --krb4 <level> 使用指定安全级别的krb4
-k/--insecure   允许不使用证书到SSL站点
-K/--config 指定的配置文件读取
-l/--list-only  列出ftp目录下的文件名称
     --limit-rate <rate>    设置传输速度
     --local-port<NUM>  强制使用本地端口号
-m/--max-time <seconds> 设置最大传输时间
     --max-redirs <num> 设置最大读取的目录数
     --max-filesize <bytes> 设置最大下载的文件总量
-M/--manual 显示全手动
-n/--netrc  从netrc文件中读取用户名和密码
     --netrc-optional   使用 .netrc 或者 URL来覆盖-n
     --ntlm 使用 HTTP NTLM 身份验证
-N/--no-buffer  禁用缓冲输出
-o/--output 把输出写到该文件中
-O/--remote-name    把输出写到该文件中,保留远程文件的文件名
-p/--proxytunnel    使用HTTP代理
     --proxy-anyauth    选择任一代理身份验证方法
     --proxy-basic  在代理上使用基本身份验证
     --proxy-digest 在代理上使用数字身份验证
     --proxy-ntlm   在代理上使用ntlm身份验证
-P/--ftp-port <address> 使用端口地址,而不是使用PASV
-q  作为第一个参数,关闭 .curlrc
-Q/--quote <cmd>    文件传输前,发送命令到服务器
-r/--range <range>  检索来自HTTP/1.1或FTP服务器字节范围
--range-file    读取(SSL)的随机文件
-R/--remote-time    在本地生成文件时,保留远程文件时间
     --retry <num>  传输出现问题时,重试的次数
     --retry-delay <seconds>    传输出现问题时,设置重试间隔时间
     --retry-max-time <seconds> 传输出现问题时,设置最大重试时间
-s/--silent 静默模式。不输出任何东西
-S/--show-error 显示错误
     --socks4 <host[:port]> 用socks4代理给定主机和端口
     --socks5 <host[:port]> 用socks5代理给定主机和端口
     --stderr <file>     
-t/--telnet-option <OPT=val>    Telnet选项设置
     --trace <file> 对指定文件进行debug
     --trace-ascii <file>   Like --跟踪但没有hex输出
     --trace-time   跟踪/详细输出时,添加时间戳
-T/--upload-file <file> 上传文件
     --url <URL>    Spet URL to work with
-u/--user <user[:password]> 设置服务器的用户和密码
-U/--proxy-user <user[:password]>   设置代理用户名和密码
-w/--write-out [format] 什么输出完成后
-x/--proxy <host[:port]>    在给定的端口上使用HTTP代理
-X/--request <command>  指定什么命令
-y/--speed-time 放弃限速所要的时间,默认为30
-Y/--speed-limit    停止传输速度的限制,速度时间

实例

响应头部信息 (区别 i/I 大小写)

通过-I可以只打印出HTTP头部信息:

curl -I https://peng.rayfl.cn/test.php
HTTP/1.1 564 
Server: NWSs
Date: Thu, 08 Feb 2018 07:15:59 GMT
Content-Length: 0
Connection: keep-alive
X-NWS-LOG-UUID: 6f342587-e175-4615-b1ed-28e7d2023a0c

通过-i可以在输出HTML内容同时打印头部信息:

curl -i https://peng.rayfl.cn/test.php
HTTP/1.1 200 OK
Server: NWSs
Date: Thu, 08 Feb 2018 07:17:41 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 192
Connection: keep-alive
X-Powered-By: PHP/5.6.33
X-NWS-LOG-UUID: 3529b655-0931-413d-8358-52f423f391c0
X-Daa-Tunnel: hop_count=2

<h1>Access Apache </h1>
<img src="https://bbs.jpeng.xyz/static/image/common/logo.png" />
<img src="https://peng.rayfl.cn/static/image/common/logo.png" />
当前亚洲上海时间:
15:02:41

当页面有跳转的时候,输出跳转到的页面

某些网站可能开启了默认强制跳转,比如从HTTP强制跳转到HTTPS,如果使用curl不带参数,可能得到的不是你预期的结果,这时可以用到 -L 选项
先看实例:

curl http://peng.rayfl.cn/test.php

网站开启了HTTP强制跳转HTTPS,使用上面的命令以HTTP访问,输出以下内容:

    root@localhost ~]# curl http://peng.rayfl.cn/test.php
    The actual URL is '/test.php'.[root@localhost ~]# 

可见输出的内容并不友好
加上 -L 选项之后:

curl -L http://peng.rayfl.cn/test.php
<h1>Access Apache</h1>
<img src="https://bbs.jpeng.xyz/static/image/common/logo.png" />
<img src="https://peng.rayfl.cn/static/image/common/logo.png" />
当前亚洲上海时间:
15:02:25

可见能够输出正常的HTML内容了,其实这是跳转HTTPS以后的内容。
再加上 -i 选项可以更直观一些:

curl -Li http://peng.rayfl.cn/test.php
HTTP/1.1 302 Found
Server: NWS_TCloud_S1
Connection: keep-alive
Date: Thu, 08 Feb 2018 07:54:50 GMT
Content-Length: 30
Location: https://peng.rayfl.cn/test.php

HTTP/1.1 200 OK
Server: NWSs
Date: Thu, 08 Feb 2018 07:54:51 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 192
Connection: keep-alive
X-Powered-By: PHP/5.6.33
X-NWS-LOG-UUID: 705e0abc-2086-4c6f-b741-abb368d10f3f
X-Daa-Tunnel: hop_count=2

<h1>Access Apache</h1>
<img src="https://bbs.jpeng.xyz/static/image/common/logo.png" />
<img src="https://peng.rayfl.cn/static/image/common/logo.png" />
当前亚洲上海时间:
15:02:51

从获取的头部信息可以看到HTTP访问经过302跳转到HTTPS

文件下载

使用选项-O将下载的数据写入到文件,必须使用文件的绝对地址:

curl http://test.com/text.iso --silent -O

选项-o将下载数据写入到指定名称的文件中,并使用–progress显示进度条:

curl http://test.com/test.iso -o filename.iso --progress

######################################### 100.0%
断点续传

用curl设置cookies

使用–cookie “COKKIES”选项来指定cookie,多个cookie使用分号分隔:

curl http://test.com --cookie "user=root;pass=123456"

将cookie另存为一个文件,使用–cookie-jar选项:

curl URL --cookie-jar cookie_file

用curl设置用户代理字符串

有些网站访问会提示只能使用IE浏览器来访问,这是因为这些网站设置了检查用户代理,可以使用curl把用户代理设置为IE,这样就可以访问了。使用–user-agent或者-A选项:

curl URL --user-agent "Mozilla/5.0"
curl URL -A "Mozilla/5.0"

其他HTTP头部信息也可以使用curl来发送,使用-H”头部信息” 传递多个头部信息,例如:

curl -H "Host:test.com" -H "accept-language:zh-cn" URL

curl的带宽控制和下载配额

使用–limit-rate限制curl的下载速度:

curl URL --limit-rate 50k

命令中用k(千字节)和m(兆字节)指定下载速度限制。

使用–max-filesize指定可下载的最大文件大小:

curl URL --max-filesize bytes

如果文件大小超出限制,命令则返回一个非0退出码,如果命令正常则返回0。

用curl进行认证

使用curl选项 -u 可以完成HTTP或者FTP的认证,可以指定密码,也可以不指定密码在后续操作中输入密码:

curl -u user:pwd http://test.com
curl -u user http://test.com