ubuntu 搭建邮件服务器

自己有域名的话,就可以搭建自己的邮件服务器。当然,一般来说,许多人或者公司都会把邮件服务通过smtp代理解析的形式挂靠在163,126,网易,腾讯企业邮箱的服务器上,自己只需提供域名即可使用邮件服务.这样通常邮件收发的稳定性和一些功能,如账号管理,附件上传缓存等服务都有比较大的优势,缺点也很明显,可以使用的免费的邮箱账号通常很少,不超过50个,如果想要开设更多账号,则需要交纳一定费用

此教程在于搭建一个多域名隔离,虚拟用户的邮箱系统。

网上许多教程都说只搭建postfix和dovecot即可,但是事实上,如果只使用默认的postfix,dovecot的配置,是极其不方便的,一方面,邮箱用户严格和linux下的用户挂钩,想多创建用户,则需要不停的新建linux用户,维护成本极高,而且,用户和所有email域名关联,假如解析了2个mx域名到同一个服务器,则一个用户等于同时拥有2个域名的邮箱,且内部的存储空间共享,会导致邮件混作一团,不能有效区分隔离。

不多说,进入正题:

先安装lamp环境 sudo apt-get install php7.2 mysql apache2 libapache2-mod-php7(支持apache解析php的模块)

sudo service start apache2 mysql 启动apache,mysql(apache,mysql本地初始化配置自行百度)

sudo apt-get install postfix postfix-mysql dovecot-pop3d dovecot-imapd dovecot-mysql dovecot-core 安装postfix, dovecot

注意 postfix会让你选择邮件服务的类型,选择 internet site

说明:

No configuration 表示不要做任何配置;
Internet Site 表示直接使用本地SMTP服务器发送和接收邮件;
Internet with smarthost 表示使用本地SMTP服务器接收邮件,但发送邮件时不直接使用本地SMTP服务器,而是使用第三方smart host来转发邮件;
Local only 表示邮件只能在本机用户之间发送和接收。

一般ubuntu下可能会默认以sendmail作为邮件发送的内置服务,我们要用postfix代替它

netstat -tunlp | grep 25 查看25端口是否被sendmail占用,如果是,则kill掉,然后

sudo service start postfix ,dovecot分别启动postfix(占用25端口,用来发邮件),dovecot(占用110端口,用来收邮件)

安装 postfixadmin web管理工具

wget http://nchc.dl.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.93/postfixadmin-2.93.tar.gz

解压

tar -zxvf postfixadmin-2.93.tar.gz

然后移到

mv postfixadmin-2.93 /var/www/postfixadmin

配置apache

vim /etc/apache2/sites-enabled/000-default.conf

<VirtualHost *>
        ServerName postfix.你的域名
        ServerAlias  postfix.你的域名
        DocumentRoot /var/www/postfixadmin/
        Alias / /var/www/postfixadmin/
        <Directory "/var/www/postfixadmin/">
                RewriteEngine on
                RewriteCond %{REQUEST_FILENAME} !-f
                RewriteCond %{REQUEST_FILENAME} !-d
                RewriteRule . index.php
                Require all granted
        </Directory>
        ErrorLog /data/logs/apache/postfix.你的域名-error_log
</VirtualHost>

cd /var/www/postfixadmin/

vim config.inc.php 编辑

$CONF['configured'] = true; //已配置
$CONF['default_language'] = 'cn'; //语言
$CONF['database_type'] = 'mysql'; //数据库类型
$CONF['database_host'] = 'localhost'; //数据库地址
$CONF['database_user'] = 'postfix'; //数据库用户
$CONF['database_password'] = 'postfix'; //数据库密码
$CONF['database_name'] = 'postfix'; //数据表名
$CONF['encrypt'] = 'dovecot:CRAM-MD5'; //邮箱密码加密方式
$CONF['dovecotpw'] = "/usr/bin/doveadm pw"; //加密脚本路径
$CONF['domain_path'] = 'YES'; //域名路径
$CONF['domain_in_mailbox'] = 'NO';
$CONF['aliases'] = '1000'; // 别名数
$CONF['mailboxes'] = '1000';  // 邮箱数
$CONF['maxquota'] = '1000';  // 最大邮件空间容量
$CONF['fetchmail'] = 'NO';
$CONF['quota'] = 'YES';
$CONF['used_quotas'] = 'YES';
$CONF['new_quota_table'] = 'YES';

