阅读视图

发现新文章,点击刷新页面。
🔲 ☆

x509: certificate signed by unknown authority 这个问题也许没有你想的那么复杂

x509: certificate signed by unknown authority 这个问题也许没有你想的那么复杂

起初是遇到了个问题

我就更新了个cdn的证书

结果golang的http库无法正常请求接口,php的file_get_contents也无法正常请求接口

报错信息

golang的http库反馈的是 x509: certificate signed by unknown authority

php的file_get_contents 反馈的是 error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed on line 1

经过多种的猜测,发现执行完这个命令后一切都恢复了正常

yum update ca-certificates -y
🔲 ⭐

VirtualBox 7.0.10 kernel 6.5.x on ubuntu 22.04

今天启动Virtualbox后启动不了报错,提示我运行

/sbin/vboxconfig

得到的结果提示如下

Kernel driver not installed (rc=-1908)

The VirtualBox Linux kernel driver is either not loaded or not set up correctly. Please try setting it up again by executing

'/sbin/vboxconfig'

as root.

If your system has EFI Secure Boot enabled you may also need to sign the kernel modules (vboxdrv, vboxnetflt, vboxnetadp, vboxpci) before you can load them. Please see your Linux system's documentation for more information.

where: suplibOsInit what: 3 VERR_VM_DRIVER_NOT_INSTALLED (-1908) - The support driver is not installed. On linux, open returned ENOENT. 

社区的解决方案https://forums.virtualbox.org/viewtopic.php?t=110128

$ sudo add-apt-repository ppa:ubuntu-toolchain-r/ppa -y
$ sudo apt update
$ sudo apt install g++-12 gcc-12

我执行上面的步骤没有问题后,重新运行还是不行

于是又执行了

/sbin/vboxconfig

☑️ ☆

acme.sh配置ssl证书,以后不需要在去各大平台去申请了

ssl证书在当代是一个比较流行的技术

但是配置起来可谓是很麻烦,尤其是各大平台有免费的也是要自己去申请下,然后绑定dns验证,通过后在审批证书而且每年要自己去申请

技术是用来方便生活的,为何大家总想着为难自己也去为难别人

记录下使用经历

初次体验下来,最后的理想效果是能够进行自动更新免去了手动配置的烦恼

https://github.com/acmesh-official/acme.sh

这里是官方的地址,可以自行访问下

我记录下自己的使用心得

我用的是nginx

安装完acme.sh就可以生成证书了

acme.sh --issue -d gowhich.com -d www.gowhich.com -w /var/www/gowhich/web

我的博客是用Yii2搭建的,项目目录在/var/www/gowhich

如果你是其他的项目请自行查资料或者关注我交流下

[2023年 04月 13日 星期四 15:49:50 CST] Your cert is in: /home/dpzhang/.acme.sh/gowhich.com_ecc/gowhich.com.cer
[2023年 04月 13日 星期四 15:49:50 CST] Your cert key is in: /home/dpzhang/.acme.sh/gowhich.com_ecc/gowhich.com.key
[2023年 04月 13日 星期四 15:49:50 CST] The intermediate CA cert is in: /home/dpzhang/.acme.sh/gowhich.com_ecc/ca.cer
[2023年 04月 13日 星期四 15:49:50 CST] And the full chain certs is there: /home/dpzhang/.acme.sh/gowhich.com_ecc/fullchain.cer

最后生成的文件是这样的

我想的是就算后面到期的话,如果要手动进行操作的话,文件的存放还是一样的路径,所以我觉得直接用软链接就好了,这个就不用以后每次都去copy了

sudo ln -s /home/dpzhang/.acme.sh/gowhich.com_ecc/fullchain.cer ./gowhich.com.crt
sudo ln -s /home/dpzhang/.acme.sh/gowhich.com_ecc/gowhich.com.key ./gowhich.com.key

nginx的配置

ssl_certificate ssl/gowhich.com/gowhich.com.crt;
ssl_certificate_key ssl/gowhich.com/gowhich.com.key;

对应的路径可以根据具体的配置来配置

配置完之后重启下nginx就好了

🔲 ☆

mariadb使用记录

前提条件

安装的版本

mariadb-5.5.68-linux-systemd-x86_64.tar.gz

由于最新的mysql不再适合我的古老项目,也没有升级,服务器上部署的是mysql5.7,本机器是ubuntu 22.04,apt安装的话的是mysql 8.0,降低版本安装暂时没有找到好的办法
而且想试试mariadb于是就搞了一个,其实把这种东西看作是软件就好了,毕竟这个报下载下来我就执行能运行了,不用再安装其他的依赖了。

