修改DouPHP代码及数据库以支持适配IPv6显示

在登录DouPHP后台时,发现管理员登录记录IP地址总显示127.0.0.1,以为是使用了WAF导致,在修改CDN回源绕过WAF后仍然如此。通过查看代码后发现DouPHP对获取到的IP地址只要不符合IPv4的正则表达式就返回127.0.0.1。IPv6已经成为网络通信的主流标准,官方至今(DouPHP版本v1.8 Release 20250217)仍未进行适配,为了正确显示IPv6,需要自行修改以适配。

在include/common.class.php修改 get_ip() 方法以修正正则表达式:确保正则表达式能够匹配完整的 IPv6 地址,修改后代码如下。

function get_ip() {
    static $ip;
    if (isset($_SERVER)) {
        if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
            // 处理 HTTP_X_FORWARDED_FOR 中可能包含的多个 IP 地址
            $ip_list = explode(',', $_SERVER["HTTP_X_FORWARDED_FOR"]);
            $ip = trim($ip_list[0]); // 取第一个 IP 地址
        } else if (isset($_SERVER["HTTP_CLIENT_IP"])) {
            $ip = $_SERVER["HTTP_CLIENT_IP"];
        } else {
            $ip = $_SERVER["REMOTE_ADDR"];
        }
    } else {
        if (getenv("HTTP_X_FORWARDED_FOR")) {
            $ip_list = explode(',', getenv("HTTP_X_FORWARDED_FOR"));
            $ip = trim($ip_list[0]); // 取第一个 IP 地址
        } else if (getenv("HTTP_CLIENT_IP")) {
            $ip = getenv("HTTP_CLIENT_IP");
        } else {
            $ip = getenv("REMOTE_ADDR");
        }
    }

    // 支持 IPv4 和 IPv6 的正则表达式
    if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6)) {
        return $ip;
    } else {
        return '127.0.0.1'; // 默认返回本地回环地址
    }
}

数据库中IP字段的类型为 VARCHAR(15),这是 IPv4 的长度限制,需要将其调整为支持 IPv6 的长度。IPv6 地址最长为 39 个字符,因此将字段长度设置为 VARCHAR(39) 或更高。可手动修改或执行以下sql语句:

-- 管理员登录记录中的IP
ALTER TABLE `dou_admin_log` MODIFY COLUMN `ip` VARCHAR(40);
-- 插件智能客服对话记录中的首次访问IP和最近访问IP
ALTER TABLE `dou_chat_service` MODIFY COLUMN `first_ip` VARCHAR(40);
ALTER TABLE `dou_chat_service` MODIFY COLUMN `last_ip` VARCHAR(40);
-- 插件智能客服对话记录的每条对话记录IP(虽然后台没有显示,但在数据库中有该字段)
ALTER TABLE `dou_chat_service_recorde` MODIFY COLUMN `ip` VARCHAR(40);

如果没有安装插件智能客服,只需要修改或执行第一个sql语句。

Linux 系统无须安装客户端实现代理连接

在 Unix/Linux 系统中自带了系统代理环境变量,通过这些变量的简单设置即可实现代理连接功能,常见的代理环境变量包括:

  1. http_proxy:用于 HTTP 请求的代理。
  2. https_proxy:用于 HTTPS 请求的代理。
  3. ftp_proxy:用于 FTP 请求的代理。
  4. no_proxy:不通过代理访问的地址列表,通常以逗号分隔。可以使用通配符。
  5. all_proxy:用于所有协议的代理设置,通常用于 SOCKS5 代理。
  6. rsync_proxy:用于 rsync 工具的代理设置。

命令示例

  • 设置 HTTP 代理
export http_proxy="http://proxy-server:port"
  • 设置 HTTPS 代理
export https_proxy="http://proxy-server:port"
  • 设置不通过代理的地址
export no_proxy="localhost,127.0.0.1,.example.com"

