2022年8月

项目背景


公司 App 上准备针对客户的ip来推荐最优服务器来快连设备,目前有4个节点,北京、俄勒冈、新加坡、法兰克福。客户端上报 IP,云端根据分配规则返回 server 代号。

资料搜集


一开始打算找第三方的一些API,测试了很多ip定位接口,效果并不好,有的收费,有的需要申请key有调用次数限制,大部分API只有国家和城市的信息,而且不规范,不是国家代码,抓取到结果还需要进一步匹配,因为没有大洲信息,还要自己根据国家去
   mapping 大洲。

上面的各种缺点,直接放弃第三方的API,于是找到了 GeoIP
   这个扩展,这个有纯PHP版本的,但是我没找到如何获取大洲,直接上C扩展版的,性能肯定没问题,装好扩展,geoip_continent_code_by_name 直接获取大洲简称代码。

php 扩展安装


我的是 Docker 环境 Ubuntu14.04 php5.6, 下面是扩展的安装命令。

1
apt-get -y --force-yes install php5.6-geoip

注意:--no-install-recommends 这个参数一定不要加,有这个的话安装完成会把 IP 数据包删除的, 我 build docker 镜像的时候吃过亏了,下面是 IP 数据包的目录。

1
2
root@1e1931746c6c:/usr/share/GeoIP# ls
GeoIP.dat  GeoIPv6.dat

GeoIP 扩展源码下载: https://pecl.php.net/package/geoip
   以下是源码安装步骤:

1
2
3
4
5
6
$ cd geoip-1.1.1
$ phpize
$ ./configure
$ make
$ sudo make install

编写代码


在 phpinfo 能看到 GeoIP,就说明扩展安装好了。
   这是 GeoIP 扩展的文档,一个函数获取想要的信息,完全满足了我的需求,比第三方 API 好用的多,直接省去网络请求。
   http://php.net/manual/zh/book.geoip.php

官方文档:https://wiki.swoole.com/wiki/page/6.html

Swoole扩展是按照PHP标准扩展构建的。使用phpize来生成编译检测脚本,./configure来做编译配置检测,make进行编译,make install进行安装。
上面所说都是编译 php 扩展的通用过程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 下载 release 版本 #
# 注意:在国内下载 github 的资源,有时候不稳定,可以用迅雷等下载工具在本机下载好,再通过 SFTP 传到服务器 #
cd /usr/local/src
 
# 解压、进入目录 #
tar xzvf swoole-src-master.tar.gz
cd swoole-src-master
 
# 生成编译检测脚本、配置检查、编译安装 #
# phpize、php-config 请使用你自己的路径 #
/www/server/php/72/bin/phpize && \
./configure --with-php-config=/www/server/php/72/bin/php-config \
--enable-coroutine --enable-openssl  \
--enable-http2  \
--enable-async-redis \
--enable-sockets \
--enable-mysqlnd && \
make clean && make && sudo make install

精简默认安装

1
2
3
/www/server/php/72/bin/phpize && \
./configure --with-php-config=/www/server/php/72/bin/php-config && \
make clean && make && sudo make install

如果上述步骤顺利的话,就会有 Build complete 输出:

1
2
3
4
5
Build complete.
Don't forget to run 'make test'.
 
Installing shared extensions:     /www/server/php/72/lib/php/extensions/no-debug-non-zts-20170718/
Installing header files:          /www/server/php/72/include/php/

cd /www/server/php/72/lib/php/extensions/no-debug-non-zts-20170718/ 就能找到 swoole.so 文件了

修改 php.ini 文件,将 swoole.so 加载进去

1
2
[swoole]
extension = /www/server/php/72/lib/php/extensions/no-debug-non-zts-20170718/swoole.so

通过 php -m | grep swoole 来查看是否成功加载了swoole

相关错误

编译安装swoole报错 Enable http2 support, require nghttp2 library.

swoole安装异步redis –enable-async-redis出错 hiredis/hiredis.h: No such file or directory 解决方法

服务器经常会设置一些路径作为环境变量来提升工作效率,下面记录一下设置环境变量的各种方法。

Solution 1: 临时设置

使用 export 命令

1
export PATH="$PATH:/usr/local/bin"

查看是否生效

1
export

Solution 2: 修改 profile 文件

1
2
3
4
vim /etc/profile
 
# 在里面加入命令
export PATH="$PATH:$HOME/.local/bin:$HOME/bin:/usr/local/bin"

编辑完之后,运行命令生效

1
source /etc/profile

Solution 3: 修改 .bashrc 文件

这种方法适用于设置不同账号不同的环境变量,一台服务器多个用户使用的话可以设置自己的环境变量。

1
2
3
4
5
6
7
8
# root 用户
vim /root/.bashrc
 
# 普通用户
vim /home/xxx/.bashrc
 
# 在里面加入命令
export PATH="$PATH:$HOME/.local/bin:$HOME/bin:/usr/local/bin"

修改完之后退出当前账号,重新登录系统,测试是否生效

1
echo $PATH

环境变量加载顺序

  1. /etc/profile

  2. /etc/environment

  3. ~/.bash_profile

  4. ~/.bashrc

  5. /etc/bashrc

解决登录linux环境后每次都要source /etc/profile使环境变量生效问题