安装解压后按照文件夹中INSTALL-BINARY进行安装使用就好了

配置文件修改

以前没注意,安装我看了下/etc/mysql目录,居然有这么多好东西

$ ll /etc/mysql     
总计 32K
drwxr-xr-x 2 root root 4.0K 10月 19 13:34 conf.d
-rw------- 1 root root  317  3月 14 09:35 debian.cnf
-rwxr-xr-x 1 root root  120  1月 28 22:44 debian-start
-rw-r--r-- 1 root root 1.1K  3月 15 18:15 mariadb.cnf
drwxr-xr-x 2 root root 4.0K  6月 17  2022 mariadb.conf.d
lrwxrwxrwx 1 root root   24 10月 19 13:34 my.cnf -> /etc/alternatives/my.cnf
-rw-r--r-- 1 root root  839 10月 20  2020 my.cnf.fallback
-rw-r--r-- 1 root root  682  3月 11  2021 mysql.cnf
drwxr-xr-x 2 root root 4.0K  3月 14 09:35 mysql.conf.d

然后我就改了mariadb.cnf

port = 3307
socket = /run/mysqld/mysqld.sock

主要是这两项,端口3307是为了跟mysql 8.0启动的端口做个区分


启动方式

cd /usr/local/mysql
sudo ./support-files/mysql.server start

启动后

mysql     120523       1  0 14:39 ?        00:00:05 /usr/sbin/mysqld
root      121333       1  0 14:42 ?        00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/durban-workspace.pid
mysql     121464  121333  0 14:42 ?        00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/data/durban-workspace.err --pid-file=/usr/local/mysql/data/durban-workspace.pid --socket=/run/mysqld/mysqld.sock --port=3307

奇怪的是如何用起来 mariadb.cnf 这个配置文件的 我看了./support-files/mysql.server 其实是使用的/etc/mysql/my.cnf

原来是软链接过去的

my.cnf -> /etc/alternatives/my.cnf
/etc/alternatives/my.cnf -> /etc/mysql/mariadb.cnf

这个操作没搞懂,不过不记得了,应该是在安装mariadb的时候操作的,具体细节忘记留意了

🔲 ☆

laravel^8.0使用laravel-excel^3.1方法记录

laravel-excel的安装直接看官网

官网地址 https://docs.laravel-excel.com/

使用场景记录:

导出一个表格,指定表头,指定对应的数据

需求很简单,不过使用新版本还是有点不知如何下手,不过仔细看了文档还是找到了办法,所以文档是一个好东西

说说以前是如何使用的

首先数据源的获取,这个是一致的,需要什么数据不管新版本旧版本都一样的

$data = [[1,2,3,4],[1,2,3,4]];

之前的版本"maatwebsite/excel": "^2.1"

Excel::create('conversion', function($excel) use ($data) {
    $excel->sheet('信息', function($sheet) use ($data) {
        $sheet->rows($data);
        $sheet->prependRow(['header1','header2','header3','header4']);
    });
})->export('xlsx');

新版本"maatwebsite/excel": "^3.1"就比较麻烦了

配置数据源

use Maatwebsite\Excel\Facades\Excel;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Illuminate\Support\Collection;
class DataExport implements FromCollection, WithHeadings
{
    public function collection()
    {
        $data = [[1,2,3,4],[1,2,3,4]];
        return new Collection($data);
    }

    public function headings(): array
    {
        return [
            'header1',
            'header2',
            'header3',
            'header4',
        ];
    }
}

导出实现

Excel::store(new DataExport(), "invoices.xlsx");

看起来麻烦,不过梳理了之后感觉还是很方便的,应该算是增加了耦合度

 

 

☑️ ☆

composer不同php版本的使用方法

composer不同php版本的使用方法

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

如果本地安装了多个版本的php,需要将不同版本的php重命名一下
比如安装了

7.1 7.2 7.3 8.1 8.2
那么,对应的重命名php的名称是
php7.1 php7.2 php7.3 php8.1 php8.2

之后安装composer的时候直接使用对应重命名的php就好了
比如使用php7.3

php7.3 -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php7.3 -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php7.3 composer-setup.php
php7.3 -r "unlink('composer-setup.php');"

如果需要制定composer的话,参考如下