这些代理变量在大多数遵循标准的网络工具中都有效,包括 curlwgetgit 等。

系统可以使用 Socks5 代理。curl 支持 Socks5 代理,可以通过以下方式进行设置。

使用 Socks5 代理的命令

  1. curl 命令: 使用 -x 选项指定 Socks5 代理,例如:
curl -x socks5://proxy-server:port http://www.example.com

若 Socks5 代理需要身份验证,可以使用 -U 选项提供用户名和密码:

curl -U username:password -x socks5://proxy-server:port http://www.example.com
  1. 环境变量: 如果希望通过环境变量设置 Socks5 代理,可以使用以下命令:
export all_proxy="socks5://proxy-server:port"

对于需要身份验证的 Socks5 代理:

export all_proxy="socks5://username:password@proxy-server:port"

通过以上方式,可以方便地使用 Socks5 代理。

通过 export 命令设置的代理仅在当前终端会话有效。这意味着:

  • 当前会话有效:代理设置只在当前打开的终端窗口或会话中有效。
  • 关闭终端后失效:关闭终端或会话时,所有通过 export 设置的环境变量都会消失,打开新的终端窗口时,需要重新设置代理。

要清除临时设置的代理,可以使用 unset 命令。以下是清除 https_proxy 环境变量的步骤:

unset https_proxy

如果还设置了其他代理变量,如 http_proxyall_proxy,可以一并清除:

unset http_proxy
unset all_proxy

执行这些命令后将停用已设置的代理。

Nginx配置请求头以解决CORS跨域问题

当站点未包含 Access-Control-Allow-Origin 请求头时,根据 CORS 将不被允许访问,这个问题出现在独立静态资源站被其它域的网站引用时发生,尤其是发生在前后端部署的站点,在打开 Chrome 开发者工具进行调试时出现错误:from origin has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.

配置以下Nginx代码以解决。

    # 允许所有来源访问
    add_header 'Access-Control-Allow-Origin' '*';

    # 允许的请求方法
    add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';

    # 允许的请求头
    add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization';

    # 允许预检请求缓存时间
    add_header 'Access-Control-Max-Age' '1728000'; # 20 天

CentOS 7 官方镜像列表不可用,如何更换 CentOS 7 软件仓库?

CentOS 7 于2020年08月06日停止更新,于2024年6月30日停止维护(EOL),当前官方删除了 mirrorlist.centos.org 域名的解析,这导致使用 CentOS 7 的用户在更新或安装软件时会遇到无法连接到软件仓库的报错提示,因此需要更换软件仓库来解决这个问题。

CentOS 官方提供了名为 Vault 的库,专门用于存放已达 EOL 版本的所有软件包。更换使用官方 Vault 库步骤如下:

1.编辑 CentOS 7 的 yum 源配置文件,路径:/etc/yum.repos.d/CentOS-Base.repo ,将内容替换为:

[base]
name=CentOS-$releasever - Base
baseurl=http://vault.centos.org/7.9.2009/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

[updates]
name=CentOS-$releasever - Updates
baseurl=http://vault.centos.org/7.9.2009/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

[extras]
name=CentOS-$releasever - Extras
baseurl=http://vault.centos.org/7.9.2009/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

如要更换为阿里云提供的库,则使用以下内容替换:

[base]
name=CentOS-$releasever - Base
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

[updates]
name=CentOS-$releasever - Updates
baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

[extras]
name=CentOS-$releasever - Extras
baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

[centosplus]
name=CentOS-$releasever - Plus
baseurl=http://mirrors.aliyun.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

2.清除 yum 缓存,执行命令:sudo yum clean all

3.更新软件包索引,执行命令:sudo yum makecache

通过以上步骤可以解决 CentOS 7 软件仓库不可用的问题。

阻止搜索引擎和恶意蜘蛛爬虫访问

