Linux 常用命令: 权限管理

  • 每个文件和文件夹有三种用户许可类型:
    • u 所有者(user)
    • g 所有者群组(group),代表组中的所有成员;
    • o 其他(other)。
  • 三种基本权限类型可组合:
    • r 读取(read);
    • w 写(write);
    • x 执行(eXecute)。
  • 三个控制文件许可权限的命令:
    • chown user file 命令更改文件的所有者;
    • chgrp group file 改变所有群组;
    • chmod rights file 改变文件许可权限。
阅读更多

Linux 创建交换分区提供虚拟内存,解决运行时出现提示内存不足问题

如果服务器内存不够用,可以创建交换区提供虚拟内存,支持要求较大内存程序的执行。

创建交换分区命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建分区路径
sudo mkdir -p /var/cache/swap/

# 设置分区的大小
sudo fallocate -l 4G /var/cache/swap/swap0
# 如果没有 fallocate,则可以用下面的创建方式
# bs=64M是块大小,count=64是块数量,所以swap空间大小是bs*count=4096MB=4GB
#sudo dd if=/dev/zero of=/var/cache/swap/swap0 bs=64M count=64

# 设置该目录权限
sudo chmod 0600 /var/cache/swap/swap0
# 创建SWAP文件
sudo mkswap /var/cache/swap/swap0
# 激活SWAP文件
sudo swapon /var/cache/swap/swap0
# 查看SWAP信息是否正确
sudo swapon -s

删除交换分区的命令

1
2
3
sudo swapoff /var/cache/swap/swap0
# sudo swapoff -a # 停用全部分区
sudo rm /var/cache/swap/swap0

  • 一台服务器可创建多个 swap。

Debian 系统源码编译安装 PHP8.2

1
2
groupadd www
useradd www -r -g www -s /bin/false
  • yum 安装相关库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
sudo apt update
sudo apt -y install cmake git wget mtr vim gcc autoconf make bison automake \
bzip2 ncurses-dev curl e2fsprogs openssl build-essential \
libtool libxml2-dev libssl-dev libcurl4-openssl-dev libpng-dev \
libjpeg-dev libonig-dev libzip-dev libsodium-dev libevent-dev \
libgd-dev libpng-dev libjpeg-dev libwebp-dev libgif-dev \


# sqlite3,如果不用 SQLite 就不需要这一步
wget https://sqlite.org/2023/sqlite-autoconf-3420000.tar.gz
tar zxf sqlite-autoconf-3420000.tar.gz
cd sqlite-autoconf-3420000/
./configure
make && make install

cd ~
wget https://www.php.net/distributions/php-8.2.8.tar.gz
tar zxf php-8.2.8.tar.gz

cd ~/php-8.2.8/

export LD_LIBRARY_PATH=/lib/:/usr/lib/:/usr/local/lib

./configure --prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--enable-mysqlnd \
--with-pdo-mysql \
--with-pdo-mysql=mysqlnd \
--with-mysql-sock \
--with-iconv \
--enable-bcmath \
--enable-fpm \
--with-fpm-user=www \
--with-fpm-group=www \
--enable-mbstring \
--enable-gd \
--enable-phpdbg \
--enable-shmop \
--enable-sockets \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--with-zip \
--with-zlib \
--with-curl \
--with-openssl \
--enable-pcntl \
--enable-simplexml \
--with-sodium \
--enable-exif \
--enable-intl \
--with-webp \
--with-jpeg \
--enable-opcache \
--with-pear

make && make install

cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod +x /etc/init.d/php-fpm

# CentOS
chkconfig --add php-fpm
chkconfig php-fpm on
chkconfig --list php-fpm # 查看服务器设置

# Debian
# 设置开机启动
# sysv-rc-conf --level 2345 php-fpm on
sysv-rc-conf php-fpm on # 也可以用 sysv-rc-conf 命令图形化设置服务
sysv-rc-conf --list php-fpm

