============
== 白菜 ==
============
一个勤奋的代码搬运工!

访问世界上每一个经纬度为整数的交叉点

拍照 经纬度

该项目的目标是访问世界上每一个经纬度为整数的交叉点,并在每个地点拍照记录。 目前中国的进度是 429/978,平原地区的交叉点基本上被记录完毕了,剩下的都是难啃的骨头。

the Degree Confluence Project: https://confluence.org

测试服务器能否正常收发邮件

技术分享 mail telnet

需要收发邮件的话,要注意商家是否开放25端口

发邮件

使用

telnet smtp.qq.com 25

显示:

telnet smtp.qq.com 25
Trying 43.129.255.54...

则无法使用。

显示:

telnet smtp.qq.com 25
Trying 43.129.255.54...
Connected to smtp.qq.com.
Escape character is '^]'.
220 newxmesmtplogicsvrszc5-0.qq.com XMail Esmtp QQ Mail Server.

则可以正常使用。

使用gmail进行测试也是类似的:

telnet smtp.gmail.com 25           
Trying 172.253.117.109...
Connected to smtp.gmail.com.
Escape character is '^]'.
220 smtp.gmail.com ESMTP ca40-20020a056a0206a800b005897bfc2ed3sm7618602pgb.93 - gsmtp

当然,现在Gmail 推荐使用 TLS/SSL 连接,所以也要测试465:

telnet smtp.gmail.com 465

显示:

telnet smtp.gmail.com 465

Trying 173.194.174.108...
Connected to smtp.gmail.com.
Escape character is '^]'.

正常,超时则无法发送。

收邮件

telnet pop.gmail.com 995

显示:

Read more...

Nginx 出现 Too many open files 错误与修复

技术分享 nginx

最近服务器遭遇间歇性流量攻击,服务器负载不高,却出现无法打开的情况,查看nginx错误日志,出现大量的“Too many open files”错误,大致意思就是说nginx无法打开更多的文件。

出现这个错误可能是由于系统的ulimit限制和nginx自身的配置有关系。

什么是ulimit?

ulimit命令用来限制系统用户对shell资源的访问。

假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战。

ulimit 用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。

简单来说,ulimit描述符可以对用户打开的文件数量进行限制(不止限制打开文件数量),让单个用户不至于打开较多的文件,导致系统奔溃或者资源不足的情况。 查看ulimit

既然知道了ulimit是做什么的,首先要先知道系统底层限制到底是多少,ulimit的参数如下:

-a:显示目前资源限制的设定;
-c <core文件上限>:设定core文件的最大值,单位为区块;
-d <数据节区大小>:程序数据节区的最大值,单位为KB;
-f <文件大小>:shell所能建立的最大文件,单位为区块;
-H:设定资源的硬性限制,也就是管理员所设下的限制;
-m <内存大小>:指定可使用内存的上限,单位为KB;
-n <文件数目>:指定同一时间最多可开启的文件数;
-p <缓冲区大小>:指定管道缓冲区的大小,单位512字节;
-s <堆叠大小>:指定堆叠的上限,单位为KB;
-S:设定资源的弹性限制;
-t <CPU时间>:指定CPU使用时间的上限,单位为秒;
-u <程序数目>:用户最多可开启的程序数目;
-v <虚拟内存大小>:指定可使用的虚拟内存上限,单位为KB。

由于上述nginx错误是无法打开过多的文件,那么我们直接使用ulimit -n查看同一时间最多可开启的文件数。

ulimit -n

可以看出限制的1024个文件,这就导致nginx尝试打开更多的文件(超出1024个)的时候出现错误“Too many open files”

修复问题

修改ulimit限制

直接执行命令ulimit -n 65535修改打开文件数,65535指的是需要同一时间最多打开多少个文件,请根据自身情况适当修改。

ulimit命令修改只对当前的shell有效,退出后失效,如果需要永久生效,需要修改/etc/security/limits.conf这个文件,在底部加入下面的配置:

* soft nproc 65535
* hard nproc 65535
* soft nofile 65535 
* hard nofile 65535
    *:代表全局
    soft:代表软件
    hard:代表硬件
    nproc:是代表最大进程数
    nofile:是代表最大文件打开数

修改完毕后,再次执行命令:ulimit -n可以看到设置已经生效!

Read more...

Debian12 系统添加多个IP

ifconfig networking

对于使用 传统的 ifconfig 配置的系统(例如老版本的Ubuntu、Debian等),直接修改 /etc/network/interfaces 文件。

编辑配置文件:

sudo nano /etc/network/interfaces

添加多个IP地址:

在相应的网络接口下添加多个IP地址。例如:

iface enp30 inet static
    address 192.168.0.250
    netmask 255.255.255.0
    gateway 192.168.0.1

iface enp30 inet static
    address 192.168.0.251
    netmask 255.255.255.0