:wq 保存

mkdir templates_c # 创建缓存目录 chown -R apache:apache templates_c 如果有了,则忽略此步骤

sudo service apache2 restart 重启apache

然后chrome访问 postfix.你的域名/setup 进入初始化安装目录

安装页
设置setup的密码

如果出错了,请查看apache error log,排查问题原因,如权限,配置问题

设置管理员密码

添加域名

新增域名

添加邮箱地址

新增邮箱地址

到这里,postfix admin就配置好了

注意: 以上创建域 和 用户 等 其实都是存储在数据库当中,并非真是存在的用户。 所以我们需要通过配置postfix 和 dovecot 通过读取数据库中的信息来完成配置。

由于dns解析我直接使用的阿里云,则无需搭建dns域名解析服务器。配置一个a 记录来解析 mail 前缀到你的服务器ip,然后配置一个mx记录解析到 mail.你的域名 即可,不懂可以自行百度

配置postfix

必须要有一个linux用户来作为邮件用户,且uid,gid 必须大于等于1000.

  • groupadd -o -g 1000 vmail
  • useradd -r -u 1000 -g 1000 -d /var/spool/mail/vmail -c “Virtual mail user” vmail

配置/etc/postfix/main.cf

queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix
# 配置主机名等信息
myhostname = mail.你的域名
mydomain = 你的域名
myorigin = $mydomain
# 配置监听端口
inet_interfaces = all
inet_protocols = ipv4
# 配置接受的域列表。 注意这里绝对不能添加与虚拟域相同的域名。否则会导致邮件无法发送。
# mydestination = $myhostname, localhost.$mydomain, localhost 这个需要注释掉,否则无法支持虚拟用户
unknown_local_recipient_reject_code = 550 # 拦截邮件的返回状态码
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
home_mailbox = Maildir/
smtpd_banner = $myhostname ESMTP $mail_name
debug_peer_level = 2
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix-2.10.1/samples
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES
# 以下是虚拟用户配置
# 设置postfix 读取和写入是的uid 和 gid
virtual_gid_maps = static:1000
virtual_uid_maps = static:1000
# 虚拟域, 这里配置通过mysql来实现。 这里指定的文件 后面就会创建
virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf
# 虚拟域中,的别名设置
virtual_alias_maps =
proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf,
proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf,
proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf
# 虚拟域中,用户邮箱设置
virtual_mailbox_maps =
proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf,
proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
# 设置基本路径。 上面查询到的邮箱地址是相对的。所以需要设置基本路径来确认邮箱位置。
virtual_mailbox_base = /var/mail/vmail
# 以上的这些虚拟化配置其实还可以简化为如下。同样可以使用,但是缺少了别名的功能
#virtual_gid_maps = static:1000
#virtual_uid_maps = static:1000
#virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf
#virtual_mailbox_maps = proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf
#virtual_mailbox_base = /var/mail/vmail

# 用户认证配置。 smtp 可以不用设置用户认证。也能使用
# 拒绝非正常的客户端
broken_sasl_auth_clients = yes
# 启用sasl认证
smtpd_sasl_auth_enable = yes
# 配置认证方式为dovecot
smtpd_sasl_type = dovecot
# 配置认证套接字的相对路径
smtpd_sasl_path = private/auth
# 配置拒绝规则
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination,reject_unknown_sender_domain
# permit_mynetworks 允许本地网络发送邮件
# permit_sasl_authenticated 允许通过认证的用户发送邮件
# reject_unauth_destination 拒绝不是发往本地的邮件
# reject_unknown_sender_domain 拒绝未知发件域名

然后我们通过postfixadmin提供的脚本生成以上虚拟域所需要的文件
切换到postfix的安装目录,执行如下命令

sudo -s

/bin/bash -c ‘bash POSTFIX_CONF.txt’

会有提示 输入信息,如数据库,用户名,密码,输入后会生成配置文件,在/tmp/下 ,如/tmp/postfixadmin-D4SIxG

将配置文件拷贝到postfix安装目录下

mkdir -p /etc/postfix/sql