大量的蜘蛛爬虫访问会消耗服务器性能开销,更有工具类爬虫对网站进行渗透访问,给网站安全造成威胁,本文分享这些爬虫的 User-Agent 以及阻止方法。

现在大部分网站都使用CDN进行加速,建议直接在CDN设置 User-Agent 黑名单

阿里云全站加速 DCDN 设置方法如图所示,在图中填入 User-Agent

*dotbot*|*Go-http-client*|*CensysInspect*|*okhttp*|*MegaIndex*|*MegaIndex.ru*|*BLEXBot*|*Qwantify*|*qwantify*|*semrush*|*Semrush*|*serpstatbot*|*hubspot*|*python*|*Bytespider*|*Go-http-client*|*Java*|*PhantomJS*|*SemrushBot*|*Scrapy*|*Webdup*|*AcoonBot*|*AhrefsBot*|*Ezooms*|*EdisterBot*|*EC2LinkFinder*|*jikespider*|*Purebot*|*MJ12bot*|*WangIDSpider*|*WBSearchBot*|*Wotbox*|*xbfMozilla*|*Yottaa*|*YandexBot*|*Jorgee*|*SWEBot*|*spbot*|*TurnitinBot-Agent*|*mail.RU*|*Perl*|*Python*|*Wget*|*Xenu*|*ZmEu*

Cloudflare设置方法如图,若使用表达式生成器手动一个个添加将耗费太多时间,直接编辑表达式填入如下表达式即可

(http.user_agent contains "Go-http-client") or (http.user_agent contains "CensysInspect") or (http.user_agent contains "okhttp") or (http.user_agent contains "MegaIndex") or (http.user_agent contains "MegaIndex.ru") or (http.user_agent contains "BLEXBot") or (http.user_agent contains "Qwantify") or (http.user_agent contains "qwantify") or (http.user_agent contains "semrush") or (http.user_agent contains "Semrush") or (http.user_agent contains "serpstatbot") or (http.user_agent contains "hubspot") or (http.user_agent contains "python") or (http.user_agent contains "Bytespider") or (http.user_agent contains "Go-http-client") or (http.user_agent contains "Java") or (http.user_agent contains "PhantomJS") or (http.user_agent contains "SemrushBot") or (http.user_agent contains "Scrapy") or (http.user_agent contains "Webdup") or (http.user_agent contains "AcoonBot") or (http.user_agent contains "AhrefsBot") or (http.user_agent contains "Ezooms") or (http.user_agent contains "EdisterBot") or (http.user_agent contains "EC2LinkFinder") or (http.user_agent contains "jikespider") or (http.user_agent contains "Purebot") or (http.user_agent contains "MJ12bot") or (http.user_agent contains "WangIDSpider") or (http.user_agent contains "WBSearchBot") or (http.user_agent contains "Wotbox") or (http.user_agent contains "xbfMozilla") or (http.user_agent contains "Yottaa") or (http.user_agent contains "YandexBot") or (http.user_agent contains "Jorgee") or (http.user_agent contains "SWEBot") or (http.user_agent contains "spbot") or (http.user_agent contains "TurnitinBot-Agent") or (http.user_agent contains "mail.RU") or (http.user_agent contains "perl") or (http.user_agent contains "Python") or (http.user_agent contains "Wget") or (http.user_agent contains "Xenu") or (http.user_agent contains "ZmEu")

在本机装有WAF的情况,例如宝塔WAF,直接导入即可,格式是一行一个UA

可使用AI工具处理格式

在Nginx配置代码如下:

    if ($http_user_agent ~ "MegaIndex|MegaIndex.ru|BLEXBot|Qwantify|qwantify|semrush|Semrush|serpstatbot|hubspot|python|Bytespider|Go-http-client|Java|PhantomJS|SemrushBot|Scrapy|Webdup|AcoonBot|AhrefsBot|Ezooms|EdisterBot|EC2LinkFinder|jikespider|Purebot|MJ12bot|WangIDSpider|WBSearchBot|Wotbox|xbfMozilla|Yottaa|YandexBot|Jorgee|SWEBot|spbot|TurnitinBot-Agent|mail.RU|perl|Python|Wget|Xenu|ZmEu|^$" ) {
        return 444;
    }