php7.3 composer-setup.php --install-dir=/usr/local/bin --filename=composer7.3 

如果遇到错误提示

The installation directory "/usr/local/bin" is not writable

请加上sudo

sudo php7.3 composer-setup.php --install-dir=/usr/local/bin --filename=composer7.3 

之后就可以正常使用composer的命令

php7.3 /usr/local/bin/composer7.3 install -vvv

不过执行命令的时候需要将composer替换为composer7.3

对于其他的版本的也可以使用类似的方式

☑️ ⭐

sublime text 通过LSP搭建轻量级IDE

之前在mac下开发,使用sublime text一直很苦脑的问题就是方法跳转很慢,尤其是使用golang开发的时候

之前的就不再多提了,应该多少跟我的配置也有关系或者是因为系统的原因

现在开发转到了Linux上 Ubuntu系统,感觉一切只要折腾就会变的越来越好

系统环境

这个就是我现在的环境

然后sublime text的版本是Sublime Text Build 4143

然后我说下我这天改用sublime开始开发php语言的项目和golang语言的项目的一些情况

其实我的电脑配置现在来说不算很高,这台电脑是我从我老婆手里拿来的,本来要扔掉的,不过我怕浪费就买了内存和硬盘做了升级,期间安装过windows 但是使用起来,不利于我的开发,配置起来相当麻烦,可能跟我之前一直使用mac有关系

今天我就说下两个配置 很方便

如果是开发php项目的话

请安装LSP+LSP-intelephense,就安装完就可以了

如果是开发golang项目的花

请安装LSP+LSP-gopls,也是安装完就可以了

期间我遇到过一个问题就是安装完LSP-gopls后,启动服务器的时候一直报错提示我go path不存在,这个原因是zsh和bash的原因

就是sublime默认使用了~/.profile

然后我就通过terminal启动sublime就可以了,让他获取到我现在使用的zsh配置

还有一个问题就是在使用LSP-intelephense的时候需要安装nodejs这个是文档上面没提到的,只要安装好就行了 推荐nvm

🔲 ⭐

composer更新时openssl证书异常处理

composer install 或者composer update 时出现下面错误

OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed

说明需要ssl 证书没有配置或者配置的有问题

首先去下载证书

wget http://curl.haxx.se/ca/cacert.pem

然后将证书配置到指定目录

mv cacert.pem /usr/local/openssl/cert.pem

之后在修改php.ini文件中openssl的配置

openssl.cafile=/usr/local/openssl/cert.pem

 

🔲 ☆

Ubuntu下配置swap,增加程序运行速度

前提是我用的是ubuntu

Image

通过增加swap的大小,就能提升程序运行速度,对于程序开发的我,还是被耍了一下,我居然不知道

最近运行浏览器google chrome,无意间打开了多个tab,然后就发现电脑卡住了

无意间最近观察了下进程发现swap在卡住的时候是占用满了的,然后还是2G我发现不对,于是想着这玩意以前接触过,应该可以扩容于是搞起来

sudo fallocate -l 8G /swapfile8 # 创建命令
sudo mkswap /swapfile8 # 格式化命令
sudo swapon /swapfile8 # 挂载swap

如果swap在使用中,需要先进行卸载swap操作

sudo swapoff /swapfile # 卸载swap

注意我是卸载的/swapfile不是/swapfile8

☑️ ☆

web网站安全漏洞防护

最近网站被发现有漏洞,网安管的越来越严格了

简单说就是需要做一些基本的配置

配置如下

server_tokens off; # 隐藏版本号
proxy_hide_header X-Powered-By; # 关闭 x-powerd-by
proxy_cookie_path / "/; Path=/; Secure; HttpOnly";
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header X-Frame-Options SAMEORIGIN;
add_header Content-Security-Policy  "default-src 'self' *.qeeniao.com; script-src 'self' 'unsafe-inline' 'unsafe-hashes' *.qeeniao.com https://hm.baidu.com; style-src 'self' 'unsafe-inline' 'unsafe-hashes' *.qeeniao.com";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options nosniff;
add_header Cache-Control  max-age=3600;

if ($request_method ~* OPTIONS) {
    return 403;
}

只要在nginx的配置中加入这几项

☑️ ☆

composer安装SSL证书异常处理

composer安装SSL证书异常处理,报错信息:error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed

最近发现composer的传统安装方式不行了

传统方式

curl --insecure -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

主要是,执行

