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

解决宝塔登录面板时卡在正在登录的问题

在登录宝塔面板时一直卡在“正在登录…” 进不去,尝试了重启面板、修复面板、清除缓存、清理系统垃圾、更换设备及网络等一系列操作都没解决问题。最后执行了(22) 显示面板错误日志,发现很多错误。

%title插图%num

本文使用的宝塔面板版本:8.0.1,系统:CentOS 7.9.2009 x86_64

宝塔面板每天会自动备份配置文件,保存在 /www/backup/panel/ 目录,最终通过恢复备份成功解决宝塔卡在正在登录的问题,以下是命令执行记录以供参考。

# bt stop
Stopping Bt-Tasks...    done
Stopping Bt-Panel...    done
# mv /www/server/panel/data/default.db /www/backup/default.db
# mkdir /www/backup/db/ -p
# unzip -o -d /www/backup/db /www/backup/panel/2023-08-04.zip
Archive:  /www/backup/panel/2023-08-04.zip
   creating: /www/backup/db/2023-08-04/
   creating: /www/backup/db/2023-08-04/data/
  inflating: /www/backup/db/2023-08-04/data/404.html  
  inflating: /www/backup/db/2023-08-04/data/default.db
# \cp -r -a /www/backup/db/2023-08-04/data/default.db /www/server/panel/data/default.db
# bt start
Starting Bt-Panel....   done
Starting Bt-Tasks...    done
 

为什么恢复4号而不是最近的?
最近5号到8号的备份文件大小一样,可能问题就从5号开始,所以优先恢复4号的。

%title插图%num

域名被阻断的应急解决方案

%title插图%num
网站备案被注销导致无法访问

近期有小伙伴的域名备案被注销导致域名被阻断,随之业务受到影响,问我有什么办法能够解决。遇到这种“不可抗力”因素只能重新备案以尽快恢复业务,域名备案周期通常需要长达25个工作日,小伙伴说他的业务非常重要,想到要等1个月以后才能恢复,简直就是一场恶梦。要在短期内恢复业务,通常只有2种选择,第1种将业务迁移到境外服务器,第2种更换已备案的业务域名,但由于业务环境复杂,无论采取哪种方法对业务的影响仍然不小。通过我的尝试得出一套方案可以在不迁移业务又不更换业务域名的情况下恢复业务。

IDC是如何对域名进行阻断的?

域名被阻断需要及时恢复访问,要突破阻断首先需要了解IDC是如何对域名进行阻断的。访问网页时服务器会接收到host,这个host通常就是域名,在数据到达服务器之前一定会通过IDC的网关,IDC在网关部署了类似防火墙的服务对host进行过滤,如果host是被阻断对象则进行阻断。

如何突破域名阻断?

了解了域名是怎么被阻断的,就知道只要访问时不让host经过IDC网关即可。首先在服务器建立新站点,该站点绑定可正常访问的域名(以下称为A站点或A域名)。A站点反代到被阻断域名站点(以下称为B站点或B域名),切记目标地址不要使用B域名,建议使用127.0.0.1,发送域名填B域名。此时访问A域名时可正常访问B站点,但我们需要访问B域名时也能访问,怎么办?

%title插图%num
建立新站点并反代到被阻断访问站点

众所周知,域名解析绑定到境外服务器是不需要进行备案的,当然也不会被阻断。经实践测试,将B域名解析绑定到境外服务器上,并设置反代到A站点后完美突破域名阻断,恢复业务正常进行。

%title插图%num
在境外服务器建立站点B绑定被阻断域名并反代到A站点

相关问答

Q:为什么不直接迁移业务到境外服务器?
A:迁移到境外服务器首先得新购境外服务器,将会有额外开支,同时现有服务器将被闲置造成资源浪费;项目中接入了众多业务域名,一旦迁移则牵一发而动全身,如何保证平滑迁移是一项考验;从长远来看使用境外服务器不仅成本更大,线路质量和稳定性都远远不如使用境内服务器;综上因单个域名被阻断就把业务迁移到境外显然是不具性价比的。

Q:为什么不更换业务域名?
A:一旦更换业务域名,所有涉及该域名的地方全部需要更换,有些服务短期内可能仍然会有影响,例如更换小域名接口域名需要重新提交审核才能生效,期间业务仍会受到影响。

Q:可否直接在境外服务器部署站点进行反代?
A:直接反代仍然会被拦截阻断,这是由于反代服务器访问源站时仍然使用了被阻断域名的host。

Q:可否反代时发送其它域名的host?
A:如果业务中没有host绑定(例如授权系统通过域名进行授权),可在反代时发送其它域名,可省去建立站点A的步骤,站点A的作用类似于跳板机。

写在最后

本文提供的思路和解决方案虽然能够应急使用,但境外服务器的访问速度及稳定性不如境内服务器,肯定会影响访问体验,域名没有备案的影响就如同没有身份证,影响面还不止限制接入,所以业务域名一定要维护好备案,比如近期管局要求网站底部规范地添加网站备案号,要及时按照要求添加,千万不可任性,避免备案被注销后导致网站被限制接入的情况。