Nginx配置网站同时支持多个PHP版本

很多框架系统都有插件应用市场(例如Discuz!),有些插件应用开发者由于各种原因不再对插件应用更新维护,导致该应用不支持PHP7、PHP8,但框架系统已经支持新版PHP。亦或是系统未支持新版PHP,但应用需要新版PHP才能运行。这种情况可以对Nginx进行配置实现同时支持多个PHP。

    location ~ [^/]\.php(/|$)
    {
        if ($request_uri ~*  "archives"){
          fastcgi_pass unix:/tmp/php-cgi-72.sock;
        }
      fastcgi_pass  unix:/tmp/php-cgi-56.sock;
      fastcgi_index index.php;
      include fastcgi.conf;
      include pathinfo.conf;
    }

增加Linux Swap(虚拟内存)大小

Swap是Linux下的虚拟内存,也叫交换分区。当Swap使用率较高时,可通过以下方式增加其大小。

1.查看当前系统Swap空间

# free -mh
              total        used        free      shared  buff/cache   available
Mem:           31Gi        21Gi       414Mi        69Mi       9.0Gi       8.9Gi
Swap:          15Gi        15Gi       723Mi

2.创建Swap目录

# cd /usr
# mkdir swap

3.增加Swap文件

# dd if=/dev/zero of=/usr/swap/swapfile1 bs=1M count=16384
16384+0 records in
16384+0 records out
17179869184 bytes (17 GB, 16 GiB) copied, 32.0021 s, 537 MB/s

bs=1M 表示写入的每个块的大小为1M,count=16384 表示创建大小为16384M(16GB)的Swap文件

4.查看创建的Swap文件

# du -sh /usr/swap/swapfile1
16G     /usr/swap/swapfile1

5.将目标文件标识为Swap分区文件

# mkswap /usr/swap/swapfile1
mkswap: /usr/swap/swapfile1: insecure permissions 0644, 0600 suggested.
Setting up swapspace version 1, size = 16 GiB (17179865088 bytes)
no label, UUID=386dee2a-bca6-4ca4-a943-5f01aeba9f70

6.激活swap文件

# swapon /usr/swap/swapfile1
swapon: /usr/swap/swapfile1: insecure permissions 0644, 0600 suggested.

7.编辑/etc/fstab文件

vim /etc/fstab

在末行增加以下内容

/usr/swap/swapfile1 swap swap defaults 0 0

8.查看是否挂载成功

# swapon -s
Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       16506876        15748892        -2
/usr/swap/swapfile1                     file            16777212        0       -3

显示挂载成功后大约在几分钟后在探针中显现,显现后效果如图

%title插图%num
%title插图%num

参考链接:https://timberkito.com/?p=98

在 CentOS 7 安装Go环境

由于要部署的项目使用Go语言开发,但现成编译好的发布包版本较旧,因此只能自行编译。编译的前提是有Go环境,以下记录Go环境在 CentOS 7 的安装过程。

访问 https://go.dev/dl/ ,根据系统和CPU架构选择Go安装包下载

wget https://go.dev/dl/go1.21.0.linux-amd64.tar.gz

解压到目录 /usr/local

tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz

配置环境变量

echo 'export PATH=$PATH:/usr/local/go/bin' >> /etc/profile
echo 'export GOPATH=$HOME/go' >> ~/.bash_profile
echo 'export PATH=$PATH:$GOPATH/bin' >> ~/.bash_profile

source /etc/profile
source ~/.bash_profile

mkdir -p $GOPATH/src
mkdir $GOPATH/bin
mkdir $GOPATH/pkg

最后查看版本验证是否安装成功

go version