leadscloud

Google SEO|外贸营销推广


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 我的简历

  • 友情链接

  • Chrome扩展(域名所属人)

  • 询盘管理系统

  • 外贸留言板系统

  • 搜索

自己搭建的ChatGPT国内镜像站

发表于 2023-03-06 | 分类于 技术 | | 阅读次数: | 字数统计: 98

ChatGPT国内镜像站,国内使用ChatGPT中文版本

http://chat.tinycms.xyz:3001/

欢迎体验:

支持

  • 模拟浏览器登录访问原始chatgpt网站,ChatGPT Plus付费版本
  • 支持最新的gpt-3.5-turbo 0301 API访问
  • 支持你自己的chatgpt账号中的API key 调用访问

界面是React修改而来,比较简单,不需要登录,直接就能提问

代理服务器dante安装到centos

发表于 2022-09-27 | 分类于 Linux | | 阅读次数: | 字数统计: 262

安装步骤

1
2
3
4
5
6
wget https://www.inet.no/dante/files/dante-1.4.3.tar.gz
tar xf dante-1.4.3.tar.gz
cd dante-1.4.3/
autoreconf --install --force
./configure
make install

创建并编辑配置文件

vi /etc/sockd.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
internal: 0.0.0.0 port=1080
external: eth0

clientmethod: none
socksmethod: none

client pass {
from: 127.0.0.1 to: 0.0.0.0/0
#log: connect disconnect error
}

socks pass {
from: 127.0.0.1 to: 0.0.0.0/0
#log: connect disconnect error
}

127.0.0.1 替换成 x.x.x.x/8 即可。

配置说明: https://www.inet.no/dante/doc/1.4.x/config/server.html

运行

直接以daemon模式运行

1
sockd -D

测试代理

使用内置的-V命令测试sockd.conf文件是否正确,若正确则无任何输出

1
sockd -V

测试能否正常使用

1
curl --proxy 'socks5://127.0.0.1:1080' 'https://api.ipify.org/'

可以使用 netstat -lntp 看启动状态

1
tcp        0      0 0.0.0.0:1080            0.0.0.0:*               LISTEN      16769/sockd

开机启动

vi /etc/rc.local

1
/usr/local/sbin/sockd -f /etc/sockd.conf &

关闭

killall sockd

Python requests 如何使用 oauth2client.service_account

发表于 2022-09-14 | 分类于 技术 | | 阅读次数: | 字数统计: 225

Google的API一般是下面这种使用方法,使用的是oauth2client

1
2
3
4
5
6
from oauth2client.service_account import ServiceAccountCredentials
import httplib2
credentials = ServiceAccountCredentials.from_json_keyfile_name(JSON_KEY_FILE, scopes=SCOPES)
http = credentials.authorize(httplib2.Http())

response, content = http.request(ENDPOINT, method="POST", body=json_ctn)

众所周知的原因,在国内你这样使用,必须得用代理,使用requests包非常方便,但是如果是上面的代码,使用代理有点小麻烦

你需要在代码前面加上

1
2
3
import socket
socket.socket = socks.socksocket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 1080)

比较麻烦。

可以用requests代替上面的操作,一般如下

1
2
3
4
5
6
7
8
9
10
11
12
13
http = httplib2.Http(proxy_info=httplib2.ProxyInfo(httplib2.socks.PROXY_TYPE_SOCKS5, '127.0.0.1', 1080))

credentials = ServiceAccountCredentials.from_json_keyfile_name(JSON_KEY_FILE, scopes=SCOPES)
access_token_info = credentials.get_access_token(http)

requests.get(url, params={
"url": "http://foo.com"
}, proxies={
'http': "socks5://127.0.0.1:1080",
'https': "socks5://127.0.0.1:1080",
}, headers={
"Authorization": 'Bearer ' + access_token_info.access_token
})

参考代码: https://github.com/googleapis/oauth2client/blob/master/oauth2client/transport.py

LNMP网站启用Cloudflare CDN之后如何记录用户真实IP

发表于 2022-05-01 | 分类于 Linux | | 阅读次数: | 字数统计: 512

安装 NGINX http_realip_module 模块

在 LNMP 安装目录下找到 lnmp.conf 这个文件,编辑这个文件,在 Nginx_Modules_Options 里加上 --with-http_realip_module,修改的命令如下:

1
Nginx_Modules_Options='--with-http_realip_module'