# Debian 还需添加服务 才能用 service php-fpm xxx 命令
vim /lib/systemd/system/php-fpm.service
# 加入以下内容
[Unit]
Description=php-fpm service
After=network.target
[Service]
Type=forking
ExecStart=/etc/init.d/php-fpm start
ExecStop=/etc/init.d/php-fpm stop
ExecReload=/etc/init.d/php-fpm reload
ExecRestart=/etc/init.d/php-fpm restart
ExecStatus=/etc/init.d/php-fpm status
ExecForceQuit=/etc/init.d/php-fpm force-quit
ExecConfigtest=/etc/init.d/php-fpm configtest
PrivateTmp=true
[Install]
WantedBy=multi-user.target
# END -----

# 启动 php-fpm
service php-fpm start

# 安装 MariaDB(可代替 MySQL)
apt install mariadb-server
mysql_secure_installation
service mariadb start
  • 编译 fileinfo 扩展需要较多内存,报虚拟内存用尽可增加虚拟内存。
  • libgd-dev 包含了 freetype 库
  • SQLite3 扩展默认启用。 允许在编译时使用 –without-sqlite3 禁用之。
  • iconv 系统自带,不需要 apt 或源码安装
  • 加 –with-pear 才会生成 bin/pecl 文件

Linux 常用命令:用户和组管理

用户&组数据文件

用户清单通常保存在 /etc/passwd 文件内,把哈希编码后的密码保存在 /etc/shadow 文件内。这两个文件都是纯文本档,以简单的格式保存,可以用文本编辑器读取与修改。每个用户占一行,其字段以冒号分隔 (“:”)。

  • /etc/passwd 用户清单,按固定顺序记录字段,并以 : 隔开,如:admin:x:1000:1000::/home/admin:/bin/bash,字段清单:
    • 用户名,例如 admin;
    • 密码: 用 DES, MD5, SHA-256 或 SHA-512 加密过的密码,特殊值 x 表示密码保存在 /etc/shadow 文件;
    • uid:用于辨识用户的不重复数字;
    • gid:用户主要群组 (Debian 的默认值系为每个用户创建一个群组) 的不重复号码;
    • GECOS:用户常规信息,类似于备注,例如其真实姓名和电话号码等;
    • 登入目录,登录后进入该目录,用于保存用户的个人文件 (环境变量 $HOME 通常指向此处);
    • 登录时运行的程序。通常是命令解译器 (shell),若指定为 /bin/false (不做任何事并立即回到控制),则用户无法进入系统;若指定为 /usr/sbin/nologin 则是禁止登录。
  • /etc/shadow 保存用户密码,含以下的字段:
    • 用户名;
    • 加密的密码;
    • 管理密码期限的字段。
  • /etc/group 用户组信息,包括以下的字段:
    • 群组名称;
    • 密码 (可选):只在加入群组时会用到 (使用 newgrp 或 sg 命令,见专栏 基本知识 在多个群组工作);
    • gid:不重复的群组识别码;
    • 成员清单:属于此群组的用户名清单,以逗号分隔。
阅读更多

在 Mac 上用一个命令使用 SSH 做代理科学上网

作为一个开发人员,翻墙是必备本领。
一些常用的参考代码和开发文档官方网站,要么很慢,要么被墙,你懂的,这需要科学上网。
你只要有一个墙外的 Linux 服务器,就能在 Mac 上用一个命令使用 ssh 做代理科学上网。

创建 SSH 秘钥

先创建名称为 pxy_rsa 的本地秘钥(你也可以使用已有的秘钥,怎样创建 ssh 秘钥如果不会自行网上搜索)。

服务器端添加账号

服务器端 ssh 禁用密码登录,配置 key 登录,
添加用户名为 pxy 的账号,只允许作为代理,不允许做其它操作。

使用 root 权限操作,执行以下命令

阅读更多

将 hexo 博客从 Github 搬迁到 Vercel,提高访问速度,效果非常满意

我的「全栈程序员伊爸」博客用 hexo 构建,之前用 GitHub Pages 托管,绑上了自己的 coderpan.com 域名,国内访问极慢,很多时候都不可用,因此搬迁到到 Vercel。搬迁耗时极少,如果熟练的话,几分钟就能完成。

Vercel 提供网站托管服务,个人或非商业站点免费,可以从 github/gitlab/bitbucket 自动部署站点。
就比如我的博客用 hexo 构建,把 hexo 站点源码保存在 GitHub 的一个私有仓库,我用 Vercel 来托管网站,Github 仓库源码每次提交,Vercel 就会自发布博客网站。
原理是 Vercel 同步 GitHub 仓库,通过 package.json 安装依赖包,执行 package.json 里的 scripts 命令来生成静态内容,保存静态内容的目录作为网站根目录提供给网络访问。其中安装依赖包、生成静态内容的命令和静态内容目录都是可以自定义的。