重启网络服务:

保存文件并退出后,重启网络服务:

sudo systemctl restart networking

检查配置

通过以下命令验证多IP地址是否已成功添加:

ip addr show enp30

这将显示 enp30 接口的所有IP地址。你应该能看到你配置的多个IP地址。

临时配置多个IP地址

为 enp30 接口添加一个新的IP 192.168.0.251 执行以下命令: ip addr add 192.168.0.251/24 dev enp30 这操作是临时的,重启后会丢失。

linux测试url的访问速度

Shell脚本 linux curl

使用curl命令来测试URL的访问速度。

以下是使用curl测试URL访问速度的步骤:

  • 打开终端或命令行界面。
  • 输入以下命令:
	curl -o /dev/null -s -w "time_namelookup: %{time_namelookup}\n time_connect: %{time_connect}\n time_pretransfer: %{time_pretransfer}\n time_starttransfer: %{time_starttransfer}\n time_total: %{time_total}\n" <URL>

请将<URL>替换为要测试的URL地址。

执行命令后,curl将会发送请求并返回一些关于请求的统计信息,包括以下内容:

  • time_namelookup:DNS解析耗时,即将URL解析为IP地址的时间。
  • time_connect:建立TCP连接的耗时。
  • time_pretransfer:从开始到传输开始之前的耗时。
  • time_starttransfer:从开始到第一个字节接收完成的耗时。
  • time_total:总耗时,即从开始到请求完成的时间。

这些时间单位都以秒为单位。

通过这些统计信息,你可以了解到URL的访问速度和各个阶段的耗时情况。

Giffgaff 打开 wificall 的操作步骤及分流规则

WifiCall Giffgaff

打开wificall的好处:可以使用英国本地资费,免费接电话。

ios:需要运营商刷到58.0版本,或者ios17.4以上版本

  • 关闭wifi和wificall开关
  • 打开飞行模式
  • 关闭你的国内运营商
  • 打开你的wifi
  • 全局连接英国节点,或走规则
  • 打开giffgaff的wificall开关,正常就可以连接上了,成功为运营商名字变成giffgaff
  • 可以解除飞行模式和正常打开你的国内运营商了

安卓:origin os系统

  • 打开wificall开关
  • 全局连接英国节点,或走规则
  • 正常就可以直接连上wificall

分流规则

# 地区检测
DOMAIN-SUFFIX, gspe1-ssl.ls.apple.com
# 沃达丰
DOMAIN-SUFFIX, epdg.epc.mnc015.mcc234.pub.3gppnetwork.org
DOMAIN-SUFFIX, ss.epdg.epc.mnc015.mcc234.pub.3gppnetwork.org
DOMAIN-SUFFIX, ss.epdg.epc.geo.mnc015.mcc234.pub.3gppnetwork.org
DOMAIN-SUFFIX, entsrv-uk.vodafone.com
DOMAIN-SUFFIX, vuk-gto.prod.ondemandconnectivity.com
IP-CIDR,88.82.0.0/19
# CMLinkUK EE
IP-CIDR,46.68.0.0/17
# Giffgaff
IP-CIDR,87.194.0.0/16

  # 地区检测
  - 'DOMAIN-SUFFIX,gspe1-ssl.ls.apple.com,WifiCall'
  # 沃达丰
  - 'DOMAIN-SUFFIX,epdg.epc.mnc015.mcc234.pub.3gppnetwork.org,WifiCall'
  - 'DOMAIN-SUFFIX,ss.epdg.epc.mnc015.mcc234.pub.3gppnetwork.org,WifiCall'
  - 'DOMAIN-SUFFIX,ss.epdg.epc.geo.mnc015.mcc234.pub.3gppnetwork.org,WifiCall'
  - 'DOMAIN-SUFFIX,entsrv-uk.vodafone.com,WifiCall'
  - 'DOMAIN-SUFFIX,vuk-gto.prod.ondemandconnectivity.com,WifiCall'
  - 'IP-CIDR,88.82.0.0/19,WifiCall,no-resolve'
  # CMLinkUK EE
  - 'IP-CIDR,46.68.0.0/17,WifiCall,no-resolve'
  # Giffgaff
  - 'IP-CIDR,87.194.0.0/16,WifiCall,no-resolve'  

节点需要支持UDP!!! wificall走的UDP的500和4500端口

Docker本地镜像的导出、导入 (export,import,save,load)

Docker

对于镜像的导出和导入,Docker 提供了两种方案,下面分别进行介绍。

一、使用 export 和 import

1,查看本机的容器

使用 docker ps -a 命令查看本机所有的容器。

2,导出镜像

(1)使用 docker export 命令根据容器 ID 将镜像导出成一个文件。

docker export 镜像ID > server.tar

(2)上面命令执行后,可以看到文件已经保存到当前的终端目录下。