保存后执行 ./upgrade.sh nginx 来升级下 NGINX 就可以了。升级需要输入新的 NGINX 版本号,如果不想改动版本,直接输入原来的版本号即可。

修改 LNMP 配置启用模块

修改配置文件 /usr/local/nginx/conf/nginx.conf

创建文件 touch /usr/local/nginx/conf/cloudflare_ip.conf

然后,在 server {} 里面加上下面这一行:

1
include cloudflare_ip.conf;

在 /root 目录下创建下面文件:

1
update_cloudflare_ip.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
echo "#Cloudflare" > /usr/local/nginx/conf/cloudflare_ip.conf;
for i in `curl https://www.cloudflare.com/ips-v4`; do
echo "set_real_ip_from $i;" >> /usr/local/nginx/conf/cloudflare_ip.conf;
done
for i in `curl https://www.cloudflare.com/ips-v6`; do
echo "set_real_ip_from $i;" >> /usr/local/nginx/conf/cloudflare_ip.conf;
done

echo "" >> /usr/local/nginx/conf/cloudflare_ip.conf;
echo "# use any of the following two" >> /usr/local/nginx/conf/cloudflare_ip.conf;
echo "real_ip_header CF-Connecting-IP;" >> /usr/local/nginx/conf/cloudflare_ip.conf;
echo "#real_ip_header X-Forwarded-For;" >> /usr/local/nginx/conf/cloudflare_ip.conf;

执行一次脚本:/bin/bash /root/update_cloudflare_ip.sh

保存之后,配置 crontab 每周更新一次 Cloudflare 的 IP 地址(crontab -e):

1
0 5 * * 1 /bin/bash /root/update_cloudflare_ip.sh

修改日志记录配置

还是修改 /usr/local/nginx/conf/nginx.conf 这个文件,在 http {} 中间加入下面几行:

1
2
3
4
5
6
7
map $HTTP_CF_CONNECTING_IP  $clientRealIp {
"" $remote_addr;
~^(?P<firstAddr>[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+|[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+),?.*$ $firstAddr;
}
log_format main '$clientRealIp [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'$http_user_agent $remote_addr $request_time';

注意: 如果include cloudflare_ip.conf; 放在 http {}中,$remote_addr会替换为真实的ip地址,不需要上面的修改了。

然后在网站记录的日志定义使用main这个日志格式

1
access_log /home/wwwlogs/abc.com.log main;

最后重载下nginx

1
/etc/init.d/nginx reload

这时就全部搞定了。

防火墙如何封禁真实的用户ip

开了 CDN 之后使用 iptables 是没法封禁真实 IP 地址的。

Wordpress使用SQL语句替换所有关键词

发表于 2021-12-31 | 分类于 Wordpress学习 | | 阅读次数: | 字数统计: 468

Wordpress 使用 Eelementor 插件时,编辑内容,会保存到wp_postmeta中,对于中文一些替换插件 Better Search Replace 等没有问题,但如果是中文,你会发现使用替换工具替换后,内容不变。

这主要是因为中文内容保存为json格式后,会编码为unicode格式,所以无法替换,可以使用下面方法替换。

1
select count(*) from wp_postmeta where meta_value like '%\\\\u539f\\\\u59cb\\\\u5b57%\\\\u7b26';

SELECT语句中四个反斜杠(\)代表一个.
在mysql的like语法中,like后边的字符串除了会在语法解析时转义一次外,还会在正则匹配时进行第二次的转义。因此如果期望最终匹配到””,就要反转义两次,也就是由”\”到”\”再到””。
如果是普通的精确查询(=),则无需第二次的正则转义,和INSERT语句一样。

比如 原始字符 替换为 替换字符

1
2
3
4
5
6
UPDATE wp_postmeta 
SET meta_value = REPLACE(
meta_value,
'\\\u539f\\\u59cb\\\u5b57\\\u7b26',
'\\\u66ff\\\u6362\\\u5b57\\\u7b26'
);

可以使用js的 escape 来把中文转为unicode编码

wordpress内容替换SQL语句

1
2
3
UPDATE wp_options SET option_value = replace(option_value, 'http://www.yoursitename.com', 'http://localhost') WHERE option_name = 'home' OR option_name = 'siteurl';
UPDATE wp_posts SET post_content = replace(post_content, 'http://www.yoursitename.com', 'http://localhost');
UPDATE wp_postmeta SET meta_value = replace(meta_value,'http://www.yoursitename.com','http://localhost');

mysqldump工具来备份wordpress数据库

在操作前,无论使用插件还是sql语句,都要先备份数据库

1
sudo mysqldump -u root wordpress > wordpress.sql

备份wordpress根目录下的所有文件

1
sudo tar -cpvzf wordpress.tar.gz /home/wwwroot/wordpress/

上面的命令包含5个参数,分别为:

  • -c 创建一个归档文件;
  • -p 保留已归档文件的相应权限设置;
  • -v 显示详细信息;
  • -z 使用gzip压缩归档文件;
  • -f 代表文件。

执行上述命令后,/home/wwwroot/wordpress/文件夹下的所有文件都会被归档和压缩。

CentOS7从U盘自动解锁加密的根目录磁盘

发表于 2021-09-30 | 分类于 Linux | | 阅读次数: | 字数统计: 876

安装centos7时,有一个提示,是否加密磁盘,选择此选项后,每次启动系统都会要求你输入密码,这样可以保证磁盘如果没有密码,放到其它电脑上也无法使用。对数据会更加安全。

但每次手动输入密码还是比较麻烦,最好是把密钥放到U盘里,插上后就可以自动解锁,不需要输入人工输入密码。

我搜索了下,网上关于此的教程都无法完美解决,没有非常完善的文档,下面两个教程是最靠谱的,我也是根据这些教程,在虚拟机上测试成功后才找到具体的原因。

https://forums.centos.org/viewtopic.php?t=53452
https://community.spiceworks.com/how_to/168683-cenos-7-encrypt-my-data-and-use-usb-key-for-unlock

以下为完整的操作步骤:

创建一个带有keyfile的usb盘

使用fat格式即可,这样在windows电脑上也能使用

先通过lsblk blkid命令,查看系统上的硬盘情况。

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 11.9G 0 disk
├─sda1 8:1 0 200M 0 part /boot/efi
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 10.7G 0 part
└─luks-535d89c0-9b67-4138-a0f3-0879ef2a6cc6 253:0 0 10.7G 0 crypt
├─centos-root 253:1 0 9.5G 0 lvm /
└─centos-swap 253:2 0 1.2G 0 lvm [SWAP]
sdb 8:16 1 954M 0 disk
└─sdb1 8:17 1 954M 0 part /media
sr0 11:0 1 1024M 0 rom
1
2
3
4
5
6
7
8
[root@localhost ~]# blkid
/dev/sda1: SEC_TYPE="msdos" UUID="FC4C-1E93" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="dbf79d09-cbbf-4a09-8ac5-b997ae1c6dfd"
/dev/sda2: UUID="d4857a61-09d5-4768-b564-e3a12c2ca7d0" TYPE="xfs" PARTUUID="aa583022-7407-40dc-8f9e-1cb147dccd8b"
/dev/sda3: UUID="535d89c0-9b67-4138-a0f3-0879ef2a6cc6" TYPE="crypto_LUKS" PARTUUID="1e55ca3d-3636-4c37-8e27-d9bda13099a7"
/dev/sdb1: SEC_TYPE="msdos" LABEL="NEW" UUID="A06A-C2D3" TYPE="vfat"
/dev/mapper/luks-535d89c0-9b67-4138-a0f3-0879ef2a6cc6: UUID="nkQRNs-YN39-SR5g-Ge4r-jHNB-yfi4-PszeGt" TYPE="LVM2_member"
/dev/mapper/centos-root: UUID="e5859343-e19d-4cf3-9ef9-c86664a8cae3" TYPE="xfs"
/dev/mapper/centos-swap: UUID="045010bd-a926-4202-9467-6e54d110688d" TYPE="swap"

上面/dev/sda3为加密的磁盘,/dev/sdb1为U盘(FAT文件系统)。记下他们的uuid,分别为
535d89c0-9b67-4138-a0f3-0879ef2a6cc6 和 A06A-C2D3

先挂载U盘,并创建相应的文件

1
2
3
4
5
6
7
8
9
mount /dev/sdb1 /media 
mkdir /media/cryptboot
cd /media/cryptboot

#创建一个keyfile到u盘中
dd if=/dev/urandom bs=4096 count=1 of=/media/cryptboot/boot.key

#把boot.key添加为解锁的密钥,会弹出 Enter any existing passphrase: 让你输入密码
cryptsetup luksAddKey /dev/sda3 /media/cryptboot/boot.key

测试下添加的密钥文件有没有成功:

1
2
3
[root@localhost ~]# cryptsetup luksOpen -v --key-file /media/cryptboot/boot.key --test-passphrase /dev/sda3
Key slot 1 unlocked.
Command successful.

出现上面命令就是成功了。

修改启动方式

1
2
cp /etc/default/grub /etc/default/grub.original
sed -i 's|rd.lvm.lv=centos/swap|rd.luks.key=cryptboot/boot.key:UUID=A06A-C2D3 rd.lvm.lv=centos/swap|g' /etc/default/grub

即是在 /etc/default/grub 中GRUB_CMDLINE_LINUX这一行添加 rd.luks.key=cryptboot/boot.key:UUID=A06A-C2D3

下面是修改后的

1
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.luks.uuid=luks-535d89c0-9b67-4138-a0f3-0879ef2a6cc6 rd.luks.key=cryptboot/boot.key:UUID=A06A-C2D3 rd.lvm.lv=centos/swap rhgb quiet"

### 修改下文件/etc/dracut.conf

1
2
echo 'add_drivers+="vfat nls_cp437 nls_iso8859-1 ext4"' >> /etc/dracut.conf
echo 'omit_dracutmodules+="systemd"' >> /etc/dracut.conf

重新生成grub 和 initramfs

1
2
3
4
5
grub2-mkconfig -o /boot/grub2/grub.cfg
或
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

dracut --force -v

之前一直不成功的原因是,我的电脑 是uefi启动方式+GPT磁盘,所以应该使用 grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg。这点很重要。

之后重启电脑就可以了。

centos恢复被删除的文件

发表于 2021-09-13 | 分类于 Linux | | 阅读次数: | 字数统计: 184

列出被删除的文件

1
lsof | grep deleted

第2列是进程id,第4列是文件描述符

查看删除文件

1
ls -l /proc/进程id/fd/文件描述符

恢复文件

1
cp /proc/进程id/fd/文件描述符 Newfilename

mysql数据库删除恢复

使用上面的命令恢复文件后,发现mysql数据库只恢复了.ibd文件,.frm文件无法使用lsof恢复

使用其它的表结构,复制到数据库目录,或者重新创建一个表drop table tbl_name。

1
ALTER TABLE tbl_name DISCARD TABLESPACE;

这个命令会删除相应的ibd文件。

从备份文件中复制ibd文件到数据库目录,然后执行下面的命令。

1
ALTER TABLE tbl_name IMPORT TABLESPACE;

move lnmp mysql datadir to new disk on centos

发表于 2021-09-05 | 分类于 技术 | | 阅读次数: | 字数统计: 534

lnmp centos下mysql迁移数据目录到新硬盘

centos 硬盘分区

电脑中已经挂载了一个1T的新硬盘,最初安装centos系统时原先的nfts硬盘 sdb。

lsblk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
NAME                                          MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda 8:0 0 223.6G 0 disk
├─sda1 8:1 0 200M 0 part /boot/efi
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 222.4G 0 part
└─luks-61af80c4-4d0a-4312-aae1-b66abd729eb5 253:0 0 222.4G 0 crypt
├─centos-root 253:1 0 185G 0 lvm /
├─centos-swap 253:2 0 7.8G 0 lvm [SWAP]
└─centos-home 253:3 0 29.6G 0 lvm /home
sdb 8:16 0 931.5G 0 disk
├─sdb1 8:17 0 529M 0 part
├─sdb2 8:18 0 100M 0 part
├─sdb3 8:19 0 16M 0 part
├─sdb4 8:20 0 130.1G 0 part
├─sdb5 8:21 0 214.9G 0 part
├─sdb6 8:22 0 293G 0 part
└─sdb7 8:23 0 293G 0 part
sdc 8:32 1 14.6G 0 disk
└─sdc1 8:33 1 14.6G 0 part

fdisk -l

1
2
3
4
5
6
7
8
9
10
Disk /dev/sdb: 1000.2 GB, 1000204886016 bytes, 1953525168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk label type: dos
Disk identifier: 0x56c6d4e4

Device Boot Start End Blocks Id System
/dev/sdb1 1 4294967295 2147483647+ ee GPT
Partition 1 does not start on physical sector boundary.

创建分区

需要重新创建分区,把原先的分区重新分配

1
2
3
4
# parted /dev/sdb
(parted) mktable gpt
(parted) mkpart data 1024KiB -1
(parted print)

parted之后的参数是设备名。mkpart命令的三个参数分别是分区名(随便起),开始地址,结束地址-1表示至结尾,前面留出的空间可能是用于存放分区信息,不留的时候会有警告。print查看分区结果

格式化分区

mkfs.ext4 /dev/sdb1

或

mkfs.xfs /dev/sdb1

设置开机挂载

mkdir /data
mount /dev/sdb1 /data

修改/etc/fstab文件,在末尾加上一行:

/dev/sdb1 /data xfs defaults 0 0

迁移mysql数据库

先关闭mysql

/etc/init.d/mariadb stop

创建文件夹

mkdir /data/mysql/

复制datadir到新文件夹中

cp -a /usr/local/mariadb/var /data/mysql/

备份原数据目录

mv var var.bak

添加软链接

ln -s /data/mysql/var/ /usr/local/mariadb/

重启mysql即可

/etc/init.d/mariadb start

Inode limit, how to increase inode limit on block storage volume?

发表于 2020-12-17 | 分类于 Linux | | 阅读次数: | 字数统计: 482

df -h 查看磁盘还有空间,但无法创建任何文件,提示磁盘空间已满(No space left on device)。

1
2
3
4
5
6
7
8
9
[root@centos-fra ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 17M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/vda1 80G 73G 7.1G 92% /
tmpfs 379M 0 379M 0% /run/user/0
/dev/sda 100G 26G 69G 28% /mnt/volume_fra1_01

最终发现下面的解决办法。

用 df -i 查看下索引节点(inode),会发现已经用满(IUsed=100%)。
这会导致无法创建文件和目录,并且提示 No space left on device。

1
2
3
4
5
6
7
8
9
[root@centos-fra ~]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
devtmpfs 479052 312 478740 1% /dev
tmpfs 485037 1 485036 1% /dev/shm
tmpfs 485037 464 484573 1% /run
tmpfs 485037 16 485021 1% /sys/fs/cgroup
/dev/vda1 22168424 6377093 15791331 29% /
tmpfs 485037 1 485036 1% /run/user/0
/dev/sda 3276800 3276800 0 100% /mnt/volume_fra1_01

原因

cache目录中存在数量非常多的小字节缓存文件,占用的Block不多,但是占用了大量的inode。

linux里每个文件都有些元信息像创建时间,文件大小,文件名啊之类的,这些元信息就存在inode了。这样如果小文件过多的话,可能磁盘没满但inode空间已分配完,这时磁盘就跟满了一样无法写入.

解决办法

挂载之前 使用下面命令增大inode数量,如果已经挂载,需要先卸载。
但执行下面的命令后,磁盘相当于重新格式化,之前的数据就消失了。

1
mkfs.ext4 -N 20000000 /dev/path/to/volume

还有一个解决办法:

用软连接将空闲分区/home/wwwroot/中的newcache目录连接到/mnt/volume_fra1_01/.cache,使用/home分区的inode来缓解/mnt分区inode不足的问题:

参考文章

  • https://www.digitalocean.com/community/questions/inode-limit-how-to-increase-inode-limit-on-block-storage-volume

DigitalOcean的浮动IP使用

发表于 2020-11-20 | 分类于 技术 | | 阅读次数: | 字数统计: 194

DigitalOcean浮动IP是可以分配给您的某个Droplet的可公开访问的静态IP地址.

由于工作需要,需要给VPS绑定一个新的IP,并且要求请求特定IP时,使用新IP的接口。

使用方法:

1
2
3
4
5
# 查看下你的浮云IP是设置成功
curl http://169.254.169.254/metadata/v1/floating_ip/ipv4/active

# 查看浮云IP对应的网关
curl http://169.254.169.254/metadata/v1/interfaces/public/0/anchor_ipv4/gateway

得到网关地址为 10.13.0.1

在路由中添加新路由

1
ip route add 10.0.1.3 via 10.13.0.1 dev eth0

这样访问10.0.1.3时,就会使用新ip的网关口请求了。

参考文章:

  • https://www.digitalocean.com/community/questions/send-outbound-traffic-over-floating-ip
  • https://www.digitalocean.com/docs/networking/floating-ips/
12…46
Ray

Ray

Think Difficulty

456 日志
11 分类
262 标签
RSS
GitHub E-Mail
Creative Commons
Links
  • RLiveChat
  • Roadheader
  • TinyCMS
Copyright © 2023 leadscloud. All rights reserved.
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4, modified by Ray.
本站总访问量 次