curl --insecure -sS https://getcomposer.org/installer | php

报错。

有的时候报错

All settings correct for using Composer
Downloading...
Failed to decode zlib stream

有的时候报错

All settings correct for using Composer
Downloading...
The "https://getcomposer.org/versions" file could not be downloaded: SSL operation failed with code 1. Open
SSL Error messages:
error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed
Failed to enable crypto
failed to open stream: operation failed
Retrying...
The "https://getcomposer.org/versions" file could not be downloaded: SSL operation failed with code 1. Open
SSL Error messages:
error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed
Failed to enable crypto
failed to open stream: operation failed
Retrying...
The "https://getcomposer.org/versions" file could not be downloaded: SSL operation failed with code 1. Open
SSL Error messages:
error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed
Failed to enable crypto
failed to open stream: operation failed
The download failed repeatedly, aborting.

使用

curl --insecure -ksS https://getcomposer.org/installer | php

也不行,依然报错

All settings correct for using Composer
Downloading...
The "https://getcomposer.org/versions" file could not be downloaded: SSL operation failed with code 1. Open
SSL Error messages:
error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed
Failed to enable crypto
failed to open stream: operation failed
Retrying...
The "https://getcomposer.org/versions" file could not be downloaded: SSL operation failed with code 1. Open
SSL Error messages:
error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed
Failed to enable crypto
failed to open stream: operation failed
Retrying...
The "https://getcomposer.org/versions" file could not be downloaded: SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed
Failed to enable crypto
failed to open stream: operation failed
The download failed repeatedly, aborting.

执行

php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"

也不行。

可能是我服务器的证书问题,具体原因不详,具体解决方案如下

wget --no-check-certificate https://install.phpcomposer.com/installer -O ./composer-setup.php

下载安装文件,再下载证书文件

wget https://curl.haxx.se/ca/cacert.pem --no-check-certificate -O ./cacert.pem

修改php.ini中的openssl.cafile配置

vi /usr/local/lib/php.ini

修改为

openssl.cafile=/root/cacert.pem

退出修改在执行

php composer-setup.php

就可以安装成功了

☑️ ☆

curl如何查看请求时长

命令很简单

curl -o /dev/null -s -w %{http_code}---%{content_type}---%{time_namelookup}---%{time_namelookup}---%{time_connect}---%{time_starttransfer}---%{time_total}---%{speed_download}"\n" "http://www.baidu.com/"

把"http://www.baidu.com"替换一下就可以了

下面对参数进行下说明

-o /dev/null:把curl 返回的html、js 写到垃圾回收站[/dev/null]
-s:去掉所有状态
-w:按照后面的格式写出rt

http_code http:状态码

content_type:类型

time_namelookup:DNS解析域名的时间

time_commect:client和server端建立TCP连接的时间

time_starttransfer:从client发出请求,到web的server响应第一个字节的时间

time_total:client发出请求,到web的server发送回所有的相应数据的时间

speed_download:下载速度 单位 byte/s

--- 分隔符号

🔲 ☆

Curl模拟Get、Post、Put、Delete请求

GET

curl -v www.xxx.com/xxx/xxx/xx

POST

curl -v www.aaa.com/xxx/xxxx -d 'xx=14&xxx=xxx'
curl -v -X POST www.aaa.com/xxxx -d 'xx=14&xxx=ddd'

PUT

curl -v -X PUT -d "xx=19&xx=C" www.xx.com/ss/ss

DELETE

curl -v -X DELETE www.xx.com/xx/sss

如何添加HEADER

curl -v -H 'ApiKey:xxx' -H 'Sign:xxx' -H 'RequestTime:xxx' -H 'Content-Type:application/json' -H 'User-Agent:PostmanRuntime/7.26.10' -H 'Accept:*/*' -H 'Accept-Encoding:gzip, deflate, br' -H 'Connection:keep-alive' -X POST www.xx.com/test/xxxx -d '{"xxx":"xxx","dd":"1"}'

 

☑️ ☆

vim基础配置 - Tab(缩进)

使用vim最开始的时候,如果是写python的话,首先需要配置的就是缩进

如果缩进没有配置,对于入门pyhton的小白,可以说是非常苦恼,因为缩进出问题的话,代码写了也是编译不通过的

如何配置tab

首先打开~/.vimrc,没有的话自己创建一个~/.vimrc

在.vimrc中添加如下配置