1.编辑~/.bashrc文件

1
vim ~/.bashrc

2.在末尾添加如下代码,保存

1
2
3
if [ -f /etc/profile ]; then
. /etc/profile
fi

名称网址
Crontab 验证http://tool.lu/crontab/
Ping 服务器http://ping.chinaz.com/
时间戳转换http://tool.chinaz.com/Tools/unixtime.aspx
UrlEncode 编码/解码http://tool.chinaz.com/tools/urlencode.aspx
Base64 编码/解码http://tool.chinaz.com/Tools/Base64.aspx
base64 图片转换http://tool.chinaz.com/tools/imgtobase/
PHP Formathttps://tool.lu/php
JSON 格式化https://yusure.cn/tools/json/
JSON 压缩转义https://www.sojson.com/yasuo.html
JSON/PHP Array Converterhttps://wow.techbrood.com/fiddle/17793
XML 格式化https://tool.lu/xml/
16进制转文本http://www.bejson.com/convert/ox2str/  https://www.sojson.com/hexadecimal.html
ASCII码在线转换计算器https://www.mokuge.com/tool/asciito16/
ASCII码对照表http://c.biancheng.net/c/ascii/  https://tool.oschina.net/commons?type=4
进制转换https://tool.lu/hexconvert/
RGB颜色值与十六进制https://www.sioe.cn/yingyong/yanse-rgb-16/
RGB HSV 转换https://c.runoob.com/front-end/868
颜色互转http://colorizer.org/
UUID在线生成http://www.kjson.com/encrypt/uuid/
生成随机密码https://suijimimashengcheng.51240.com/
MD5 加密https://www.cmd5.com/hash.aspx?s=123456
MD5 解密https://www.cmd5.com/
SHA1 加密http://www.metools.info/code/c22.html
JWT Decoderhttp://jwt.calebb.net/
AES加密/解密https://the-x.cn/cryptography/Aes.aspx  http://tool.chacuo.net/cryptaes
DES加密/解密https://the-x.cn/cryptography/Des.aspx
3DES加密/解密https://the-x.cn/cryptography/TripleDes.aspx
二维码生成器https://cli.im/
二维码解码https://cli.im/deqr/
WebSocket 在线测试http://www.easyswoole.com/wstool.html  http://www.websocket-test.com/
太平洋与本地时间(China Time)换算表http://www.timebie.com/cn/stdpacific.php
UserAgent 生成http://www.gjw123.com/tools-createuseragent  https://gongjux.com/userAgentGenerator/

新装的机器,如果安装时候没有调整分区,装好之后应该都在/home 下的,所以需要调整到根目录。

目标:将VolGroup-lv_home缩小到20G,并将剩余的空间添加给VolGroup-lv_root


1.首先查看磁盘使用情况

[root@localhost ~]# df -h

文件系统 容量 已用 可用 已用% 挂载点

Filesystem Size Used Avail Use% Mounted on

/dev/mapper/VolGroup-lv_root 154G 7.9G 139G 6% /

tmpfs 1.9G 100K 1.9G 1% /dev/shm

/dev/sda1 485M 69M 391M 15% /boot

/dev/mapper/VolGroup-lv_home 299G 984M 283G 1% /home


2、卸载/home

[root@localhost ~]# umount /home

umount /home 如果提示无法卸载,则是有进程占用/home,使用如下命令来终止占用进程:

[root@localhost ~]# fuser -m /home


3、调整分区大小

[root@localhost ~]# resize2fs -p /dev/mapper/VolGroup-lv_home 20G

如果提示运行 e2fsck -f /dev/mapper/VolGroup-lv_home ,则执行相关命令:

[root@localhost ~]# e2fsck -f /dev/mapper/VolGroup-lv_home 然后重新执行命令:

[root@localhost ~]# resize2fs -p /dev/mapper/VolGroup-lv_home 20G

注:resize2fs 为重新设定磁盘大小,只是重新指定一下大小,并不对结果有影响,需要下面lvreduce的配合


4、挂载上/home,查看磁盘使用情况

[root@localhost ~]# mount /home

[root@localhost ~]# df -h


5、设置空闲空间

使用lvreduce指令用于减少LVM逻辑卷占用的空间大校可能会删除逻辑卷上已有的数据,所以在操作前必须进行确认。记得输入 y

[root@localhost ~]# lvreduce -L 20G /dev/mapper/VolGroup-lv_home

注:lvreduce -L 20G的意思为设置当前文件系统为20G,如果lvreduce -l 20G是指从当前文件系统上减少20G

使用lvreduce减小逻辑卷的大校注意:减小后的大小不能小于文件的大小,否则会丢失数据。

可以使用vgdisplay命令等查看一下可以操作的大校也可以是用fdisk -l命令查看详细信息。

[root@localhost ~]# vgdisplay

注:vgdisplay为显示LVM卷组的元数据信息


6.把闲置空间挂在到根目录下

[root@localhost ~]# lvextend -L +283G /dev/mapper/VolGroup-lv_root

注:lvextend -L +283G为在文件系统上增加283G

[root@localhost ~]# resize2fs -p /dev/mapper/VolGroup-lv_root


7、检查调整结果

[root@localhost ~]# df -h