3,导入镜像

(1)使用 docker import 命令则可将这个镜像文件导入进来。

docker import - new_server < server.tar

(2)执行 docker images 命令可以看到镜像确实已经导入进来了。

二、使用 save 和 load

1,查看本机的容器

这两个命令是通过镜像来保存、加载镜像文件的。首先我们使用 docker images 命令查看本机所有的镜像。

2,保存镜像

(1)下面使用 docker save 命令根据 ID 将镜像保存成一个文件。

docker save 镜像ID > server.tar

(2)我们还可以同时将多个 image 打包成一个文件,比如下面将镜像库中的 postgres 和 mongo 打包:

docker save -o images.tar postgres mongo

Read more...

Go语言进制以及进制转换

编程学习 Golang

二进制 0B或者0b 表示

var bin1 = 0b1101
package main

import "fmt"

func main(){
	var num01 int = 0b1100
	fmt.Printf("%b的十进制为%d", num01,num01)
}

八进制 0O或者0o 表示

var oct = 0o1234567
package main

import "fmt"

func main(){
	var num01 int = 0o10
	fmt.Printf("%o的十进制为%d", num01,num01)
}

十六进制 0X或者0x 表示

var hex = 0x1234
package main

import "fmt"

func main(){
	var num01 int = 0xf
	fmt.Printf("%x的十进制为%d", num01,num01)
}

进制转换

1. 二进制转八进制  %b -> %o
2. 二进制转十进制  %b ->  %d
3. 二进制转十六进制 %b -> %x
4. 八进制转二进制 %o -> %b
5. 八进制转十进制 %o -> %d
6. 八进制转十六进制 %o -> %x
7. 十进制转二进制 %d -> %b
8. 十进制转八进制 %d -> %o
9. 十进制转十六进制 %d -> %x
10. 十六进制转二进制 %x -> %b
11. 十六进制转八进制 %x -> %o
12. 十六进制转十进制 %x -> %d

// 例
fmt.Printf("十进制%d转成八进制%o",num1,num2)
%b    表示为二进制
%c    该值对应的unicode码值
%d    表示为十进制
%o    表示为八进制
%q    该值对应的单引号括起来的go语法字符字面值,必要时会采用安全的转义表示
%x    表示为十六进制,使用a-f
%X    表示为十六进制,使用A-F
%U    表示为Unicode格式:U+1234,等价于"U+%04X"
%E    用科学计数法表示
%f    用浮点数表示

快速测试 go.dev/play

Read more...

Mac终端查看sqlite3数据库

Shell脚本 mac sqlite

用sqlite命令打开数据库文件

sqlite3 db.file

这样我们就进入了数据库操作,下面的命令都只能是sqlite下的命令,如果输入其他命令,都是无效的。

我们可以输入 .help 先查看下大概的命令:

.help

常用的几种简单命令:

  1. 退出sqlite
.quit
  1. 查看所有表
.tables
  1. 配置情况
.show
  1. 设置查询数据排列格式
.mode list
.mode line 
.mode column
  1. 是否显示头
.headers on

解决 UFW 和 Docker 的问题

debian linux ufw docker

问题

UFW 是一个 iptables 前端,可以非常方便的管理防火墙的规则。但是当安装了 Docker,UFW 无法管理 Docker 发布出来的端口了。

具体现象是:

  1. 在一个对外提供服务的服务器上启用了 UFW,并且默认阻止所有未被允许的传入连接。
  2. 运行了一个 Docker 容器,并且使用 -p 选项来把该容器的某个端口发布到服务器的所有 IP 地址上。比如:docker run -d --name httpd -p 0.0.0.0:8080:80 httpd:alpine 将会运行一个 httpd 服务,并且将容器的 80 端口发布到服务器的 8080 端口上。
  3. UFW 将不会阻止所有对 8080 端口访问的请求,用命令 ufw deny 8080 也无法阻止外部访问这个端口。

这个问题其实挺严重的,这意味着本来只是为了在内部提供服务的一个端口被暴露在公共网络上。

解决 UFW 和 Docker 的问题

撤销原先的修改

如果已经按照目前网络上搜索到解决方案修改过了,请先修改回来,包括:

  1. 启用 Docker 的 iptables 功能,删除所有类似 --iptables=false 的修改,包括 /etc/docker/daemon.json 配置文件。
  2. UFW 的默认 FORWARD 规则改回默认的 DROP,而非 ACCEPT
  3. 删除 UFW 配置文件 /etc/ufw/after.rules 中与 Docker 网络相关的规则。
  4. 如果修改了 Docker 相关的配置文件,重启 Docker。稍后还要修改 UFW 的配置,可以一并重启。

目前新的解决方案只需要修改一个 UFW 配置文件即可,Docker 的所有配置和选项都保持默认。

Read more...
1 of 8 Next Page