set shiftwidth=4 " 缩进的宽度
set softtabstop=4 " 退回缩进的宽度
set nu " 显示行号
set autoindent " 自动缩进

配置完之后保存,再进行编辑文件的时候,在操作换行时缩进的宽度就变成了4

VIM 缩进(这个适用于在打开vim的情况下)


VIM设置自动缩进:

set autoindent
set cindent

VIM Tab键宽度

set tabstop=4

统一设置为缩进为4

set softtabstop=4
set shiftwidth=4

不要用空格键代替空格

set noexpandtab

显示行号:

set number

以上命令的输入需要在打开vim的情况下,先输入:(冒号)之后在输入对应的命令

🔲 ☆

Nestjs中的async/await的使用

前景

最近在试驾Nestjs,感觉还不错,但是知识点满多的,嗯,暂时还没放弃

在试驾的过程中,遇到一个获取数据逻辑,现在的逻辑这样的,函数如下

@Get('/index')
index(@Res() res: Response) {
  var cats: Promise<Cats[]> = this.catsService.findAll();

  cats.then(data => {
    return res.render('cats/index', {
      message: 'Cats',
      data: data
    })
  }).catch(error => {
    console.log(error);
  })
}

写完之后,发现then...catch,让我想起来,我用Reactjs开发的时候,曾经把这玩意换成了async/await于是,函数修改成如下

@Get('/index')
async index(@Res() res: Response) {
  var cats: Promise<Cats[]> = this.catsService.findAll();

  var data = await cats;

  return res.render('cats/index', {
    message: 'Cats",
    data: data,
  })
}

该写完之后,又让我想起来,我在用Nodejs写接口的时候,需要对await cats的执行做下异常捕获,不然访问的时候直接崩溃,对终端不太友好,于是该写如下

@Get('/index')
async index(@Res() res: Response) {
  var cats: Promise<Cats[]> = this.catsService.findAll();

  try {
    const data = await cats;

    return res.render('cats/index', {
      message: 'Cats",
      data: data,
    })
  } catch (err) {
    // 处理异常逻辑
    console.log(err);
  }
}

建议:使用async/await的情况下,如果遇到异常会导致接口异常,为了能够正常处理逻辑,可以使用try...catch

🔲 ☆

如何查看Linux进程运行的完整路径

日常工作中查看进程的命令有ps和top,但是只能查看到相对路径,如果想看到详细的信息,如绝对路径等是比较困难的

不过可以通过如下的方法来查看进程的详细信息

 

Linux在启动一个进程的时候,系统会在/proc目录下面创建一个以PID命名的文件夹

比如以nginx为例

$ ps -ef | grep nginx
root      3882  3865  0  2020 pts/0    00:00:00 nginx: master process /usr/bin/openresty -g daemon off;
nobody    3969  3882  0  2020 pts/0    00:00:03 nginx: worker process
nobody    3970  3882  0  2020 pts/0    00:00:05 nginx: worker process
nobody    3971  3882  0  2020 pts/0    00:00:10 nginx: worker process
nobody    3972  3882  0  2020 pts/0    00:00:57 nginx: worker process

 

我们拿PID 3882查看下

$ ls /proc/3882
attr       cgroup      comm             cwd      fd       io        map_files  mountinfo   net        oom_adj        pagemap      root       sessionid  stack  status   timers
autogroup  clear_refs  coredump_filter  environ  fdinfo   limits    maps       mounts      ns         oom_score      personality  sched      setgroups  stat   syscall  uid_map
auxv       cmdline     cpuset           exe      gid_map  loginuid  mem        mountstats  numa_maps  oom_score_adj  projid_map   schedstat  smaps      statm  task     wchan

其中包括一个名为exe的文件,这个文件即记录了绝对路径,通过llls -l命令即可查看。

里面的文件的含义,如下

  • cwd 符号链接的是进程运行目录;
  • exe 符号连接就是执行程序的绝对路径;
  • cmdline 就是程序运行时输入的命令行命令;
  • environ 记录了进程运行时的环境变量;
  • fd 目录下是进程打开或使用的文件的符号连接。

其他的请自行搜索

☑️ ☆

composer install 错误提示解决案例(1)

composer安装错误处理

错误提示内容

Class UpdateHelper\ComposerPlugin contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods

解决办法

rm -rf vendor
composer require kylekatarnls/update-helper:"^1.2.1"

 

composer版本:composer@2.0.8

参考文章:https://github.com/kylekatarnls/update-helper/issues/7

 

❌