Vercel 托管 hexo 博客比用 GitHub Pages 托管更方便。

  • GitHub Pages: 博客源码存一个代码库,发布的静态内容存一个代码库。用 hexo 发布插件把生成的静态内容提交到 Github 仓库,实现发布博客。
  • Vercel: 只需要一个保存博客源码的 GitHub 代码库,博客源码变更提交后,Vercel 就会自动发布网站。

实操流程:

step 1、把 hexo 应用提交到一个 GitHub repository

源码内容为我们用 hexo 创建的应用的源。
GitHub repository 私有公有都可以。

step 2、把代码库授权给 Vercel

打开 https://vercel.com/new

用 github 账号授权登录后,点击 “Import Git Repository” 下拉菜单,点击 ”Add Github Account“ ,选择你的 hexo 博客代码仓库后,按提示操作就可以。如下图

添加代码库

step 3、绑定域名

在域名管理里面添加自己的域名,然后按提示到你的域名管理后台添加 A/CNAME 记录就可以。

注: Vercel 给你分配的 xxx.vercel.app 子域名被墙,需翻墙后才能访问,绑上你自己的独立域名后,用你的域名浏览不需翻墙。

step 4、Production Deployment

点击 Production Deployment 按钮把项目发布后,他人可访问你的网站。

这样 hexo 博客部署到 Vercel 就完成了,每次博客内容修改,把代码 pushGitHub 仓库后,Vercel 就会自动生成静态页面。

测试用 Octane 加速 Laravel10,并发达到4倍左右,同时对比Hyperf3压力测试

Laravel 开发爽,但性能完全无法忍受。刚完成一个项目,有点时间,试试看用 octane 加持后是否能摆脱 Laravel 的性能魔咒。
Laravel 应用基本可可无缝迁移到 Hyperf,因此同时测试 Hyperf,看看 Swoole 协程异步加持的 Hyperf 是不是比 Laravel 快很多。

测试环境

1
2
3
4
5
6
7
8
9
服务器: 阿里轻量云服务器
CPU: 2核
内存: 2G
OS: CentOS 8.5
PHP: 8.2.5
MySQL: 8.0
Swoole: 5.0.3
Laravel: 10.8
Hyperf: 3.0
阅读更多

Gradle 笔记

Android Studio 运行单元测试类的一个方法

public 方法上加入 @Test 文档标记,该行代码左侧就会出现一个绿色三角形,点击该三角形就能运行该方法。

Android Studio 使用 Socks5 代理

打开 ~/.gradle/gradle.properties,加入设置:

1
2
systemProp.socks.proxyHost=127.0.0.1 
systemProp.socks.proxyPort=1080

注意, Android Studio 的设置 Appearance & Behavior > System Settings > Http Proxy 设置的代理服务器并不是 gradle 用的代理。 gradle 代理配置在 ~/.gradle/gradle.properties 文件中,也可以是项目根目录下的 gradle.properties 中。 gradle 必须使用,并且必须正确配置代理,否则一些包没法安装。

怎样让 Android Studio 单独运行一个类

在类例加入 main 方法,Android Studio 默认是不能执行的,会报错。需要改配置才行。

打开 .idea/gradle.xml,在 GradleProjectSettings 标签下加入 <option name="delegatedBuild" value="false" />

Laravel Eloquent 日期系列化

Laravel Eloquent 日期系列化成 json,默认系列化格式为:2023-03-08T08:16:02.000000Z
原因是 Laravel 模型基类的 serializeDate() 时间系列化方法调用 Carbon\Traits\Converter::toJSON() 方法,返回的是 ISO-8601 格式的日期。

引起问题的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
// Illuminate\Database\Eloquent\Concerns\HasAttributes
protected function serializeDate(DateTimeInterface $date)
{
return $date instanceof DateTimeImmutable ?
CarbonImmutable::instance($date)->toJSON() :
Carbon::instance($date)->toJSON();
}

// class Carbon\Traits\Converter
public function toJSON()
{
return $this->toISOString();
}
阅读更多