Write the Code. Change the World.

分类目录
12月 11

docker 的确是个好东西。该早一点就用起来。当下还在熟悉和练习中。

渐渐去丰富和完善。

.env

# 时区
TZ=Asia/Shanghai

# 项目对应文件夹
SOURCE_DIR=./www

# nginx https://nginx.org/
NGINX_NAME=nginx
NGINX_VERSION=1.25.3
NGINX_HTTP_HOST_PORT=80
NGINX_HTTPS_HOST_PORT=443
NGINX_CONFD_DIR=./conf/nginx/conf.d
NGINX_CONF_FILE=./conf/nginx/nginx.conf
NGINX_SSL_CERTIFICATE_DIR=./conf/nginx/ssl
NGINX_LOG_DIR=./logs/nginx

# php8.3
PHP_LOG_DIR=./logs/php8.3

# mysql
MYSQL_DATA=./data/mysql8.2-data
MYSQL_PORT=3306

# redis
REDIS_PORT=6379

继续阅读

12月 04

记录一些问题

  1. 通过 docker-comppse.yml 配置多个服务(有 php,nginx,mysql 等),并运行。如果在 php 的 bash 中访问使用 nginx 或 mysql 这些服务呢。

当前,在项目中,无法通过 127.0.0.1 来连接 mysql 容器中的 mysql。可以通过修改 手动 修改 ip 的方式来搞定。

# 查看当前容器的 ip
ip addr

# php 和其他容器公用宿主机的 ip 修改项目中连接 mysql 的 ip 得到
172.19.0.1

docker php 安装 mysql_pdo 扩展

docker exec -it xxx bash

# 安装 pdo pdo_mysql 扩展
docker-php-ext-install pdo pdo_mysql

# 安装 mysqli 扩展
docker-php-ext-install mysqli

# 退出 重启 (xxx 容器 id)
exit
docker restart xxx

bash: ip: command not found

# 进入容器中
apt-get update

apt-get install -y iproute2

# 这个时候就有了
ip addr show

文章

https://www.jianshu.com/p/2217cfed29d7

https://blog.csdn.net/longfeng995/article/details/130704949

https://ricen.eu.org/index.php?control=doc&view=detail&id=326&i=1

12月 02

下边来弄弄 docker compose。 的确很好用。

准备

先准备一下文件。

.
├── docker-compose.yml
└── vini123
    ├── nginx
    │   └── default.conf
    └── www
        └── nginx
            └── index.php

这里先看看 docker-compose.yml 文件。

继续阅读

12月 01

常见命令一

# docker 信息
docker info
docker version

# 查看镜像
docker images

# 运行一个镜像
# --name 别名
# -p 端口映射( 宿主机端口:容器服务端口 )
# -d 以守护进程的方式运行(不加就会卡住占用窗口)
docker run --name my-nginx -d -p 80:80 nginx

# 查看活着的容器
docker ps

# 查看活所有容器
docker ps -a

# 停止容器
docker stop xxx

# 启动一个关闭的容器
docker start xxx

# 查看容器状态
docker stats

# 进入容器(以bash的形式进行交互模式)
docker exec -it xxx bash

# 退出容器(容器依然在运行)
exit

# 重启容器 (xxx 为容器 id 的前三个字符即可)
docker restart xxx

# 删除容器 (删除前需先停止)
docker rm xxx

# 删除镜像
docker rmi nginx

继续阅读

7月 04

# 在 mysql 中,先查询出 sql_mode
show variables like 'sql_mode';

# 编辑修改
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

# 没有就追加,有就修改
# 先备份一个全的
# sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

sql_mode =这里你填需要的

# 重启
sudo service mysql restart
5月 10

为了一些安全性,自己的电脑(本地)工具连接 mysql 的时候,我会限制它的 ip。可过一段时间自己的 ip 就会改变。这个时候,就连不上去。这个时候,就再修改下 ip,使其生效就好。

操作

服务端

# 连接 mysql
mysql -uroot -p
# 输入秘密
xxxxxx