cp /tm/postfixadmin-D4SIxG/* /etc/postfix/sql/

配置dovecot

postfixadmin 也提供了的 dovecot的配置方法:DOCUMENTS/DOVECOT.txt 如果我的配置没有看懂可以选择查看

先配置第一个文件dovecot.conf

protocols = pop3 imap # 开启pop3 和 imap 服务
listen = * # 监听ipv4端口
然后配置第二个文件conf.d/10-auth.conf

disable_plaintext_auth = no # 设置关闭强制加密认证
auth_mechanisms = plain login # 设置认证方法
#!include auth-system.conf.ext # 注释使用auth-system的认证方式
!include auth-sql.conf.ext # 使用auth-sql的认证方式
配置第三个文件conf.d/10-mail.conf

mail_location = maildir:/var/mail/vmail/%d/%n # 设置邮箱格式
first_valid_uid = 2000 # 设置读取和写入的uid 下面使gid
first_valid_gid = 2000
配置第三个文件conf.d/10-ssl.conf

ssl = no # 取消ssl加密 注释下面内容
#ssl_cert = #ssl_key = 配置第四个文件conf.d/10-master.conf

unix_listener /var/spool/postfix/private/auth { # 为postfix 提供认证服务套接字
mode = 0666 # 设置权限
user = postfix # 设置属主
group = postfix # 设置属组
}
配置第五个文件dovecot-sql.conf.ext

driver = mysql # 设置驱动为mysql
default_pass_scheme = MD5-CRYPT # 设置加密方法为MD5
connect = host=localhost dbname=postfix user=postfix password=postfixadmin # 设置连接参数
password_query = SELECT username AS user,password FROM mailbox WHERE username = ‘%u’ AND active=’1′ # 设置查询密码的sql语句
user_query = SELECT CONCAT(‘/var/mail/vmail/’, maildir) AS home, 1000 AS uid, 1000 AS gid, CONCAT(‘*:bytes=’, quota) AS quota_rule FROM mailbox WHERE username = ‘%u’ AND active=’1′ # 设置查询用户和邮箱的sql语句

重启postfix,dovecot,如果没成功,则sudo tail -f /var/log/mail.err mail.log 查看报错信息。排除错误即可

常见的错误:

1, /etc/postfix/mian.cf 里面有重复配置的属性,需要去掉多余的 重启postfix

2,warning:hash:/etc/aliases is unavailable.open database /etc/aliases.db:NO such file or directory.

则 vim /etc/aliases 添加一行abc:ABC 保存,然后执行newaliases,就会生成/etc/aliases.db 这个文件,重启postfix

3,error: unsupported dictionary type: mysql ,需要安装postfix-mysql sudo apt-get install postfix-mysql 即可

4,can’t encrypt password with dovecotpw, see error log for details,安装dovecot-mysql dovecot-core, 则/usr/bin/doveadm 可执行文件就会存在了,路径要写对

5,fatal: bind 0.0.0.0 port 25: Address already in use 因为sendmail占用了25端口,杀掉sendmail的进程即可

通过分析mysql中postfix库的结构,发现只要往表mailbox插入记录,就相当于后台添加邮箱,所有insert into 批量插入即可。

收件箱的邮件默认存储在服务器的 /var/mail/vmail/email.域名/邮箱名/ 下

使用自己的邮箱发送1条邮件到postfix邮箱,然后 sudo cat /var/mail/vmail/email.域名/邮箱名/new/时间戳-jalfhlah 就能看到邮件内容

一个长期贴(技术向)(3)

按理说,数据请求的基本要素都有了,就可以直接模拟请求了。但是这个app的接口有签名参数校验token。

简单来说。客户端和服务端会约定一套相同的加密算法(当然,实现的编程语言可能不同)。加密的参数由请求参数组成,通常还会算上一个实时变化的参数,如时间戳,和一个固定的混淆参数(一般称为盐),

举个例子,服务端和客户端实现一套相同的hash算法,比如说将请求参数先按键名排序 然后按 键=值&拼接成字符串,然后拼接上 timestamp=当前时间戳,再拼接上固定的盐,双md5,计算出一个32位的随机字符串作为token,一起发送给后端。后端对请求参数做相同处理,然后得出token,与前端发来的token对比,如果一致则放行,否则就拦截,下面看具体的例子:

<?php
$timestamp = time();  // 时间戳
$query_params = [ // 请求参数
    'a' => 1,
    'c' => 2,
    'b' => 'jons'
];
$salt = "this is the salt ,you cant guess it. right?"; // 盐
function signature($params, $timestamp, $salt){
    ksort($params, SORT_STRING); // 按键名升序排列
    $str = http_build_query($params); // a=1&b=jons&c=2
    $token = md5(md5($str . $salt . $timestamp));
    return $token;
}

function curl($url, $data){
    // 发起curl请求,这里忽略。
}

$token = signature($query_params, $timestamp, $salt); //3c70cacb73d99ad9ca1b682f33c341e1

$sign_params = [ 
    'timestamp' => $timestamp,
    'token' => $token
];
$url = 'https://image.baidu.com/api/login'; // 请求api
$real_params = array_merge($query_params, $sign_params); // 实际的请求参数
curl($url, $real_params); //发起请求

所以,我们可以从三方面考虑请求的合法性:

一,当客户端传过来的token与服务端计算出的token不一致时,必然是参数被人修改过,或加密规则不一致,或盐不一致,即不可被信任,需要拦截。

二,即使token一致,当传过来的时间戳与服务端时间戳相差太大的,可以认为是有人抓了包,但是没有修改,只是重复请求。也可以根据时间戳的实时性来拦截请求。

三,高手可以通过逆向反编译源码的方式获取apk客户端的源码,从而获取加密的规则,实时生成时间戳和请求参数,伪造加密过程。但是盐是前后端约定过的。这个如果被编译成二进制文件,则很难反汇编出来,从而无法从逆向的代码中获取。保证加密的最后一道防线的安全性。如果拿不到盐,一样无法获取最终的token。

现在,我就被卡在这一步加密算法。已经确定的加密方法是md5(不确定几次),加密参数中由时间戳timestamp这个参数,加密方法未知,是否有盐未知。而且加密方法不在安卓逆向的源码中,而是在被编译成so的二进制动态库中,无法反汇编

一个长期贴(技术向)(2)

当我抓出第一个数据包,然后企图通过fiddler的界面查看参数,url地址等信息时,我发现出现了奇怪的事情,数据是加过密的。我记得fiddler的证书可以解密请求啊(代理其实是通过中间人攻击的方式获取https的加密数据并解密的),why?

接着百度,然后我发现了问题。之前安装抓包工具的证书,的确是可以解密一些app的https的请求结果的。但是在android7.0以后,有些app不再置信用户自己安装的证书,而只信任操作系统下面的根证书(没错,自己安装的证书只会出现在用户目录下,不会出现在系统目录下),而且,除了root手机获得最高权限,否则根本无法在操作系统的高权限目录下安装证书。

所有,我闲置多年的小米5手机又被翻了出来,插电,还好还呢开机,经过了几个小时的折腾,成功root。一通鼓捣,终于把抓包工具的证书安装到了操作系统下面。重启手机和抓包工具,成功抓包,也能看到明文的url地址,参数,请求头,返回值了。就这么结束了没,还很遥远,否则就不会出现这个长期的帖子了

一个长期贴(技术向)(1)

最近铆上了一个app的抓包,android apk,如果破解成功,也许能赚点小钱。嗯,果然赚钱是技术的第一动力,没错。但是对于我这个没有丝毫android开发经验的来说还是挺难的。立体为证吧,希望不要最终不要已以放弃告终。

app嘛,无非就是调用接口。如果能抓出请求参数,url接口地址,header头,那么其实剩下的就比较简单了,curl直接拼凑就能请求接口,完成模拟app的操作。当初我的想法就是这么简单直接(没错,其实我研究快2周了,当我写到这里的时候所以,这篇文章主要是现总结一下当前的情况和遇到的问题)。

第一步,抓包,我首先想到的就是charles(俗称花瓶)或fiddler 抓包工具,一般的https包都可以抓,只要导出抓包工具的证书安装到手机上,然后wifi设置和抓包工具在同一个网络环境下的代理端口,然后操作app,就能够抓到数据包了,然鹅,事情并没有这么简单。

坑一:我已经很确定我的证书安装,代理设置没有问题,甚至我打开手机自带的浏览器访问百度首页,抓包工具里面都有数据包开始出现,然而,无论我怎么摆弄要抓的app,怎么点,都没有任何和该app有关的包出现,嗯?难道这个app走的是其他协议?不可能,其他协议并不适合app做常规的业务开发,所以一定是哪里出了问题。

万能的百度解决了我的疑惑,原来,有些app会检测代理,如果本机有代理,则该app会自己启动一个代理程序(类似vue的本地反向代理),让所有请求都走自己的代理。这样抓包工具就没法通过设置代理的方式抓到应用程序的包了

解决方法:安装drony。drony可以启动一个虚拟私有网络(vpn),劫持所有流量,强制所有请求都被这个vpn接管,当然包括app自己的代理请求。

drony可以设置只拦截某个具体app的请求,然后配合抓包工具,就能够抓到这类app的请求数据了

mac 配置git自动补全

使用git sta命令的时候,tab补全键按裂了都没反应,一般的linux系统下都会自动补全的,而mac并不会

好吧,百度了一下

1, 先安装bash-completion

brew install bash-completion

安装完成后

brew info bash-completion

提示

Add the following line to your ~/.bash_profile:

  [[ -r “/usr/local/etc/profile.d/bash_completion.sh” ]] && . “/usr/local/etc/profile.d/bash_completion.sh”

按要求把[[ -r “/usr/local/etc/profile.d/bash_completion.sh” ]] && . “/usr/local/etc/profile.d/bash_completion.sh”丢到.bash_profile里面

然后source ~/.bash_profile生效

2,安装git-completion

访问https://github.com/git/git/tree/master/contrib/completion

拷贝git-completion.bash文件内容(如果用的zsh就复制zsh的),保存到~/.bash-completion.bash

然后 echo ‘source ~/.bash-completion.bash’ >> ~/.base_profile

source ~/.base_profile 生效

ok,使用git时,就能按tab自动补全命令了

几乎白捡的vps

之前瞎几把逛github的时候

某个开源项目下面看到了一行字,说有1美刀一个月的vps

厂家:virmach.com(号称价格屠夫)

据说最便宜的2.5美刀/年,找了一下,没找到,就算有,估计很快也会被秒完

下面的目前都能买(已成功上车7美刀/年,没看错,是每年!!!,约46软妹币/年,真香)

相对于vultr3.5美刀/月,搬瓦工46美刀/年,已经实属美帝良心

内存CPUSSD流量价格购买
512M1核15G500G/月$7/年链接
768M1核20G750G/月$10/年链接
1G1核30G1T/月$14/年链接
2G2核50G2T/月$21/年链接
3G2核75G3T/月$28/年链接
4G2核100G4T/月$35/年链接
  • 网络测试:
  • 纽约市:http://lg.nyc.colocrossing.com/1000MB.test
  • 洛杉矶:http://lg.la.colocrossing.com/1000MB.test
  • 水牛城:http://lg.buf.colocrossing.com/1000MB.test
  • 芝加哥:http://lg.chi.colocrossing.com/1000MB.test
  • 达拉斯:http://lg.dal.colocrossing.com/1000MB.test
  • 圣何塞:http://lg.sj.colocrossing.com/1000MB.test(据说此节点最好,不过卖完了)
  • 西雅图:http://lg.sea.colocrossing.com/1000MB.test
  • 凤凰城:http://phx.lg.virmach.com/100MB.test
  • 亚特兰大:http://lg.atl.colocrossing.com/1000MB.test
  • 法兰克福:http://ffm.lg.virmach.com/1000MB.test
  • 阿姆斯特丹:http://ams.lg.virmach.com/100MB.tes

不过如果用ubuntu来装v2ray,要安装16.04的,(v2ray脚本最低支持16.04),系统安装版如果选错了,需要手动升级release,稍微麻烦了点罢了

手慢无

PS:后续发现这个vps做翻墙,偶尔会触发google机器验证,算是美中不足吧

台式机安装黑苹果

公司目前使用的是台式机,而且不给带个人电脑- -。内部局域网,系统装的是ubuntu18.04桌面版,老实说,用可以用,也还算流畅额,就是软件生态太差,啥也没,qq,微信,ever note等,甚至需要打交流卡的钉钉也没有。用了1个月,实在是忍不了,怒装黑苹果解决需求问题


参考

安装配置

  • 主板:技嘉
  • cpu:Intel core i5-3470 4核心 4线程 3.2GHz
  • 集显:Intel 2500 hd(不支持黑苹果,未使用,具体详见下方免驱速查表)
  • 独显:NVIDIA gt 710 1g显存
  • 硬盘:500g机械硬盘(windows 系统盘),120g 固态硬盘(mac os 安装系统盘)
  • 内存:16g (金士顿8g*2)
  • 声卡:瑞昱
  • 网卡:intel 技嘉
  • 蓝牙:无

教程

准备

  • 8g+ u盘 usb2.0(16g+ usb3.0更佳)
  • macOS 10.14 mojave with clover 系统安装包
  • windows(或pe)下安装disk genius, balenaEtcher(推荐) 或 Transmac

step1-制作macOS系统安装盘

  • 在windows或pe环境下
  • 系统安装包下载 验证码 ekka
  • 使用balenaEtcher(管理员权限启动)将安装包导入u盘: 步骤

1,选择镜像

2,选择u盘

3,点flash

4,写入与验证预计30分钟(若u盘有重要资料请提前备份)

step2-设置bios

step3-设置开机u盘启动

  • 根据电脑主板型号自行百度u盘启动方法

del

f11

f12

或其他键位

step4-安装

  • 出现任何安装问题可以拉到最下面的 !!!常见问题说明!!!
  • 1,一般u盘启动后,会短暂的跑码,然后进入安装引导页(clover引导教程
  • 2,光标选择boot macos from xxx(开机或第二次安装时xxx代表安装盘名称/第一次安装时择选 install macOS Mojave)回车
  • 3,等待跑码
  • 4,一般最多4分钟,就会进入苹果logo加载页
  • 5,加载完后,会出现苹果系统安装界面
  • 6,选择磁盘工具,全部,格式化(抹除)需要安装系统的盘为APFS格式(ssd推荐)或macOS扩展日志格式(机械硬盘推荐),系统盘分区格式选择gpt(guid)
  • 7,退出磁盘工具,选择 安装macos 项(此时建议断网)
  • 8,同意,选择刚刚格式化的磁盘分区,安装
  • 9,如果不卡读条,可能会安装2次(第一次安装完会自动重启,然后从step4的步骤2再选择一次,继续安装)
  • 10,安装成功,进入系统(基本设置,如地区,输入法,开机密码,apple-id登陆等)
  • 11,注意,此时请勿拔出u盘!!!

step5-配置独立启动

  • 下载 ,启动 clover configurator(下面简称cc)
  • 2 选择左侧 挂载分区,挂载u盘,打开分区(cc挂载教程
  • 3 将u盘中的EFI文件夹下的所有文件拷贝到macos系统盘的EFI文件夹下(不再需要u盘了)
  • 4 重启,设置开机第一启动项为macOS系统盘

mac 系统设置

php开发环境搭建

  • ide(phpstorm,pycharm自行下载安装)
  • 命令行设置(百度)
  • git,gitlab设置(百度)
  • homebrew 安装(/bin/zsh -c “$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)”)
  • nginx(brew install nginx)
  • php-fpm(自带,需配置)
  • php扩展安装(pecl install redis; echo ‘path/to/extension/pecl/redis.so’>>path/to/php.ini;php -m|grep redis;重启fpm)

常见问题说明

其他

  • q:安装苹果系统可以升级么?a:可以,我从10.14.6 mojave 通过系统自带的升级工具成功升级带 10.15.7 catalina ,但是存在风险,可能出现无法开机,黑屏等不兼容情况
  • q:性能如何?a:显卡配置ok的情况下,同时开启20+chrome浏览器页面,phpstorm,pycharm,钉钉,qq,微信,wps,运行流畅,约还剩3g内存,cpu负载极低(约10%)
  • q:待定

常见后端开发规范(PHP)

今天主管要求我们每个人都上交一份代码开发规范,我百度了一下,很多说的都不是特别好,要么就太基础,不符合实际的开发过程,所以下面结合我这几年的开发感悟,写一点,如有错误,请指正,一定虚心接受:

代码:

  1. 变量定义:小写,采用蛇形命名法,简明达意,避开系统关键词
  2. 方法名:小写,采用蛇形命名法,简明达意,避开系统函数
  3. 类名:首字母大写,采用蛇形命名法(或命名空间),避开系统类名
  4. Oop编程,少堆无脑传参func, 多写注释,避免过度优化和冗余
  5. 编码基本规则遵循psr1~4即可
  6. 遵循基本设计模式,逻辑向上(历史)兼容性
  7. 工具类统一封装,如curl,excel,qrcode等,方便他人
  8. 数据库常量定义:区分类型(sql,nosql),主从,读写,缓存,使用类型等
  9. 尽量使用composer管理包文件
  10. Web请求禁止循环查询,禁止无法命中主要索引的大表关联查询,禁止使用sql处理主要代码逻辑
  11. 注意安全性问题,如注入,提权,流量攻击等
  12. 数据结构
    1. 对外接口
      1. 基本输出格式json:【‘data’,‘msg’,‘code’】
      2. 文档:定义必要请求字段,类型及说明,请求头header,请求方式post/get,返回字段,类型,说明
      3. 可能需要定义:版本号,加密方式(jwt),签名等
    2. 对内部数据提供
      1. 语言内,框架内:方法调用
      2. 跨语言/框架:rpc调用(如使用hprose)
      3. 所有请求走内网,禁止数据公网裸奔
  13. 命令行脚本查询需评估查询sql效率与资源占用,酌情考虑执行时间,单次查询命中数据过多需分页处理
  14. 注意缓存,异步,队列等中间件的使用,提高系统健壮性
  15. 使用git,切分支协作开发和版本管理
  16. 开发需注意上线时依次考虑: 合并分支,解决冲突,生产建表/增改字段,常量增/改,脚本执行,依赖安装,常驻服务(重新)启动,最后才能发布新代码
  17. 尽量保持一致的开发风格,让任何人都能快速接手,定位,处理其他人的代码

数据库设计:

  1. 库名:小写,项目名_db结尾,如shop_db
  2. 表名:小写,tb_表名(蛇形命名),如tb_user_guest
  3. 字段名:小写,尽量两个单词组合使用(蛇形命名),避开系统关键字,函数
  4. 除主键,添加/更新时间等常用字段外,其余字段必须设置注释(comment)
  5. 单表字段尽量不超过30个,并根据业务给予适当的类型和长度
  6. 唯一性高,常用查询字段(=)需设置索引(一般单表设置不超过5个索引),联合索引遵循最左原则
  7. 部分危险操作前需备份数据库/表(如脚本,sql批量刷新数据库/表内容)
  8. Nosql,空间换时间,搜索服务处理mysql无法处理的问题
  9. 隔离权限,禁止生产和测试环境数据服务器可互访问,避免产生脏数据

服务器:

  1. 主机名:遵循 功能-区域-编号 命名规则
    1. 功能:app-线上环境,dev-开发环境,qa-测试环境,beta-预发布环境,cache-缓存,bi-服务数据,cdn-内容分发,vpn-代理网关,db-数据,lb-负载均衡,dns-域名解析等
    2. 区域:上海-01,北京-02,杭州-03等
    3. 编号:一号机-001,二号机-002
    4. 示例:app-03-001代表:生产环境-杭州-一号机,vpn-02-005,代表:代理服务器-北京-五号机
  2. 域名、二级域名设计
    1. 简明达意,参考1-1如业务型shop.shuidi.cn,系统型bi.shuidi.cn
    2. 区分公/内网,如公网shop.shuidi.cn,内网shop.i.shuidi.cn 多了一个i,内部请求走内网域名
    3. 区分功能,如shop.dev.shuidi.cn, 同理qa-测试,beta-预发,生产环境一般不做特别声明
  3. 规范软件安装目录,版本,用户,权限(755,644或特别提出需要的权限足以,一般不给777和root)
  4. 谨慎处理服务器版本/软件版本升级,防止出现兼容性问题
  5. 开启服务器定期自动备份
  6. 定期清除非必要的垃圾日志,文件,缓存内容
  7. 开发需通过vpn才能访问服务器,设置复杂密码
  8. 公网端口按需开放,不需要的禁用
  9. 离职人员回收权限

Bug/log track:

  1. 规范服务器日志输出目录,日志结构,保存时长
  2. 规范业务日志的基本输出内容,如ip,from,keyword,type,content等
  3. Bug report 影响级别:b0,b1,b2 ,响应级别:p0,p1,p2
  4. 软件开发,测试,发布流程,版本和周期