# 切换到数据库
use mysql

# 先查看查看 mysql 用户表里存了哪几个用户以及请求地址限制
select host,user from user;

# 可以看到 host 中有具体的 ip 的 还有 localhost。 这个 host 就是限制连接 mysql 服务的 ip。
# 假如之前设置外部能访问的 ip 是 138.xxx.xxx.xxx, 用户名是 xx_mysql
# 你新的 ip 是 136.xxx.xx.xx
# 修改
update user set host ='136.xxx.xx.xx' where user = 'xx_mysql';

# 生效
flush privileges;
5月 01

虽然有 docker , 但还是喜欢用 homestead 开发环境。这个时候,一些旧的项目可能会用到比较低版本的 php,这个时候切换 php 版本就是一个常用的操作。

使用 php 版本

homestead 环境中,项目使用 php 的哪个版本,可以在 Homestead.yaml 文件中进行配置。比如:

sites:
    - map: work.xiangrong.com
      to: /home/vagrant/code/zhoulin/work.xiangrong.com/public
      php: "7.4"

这里指定好 php 版本就好。

但是,当 homestead 环境中当前使用的 php 版本是 php 8php 5.6 这些。使用 composer 或项目本身就有可能报错。这个时候,我们就需要将 homestead 环境的 php 版本切换的和项目所配置的一样。

补充

如果切换成对应的 php 版本还会出 badgateway 这样的错误,可以试着重启 php 看看。

# 这里以 php 7.4 为例
sudo /etc/init.d/php7.4-fpm restart

操作

# 查看当前环境中的 php 版本
php -v

# 查看所有 php 版本和当前版本
sudo update-alternatives --display php

# 执行后,会列出当前 php 所有版本和编号,输入编号,切换到执行的版本
sudo update-alternatives --config php

其实

其实,想切换到某个 php 版本。直接输入就可以了,也不用向上边那样敲那么长的命令。 比如,想切换到 php7.4 版本。直接输入 php74 回车即可。同理,想切换到 php8.2 版本,直接输入 php82 回车即可。这些命令,可以在 Homestead 目录下的 aliases 文件中找到。

function php73() {
    sudo update-alternatives --set php /usr/bin/php7.3
    sudo update-alternatives --set php-config /usr/bin/php-config7.3
    sudo update-alternatives --set phpize /usr/bin/phpize7.3
}

function php74() {
    sudo update-alternatives --set php /usr/bin/php7.4
    sudo update-alternatives --set php-config /usr/bin/php-config7.4
    sudo update-alternatives --set phpize /usr/bin/phpize7.4
}

function php80() {
    sudo update-alternatives --set php /usr/bin/php8.0
    sudo update-alternatives --set php-config /usr/bin/php-config8.0
    sudo update-alternatives --set phpize /usr/bin/phpize8.0
}

function php81() {
    sudo update-alternatives --set php /usr/bin/php8.1
    sudo update-alternatives --set php-config /usr/bin/php-config8.1
    sudo update-alternatives --set phpize /usr/bin/phpize8.1
}

function php82() {
    sudo update-alternatives --set php /usr/bin/php8.2
    sudo update-alternatives --set php-config /usr/bin/php-config8.2
    sudo update-alternatives --set phpize /usr/bin/phpize8.2
}

今天五月一日。

4月 16

在项目中,我们通常会用到 mysql、redis 数据库。有时候再额外使用 sqlite 数据库也不错。 那就开搞。

centos 一般会默认安装了 sqlite 数据库。只是版本都比较落后。

# 查看 sqlite3 的版本
sqlite3 --version

# 如果没有安装那就更好。如果安装了,就先卸载这玩意

yum remove sqlite3

安装最新版本的 sqlite3

https://www.sqlite.org/download.html

官网列出了 sqlite3 的下载地址。我们选择最新的版本地址,是包含 includes a "configure" script 的版本。当前最新版本是 3.41.2。

开始安装吧。

# 喜欢将一些需要编译安装的包放在这里
cd /usr/local/src/service

wget https://www.sqlite.org/2023/sqlite-autoconf-3410200.tar.gz

tar -xzvf sqlite-autoconf-3410200.tar.gz

cd sqlite-autoconf-3410200

./configure --prefix=/usr/local

make && make install

# 建立软链
ln -s /usr/local/bin/sqlite3 /usr/bin/sqlite3

# 查看版本
sqlite3 --version

到此 sqlite3 最新版本已经安装完成了。

4月 07

如果发现配置了定时任务,却发现没有执行到。可以先看看日志。

# 看日志
tail -f /var/log/cron

# 查看日志文件
ll /var/log/cron*

# 看哪些用户在使用定时任务
ls /var/spool/cron/

# 查看某个用户的任务详情。比如 nginx
more /var/spool/cron/nginx

# 开机自启动
systemctl enable crond

如果没有日志,请查看下边的方法

情况是这样的。本来是有日志的。如果把日志删除了,即使重启 crontab 服务也是没有日志的。还有一种就是以前根本就没打开日志。这两种情况下边的方法都可以搞定。还有说在 /etc/rsyslog.d 下建立 50-default.conf。那还不如下边的方法。 下边的方法是通过 chatGPT 查询到的。有时候还是很方便的。

要查看CentOS 8 crontab的日志,您可以按照以下步骤进行处理:

  1. 打开 /etc/rsyslog.conf 文件并找到以下行:

cron.* /var/log/cron

  1. 将上述行的注释符号(“#”)移除,以启用cron日志记录功能。保存并关闭该文件。

  2. 重新启动 rsyslog 服务,以确保更改生效:

$ sudo systemctl restart rsyslog

  1. 检查 /var/log/cron 文件,以查看生成的 cron 日志。

如果上述方法不起作用,则您可以尝试在 crontab 命令中将日志记录级别设置为更高的级别。例如,将以下行添加到 crontab 文件的顶部:

MAILTO=user@domain.com

          • /path/to/script > /dev/null 2>&1

在上述命令中,将 MAILTO 设置为您的邮件地址,以接收有关 crontab 任务运行情况的通知。将脚本路径替换为实际的脚本路径,并将输出重定向到 /dev/null,以避免在终端中看到任何输出。将 "> /dev/null 2>&1" 去掉就可以在/var/spool/mail用户文件夹下查看cron任务的执行情况了。

3月 10

服务器快到期了,所以在阿里云又从新买了一台。这两天一直在忙新服务器环境的搭建,和数据迁移的处理。

购买的服务器

部署服务器环境

  1. 在阿里云控制台初始化,设置好 root 密码后。用终端连接服务器。先进行安全更新,并重启。连带 yum 也更新了。
dnf upgrade-minimal --security

dnf update

//  记得这样重启,要不登录系统后,还是会提醒你进行安全更新
reboot
  1. 在服务端设置连接心跳。防止终端连接服务器后,一段时间不操作,会断开连接。(也可以在客户端电脑上设置)
vim /etc/ssh/sshd_config

// 末尾追加(数字自己定义合适的)
ClientAliveInterval 60
ClientAliveCountMax 5

// 重启 ssh
service sshd restart
  1. 如果登录进去,显示的主机名是一堆字母数字组成的杂乱的名字。你可以通过阿里云控制台进行设置主机名。也可以在服务器,通过命令行来完成。这么做,一方面是好看,二方面如果服务器多,好知道是哪台服务器。

  2. 禁用 root 用户远程登录服务器。使用密匙+密码的方式进行登录。这样可以增加服务器的安全。

  3. 做好这些,记得进行做镜像。方便后边出错了,不好解决的时候,进行回滚处理。

  4. 安装开发环境。

安装开发环境

  1. 安装 git(yum 安装即可。如果版本不够,可以源码编译安装。比如新的命令 git init -b main。 这个命令是新版本才支持的)。
  2. 安装 composer。 直接 wget 下载,然后移动到 /usr/bin/ 下,并设置权限。或建立软链到这里,设置权限也可以。
  3. 安装 ftp 工具。 需要设置。用来方便上传文件到服务器或从服务器下载文件。为了安全性,我仅设置 /var/ftp/xxx 目录,只有该目录的权限。
  4. 源码编译安装最新版本的 nginx。安装前需要装一堆的依赖,有的 yum 安装,有的也需要源码安装。编译报错需要啥就装啥。
  5. 源码编译最新版本的 php。当前是 php8.2.3。安装前需要装一堆的依赖,有的 yum 安装,有的也需要源码安装。编译报错需要啥就装啥。
  6. 源码编译安装最新版本的 mysql。当前是 8.0.32。
  7. 源码安装 redis。 当前最新版本是 redis7 了。
  8. 安装 node.js,安装 pnpm。

暂时先装了这么多。为了性能以及可靠性,数据库也可以单独阿里云购买。只是这个要单独花钱啊。

wordpress 博客系统迁移

wordpress 用来做博客和cms系统都还不错。这些年,虽然也想着自己用 laravel 写一个博客系统起来。后来还是搁浅了。 wordpress 可以很方便使用主题和插件。一个好的主题的好,用过就知道。

不得不换服务器了。在做迁移之前在想,我现在的服务器环境安装的开发环境都是最新的,曾经的 wordpress 还能迁移过来吗。之前一种思路是只要把数据弄过来就行。其实,还真行。后来尝试了下,在旧的服务器上,将 wordpress 直接更新到最新版本,也就是当前的 6.1 版本。再做迁移也是可以的。

操作。

方式一(对于不是太旧的 wordpress 系统)

  1. 在旧的服务器上,通过控制台将 wordpress 版本直接升级到最新版本。
  2. 将升级后的文件(就是整个站点文件)压缩。通过各种方式(我这里使用 ftp)将文件移到新的服务器,解压。
  3. 将旧的服务器上的数据库数据复制到新的服务器的数据库里。这里使用的 navicat。
  4. 在新的服务器上修改配置 nginx。
  5. 在域名运营商后台那修改域名解析。解析到新的服务器地址。
  6. 如果数据库相关配置有更改,请在项目跟目录的 wp-config.php 中进行修改配置。
  7. 然后访问域名,进行测试。如果有错误,可以修改 wp-config.php 的 debug 模式为 true。进行跟踪修改。一般修修错误就行,警告啥的可以忽略。

方式二(对于太旧的 wordpress 系统)

我有两套博客。最久的那套是 2013 年左右安装的。太旧没更新了。以为更新不了,没想到更新几次竟然能更新成功。于是按照上边的方法进行操作,结果有好几个地方修改不好。于是就有这个方式。

https://wordpress.org/download/

  1. 在新服务器对应的位置,去wordpress 官网下载最新的 wordpress。当前是 6.1, 对 php 版本要求最低是 7.4。解压。
  2. 在新的服务器上修改配置 nginx。
  3. 在域名运营商后台那修改域名解析。解析到新的服务器地址。
  4. 将旧的服务器上的数据库数据复制到新的服务器的数据库里。这里使用的 navicat。
  5. 项目跟目录准备 wp-config.php 文件。 就是从 wp-config-sample.php 复制过去就可以。
  6. 这里在浏览器中打开 'wp-admin/install.php',填入数据库信息,下一步就好了。

后来想想。wordpress 的更新应该不是所有的代码都更新。要不也不会出现之前的错误还需要修复。既然方式二能实现版本更新,那方式一似乎不是很有用。

不过很重要一点。要备份好文件和数据库。这样方便多次试错。还有如果域名有更换了,媒体文件或某些链接会失效。这个方面的确做不好。不过好在是很容易升级更新。

debug、多语言、主题、ftp相关

如果遇到错误,可以在 wp-config.php 中打开 debug 模式,进行查看跟踪。

如果后台只有英文,可以在 wp-config.php 中增加 define('WPLANG', 'zh_CN') 配置,然后在后台多语言那设置下就好。

对于主题,可以去网上找,觉得好看的好用的都可以,不过代码都是别人的,也要注意安全性相关的东西。还有代码是别人的,也要注意别人的使用说明。下载好主题后,将主题文件包放在 wp-content/themes 下,然后在后台中设置激活,再进行细致化设置就好。

还有,如果对主题部分不满意,你也可以修改源码。如果仅仅是样式方面的问题,可以通过增加 css,来覆盖样式来解决。比如隐藏一些不需要 div,修改某些div 的布局等等。

对于插件更新,默认是要你配置 ftp。这个不是太方便也不太安全。单独给它配个有点麻烦,把权限大的给它又觉得不放心。干脆就不使用 ftp 的方式来安装更新就好了。在配置文件 wp-config.php 中增加 define('FS_METHOD','direct'); 配置。然后将项目的用户和组都是设置成 php 对应的用户组。比如我的php 和 nginx 都公用 nginx:nginx 用户组。 使用 chown nginx:nginx xxx 就好了。

laravel 项目迁移

博客是一方面,我的主要服务端逻辑,都是通过 laravel 开发的。 laravel 的依赖包比较多,对 php 的版本都有很严格的控制。我之前的 php 版本是 7.4 不是太古老,但也是不好使。现在都是 php8.2.3。是大版本的更新。不过好在,一般的功能语法都会有向下兼容。开始吧。

# 将代码拉到新的服务器对应位置

git clone xxx

composer install

这个时候,如果遇到 Your lock file does not contain a compatible set of packages. Please run composer update. 可以加上 --ignore-platform-reqs 参数来忽略版本的匹配。但只是尝试,如果即使安装成功了,并不一定能使用成功。

composer install --ignore-platform-reqs

这次是成功安装了。

但发现报个错误。

Carbon\Carbon::setLastErrors(): Argument #1 ($lastErrors) must be of type array

果然某些依赖还是有改变。这个单独更新 carbon 包就可以。

composer update nesbot/carbon

composer install --ignore-platform-reqs

到此,框架算是安装好了。

cp .env .example .env

php artisan key:generate

php artisan migrate --seed

laravel 常规安装流程操作是上边边这样的。而我们这里都是完整的项目,里边配置很多,通过上边边这种方式要修改的太多了。我是直接创建一个 .env 文件,然后将旧的文件内容复制过来就好。

vim .env

# 复制配置过来就行

先进行不需要历史数据的迁移

.env 中数据库的配置正确后

php artisan migrate --seed

对相关报错进行处理。

composer update facade/ignition --ignore-platform-reqs

文件权限操作

chmod 777 storage -R
chmod bootstrap/cach -R

安装前端脚手架

yarn
yarn dev

发现有版本等相关信息报错。一种方式是直接删除 yarn.lock 文件,删除 node_modules 文件夹。再进行安装。

安装后台环境。

cd resources/admin

yarn 

error @achrinza/node-ipc@9.2.2: The engine "node" is incompatible with this module. Expected version "8 || 10 || 12 || 14 || 16 || 17". Got "18.14.2"

我们直接设置 yarn config set ignore-engines true 忽略。再继续。

yarn 

yarn run build:prod

发现报错 Building for production...Error: error:0308010C:digital envelope routines::unsupported。出现这个错误是因为 node.js V17版本中最近发布的OpenSSL3.0, 而OpenSSL3.0对允许算法和密钥大小增加了严格的限制,可能会对生态系统造成一些影响。

再继续

export NODE_OPTIONS=--openssl-legacy-provider

yarn run build:prod

然后又是 *These dependencies were not found: core-js/modules/es.array.push.js** 错误。

yarn add core-js --dev

yarn run build:prod

到此,总算是好了。凡是遇到问题解决问题就好。

配置 nginx,修改域名映射。检查测试。

其实,还有一种方式

就是将整个项目打包,复制过去,解压。然后配置下。