Write the Code. Change the World.

分类目录
7月 01

通常情况下,使用构建的命令就可以关闭对应的服务。可有时候 pid 被删了后,程序逻辑就关闭不了服务了。这个时候,就得用命令来关。

通常方式

laravel 中 swoole 为例

# 停止
php artisan swoole:action stop

# 启动
php artisan swoole:action start

当 pid 文件删除或被改后,就 stop 不了了。

命令方式

# 先查看端口对应的进程 id
netstat -tunlp|grep 9400

### 结果 tcp        0      0 0.0.0.0:9400            0.0.0.0:*               LISTEN      2750/php

# 再 kill 进程 id 就完事了
kill -9 2750

# 查看进程信息 (当然在 kill 之前查看)
ps -ef|grep 2750

参考

https://www.cnblogs.com/moy25/p/8668432.html

6月 05

想做一个类似腾讯云和58同城的个人认证功能,就是输入身份证号码,然后给微信支付一分钱,这个支付只能这个身份对应的微信支付,不然会提示“您的身份资料和账户资料不匹配,请核实后再发起支付”,有人做过类似的么?公开的微信支付api没看到能做这个设置,还是说这个是微信支付的内部api?问了微信支付的技术支持,没有确定的回复,只是说可能是没有开放的接口。

https://www.zhihu.com/question/270112298

https://blog.csdn.net/weixin_42389328/article/details/84587661

https://developers.weixin.qq.com/community/develop/doc/0006029dd28020042ca8e52c856000?highLine=%25E5%25AE%259E%25E5%2590%258D%25E8%25AE%25A4%25E8%25AF%2581

https://max.book118.com/html/2017/0803/125839734.shtm

http://kf.qq.com/faq/171219EfYVfI171219EbEfY7.html

区别对待呀。

5月 20

centos7安装supervisor

方式一: yum 安装

yum install epel-release

yum install supervisor

systemctl enable supervisord # 开机自启动

systemctl start supervisord # 启动supervisord服务

systemctl status supervisord # 查看supervisord服务状态

ps -ef|grep supervisord # 查看是否存在supervisord进程

方式二: apt-get 安装

apt-get install supervisor

操作

systemctl stop supervisord
systemctl start supervisord
systemctl status supervisord
systemctl reload supervisord
systemctl restart supervisord

使用之前

cat /etc/supervisord.conf

在最底部,会看到:

files = supervisord.d/*.ini

这个会调用 supervisord.d 目录下的配置文件。所以我们的配置文件都建在 supervisord.d 下。

使用

vim laravel-worker.ini

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /alidata/www/binkeke/binkeke.com/artisan queue:work redis --sleep=3 --tries=3
autostart=true
autorestart=true
user=nginx
numprocs=8
redirect_stderr=true
stdout_logfile=/alidata/www/kwva/supervisord/log.txt

stdout_logfile 文件一定要先创建好哈。

参考

https://blog.csdn.net/donggege214/article/details/80264811

https://blog.csdn.net/kkevinyang/article/details/80539940?utm_source=blogxgwz3

5月 08

官方文档很美好,执行 * * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1 就可以启动每分钟调用一次的调度了。

但是,你会发现该调度只执行一次。

然后你使用 crontab -l 发现空空如也。

这个时候怎么办呢。

操作一

小伙伴也有方法。说 php 路径,文件路径没写成绝对路径,需要有这样的操作。

# 找到 php 的位置
whereis php

# pwd 找到项目的位置

# 然后使用绝对路径执行
* * * * * /usr/bin/php7.3 /home/vagrant/code/work/zeipan.com/artisan schedule:run >> /dev/null 2>&1

但是,依然不行。当然也有人行了。

https://learnku.com/laravel/t/5032/ubuntu1604crontab-timed-tasks-are-not-held

操作二

环境变量等问题

echo $PATH;

# 或
env > /tmp/env.output
cat /tmp/env.output 
# 找到其中的 PATH 的值。

这样操作,感觉不相符。小伙伴也说了,使用了绝对路径可以不用管环境变量的。
https://learnku.com/articles/18697

个人测试有效的方法

依然按照操作一操作。只是,需要先生成一个 cron.txt 文件。在这个文件中,放入之前的命令。然后执行 crontab cron.txt 即可。

vim cron.txt

# 添加内容
* * * * * /usr/bin/php7.3 /home/vagrant/code/work/zeipan.com/artisan schedule:run >> /dev/null 2>&1

# :wq 保存退出

crontab cron.txt

# 查看任务
crontab -l

# 停止所有定时任务
crontab -r 

这样就美美解决了。

https://www.cnblogs.com/lamp01/p/6864258.html

4月 20

当下 (2019-04-20)最新的稳定版本的 nginx 版本是 1.14.2。下边来进行编译安装该版本,使其支持 http2 以及 TLS1.3 还有 Brotli 。 都是好东西,可以慢慢去了解。

安装依赖包

### 先更新包,软件,系统内核
yum update 

安装 gcc

安装 nginx 源码进行编译,编译依赖 gcc 环境,需要安装gcc: yum install gcc-c++

安装 pcre-devel

PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。

yum install  pcre pcre-devel

zlib 安装

nginx 使用 zlib 对 http 包的内容进行 gzip。可是,不是用 Brotli 么。两个都装,装了也没事。gzip 编译安装来个。如果不编译,使用 yum 安装,版本达不到要求。

# 版本没要求可以这样
yum install zlib zlib-devel

先安装 cmake
https://blog.vini123.com/289

再安装 zlib
https://blog.vini123.com/299

再安装 bzip2
https://blog.vini123.com/300

最后安装 libzib
https://blog.vini123.com/290

OpenSSL 安装

OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。

https://blog.vini123.com/301

安装 ngx_brotli

cd /opt
git clone https://github.com/eustas/ngx_brotli.git
cd ngx_brotli
git submodule update --init --recursive

可以看这里: https://blog.vini123.com/302

增加用户组

我们创建一个新的用户组和用户来运行服务,这样可以把nginx和root分开,保证nginx不具备root权限。但是,我们并不希望nginx成为一个真实的可以登陆到远程进行操作的用户,所以,我们并不给它创建home目录,在useradd的时候,用-M参数:

 groupadd www
 useradd -g www -M www

-g参数为nginx用户指定了一个组。-M参数保证其不自动生成home目录。

但通过上面的用户创建之后,www 用户可以通过设置一个密码登陆到服务器,这个不是我们想要的,我们禁用它的 ssh 登陆权限.禁止用户登陆也很方便,只需要修改配置文件中有关用户和用户组的信息即可。

vi /etc/passwd

找到www,将后面的/bin/bash改为/sbin/nologin即可。

下载安装 nginx

官网:http://nginx.org/en/download.html 当前最新稳定版本 1.14.2

cd /usr/local/src

wget http://nginx.org/download/nginx-1.14.2.tar.gz

tar -xzvf nginx-1.14.2.tar.gz

cd nginx-1.14.2 

配置编译

./configure \
--user=www \
--group=www \
--prefix=/alidata/service/nginx \
--pid-path=/alidata/service/nginx/run/nginx.pid \
--with-http_stub_status_module \ ## 监控模块,nginx自带,但默认不安装
--with-threads \
--with-file-aio \
--with-pcre-jit \
--with-http_ssl_module \ ## 开启 HTTPS 支持
--with-http_v2_module \ ## 开启 HTTP/2 
--with-http_gzip_static_module \ ## 开启 GZip 压缩
--with-http_sub_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_realip_module \
--with-http_addition_module \
--with-stream \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
--with-stream_realip_module \
--with-http_slice_module \
--with-pcre \
--with-openssl=/usr/local/src/openssl-1.1.1b/  \ ## 指定单独编译入 OpenSSL 的源码位置
--with-openssl-opt=enable-tls1_3 \ ## 开启 TLS 1.3 支持
--add-module=/usr/local/src/ngx_brotli/ ## 编译入 ngx_BroTli 扩展

如果有问题,将这些配置写成一行。没有问题会提示:


Configuration summary + using threads + using system PCRE library + using OpenSSL library: /usr/local/src/openssl-1.1.1b + using system zlib library nginx path prefix: "/alidata/service/nginx" nginx binary file: "/alidata/service/nginx/sbin/nginx" nginx modules path: "/alidata/service/nginx/modules" nginx configuration prefix: "/alidata/service/nginx/conf" nginx configuration file: "/alidata/service/nginx/conf/nginx.conf" nginx pid file: "/alidata/service/nginx/run/nginx.pid" nginx error log file: "/alidata/service/nginx/logs/error.log" nginx http access log file: "/alidata/service/nginx/logs/access.log" nginx http client request body temporary files: "client_body_temp" nginx http proxy temporary files: "proxy_temp" nginx http fastcgi temporary files: "fastcgi_temp" nginx http uwsgi temporary files: "uwsgi_temp" nginx http scgi temporary files: "scgi_temp"

好了,现在开始编译安装。

make && make install

安装完毕后,启动 nginx

/alidata/server/nginx/sbin/nginx 
ps -ef|grep nginx

# 查看编译的模块
/alidata/service/nginx/sbin/nginx -V

配置开机自启动

切换到 /lib/systemd/system/ 目录,创建 nginx.service 文件 vi nginx.service
编辑 nginx.service

[Unit]
Description=nginx 
After=network.target 

[Service] 
Type=forking 
ExecStart=/alidata/service/nginx/sbin/nginx
ExecReload=/alidata/service/nginx/sbin/nginx reload
ExecStop=/alidata/service/nginx/sbin/nginx quit
PrivateTmp=true 

[Install] 
WantedBy=multi-user.target

保存,并退出。再执行 systemctl enable nginx.service 激活重启自启动功能

systemctl enable nginx.service

systemctl start nginx.service #启动nginx
systemctl stop nginx.service #结束nginx
systemctl restart nginx.service #重启nginx

curl 127.0.0.1 查看欢迎页面。或输入外网 ip,如果外网 ip 访问不到,可能是 80端口没开放。去开放端口。比如去阿里云添加安全组,再重启 nginx。

参考

https://www.mf8.biz/nginx-install-tls1-3/

4月 14

owasp 安全测试,其中一项就是关于请求头中的 servers 信息和 x-powered-by 信息要隐藏。该怎么隐藏呢。servers 对应的是 nginx 或 apache 的信息,x-powered-by 可能是 php 的版本号。

如下图:

用户,可以很方便的看到你服务器环境的版本信息。想要隐藏只需下边这样操作即可。

隐藏 servers

nginx

vim nginx.conf

# http 里边添加下边的设置

server_tokens off;

然后重启 nginx 。 ../sbin/nginx -s reload

隐藏 php 版本

# 找到 php.ini 的位置
php -i|grep php.ini

vim php.ini

# 设置下边的值即可。即将 on 改成 off
expose_php = Off

然后重启 php 。 /etc/init.d/php-fpm restart

4月 02

想做聊天这样的app或页面,就会使用到长连接。websocket 是一种方式。服务方可以用 nodejs 这些。对于 php,还是使用 workman 或 swoole 比较方便。这里就记录下 laravel 框架使用 swoole 的过程。

编译安装 swoole 扩展

http://pecl.php.net/package/swoole
当前,最新版本是 4.31。所有一切都是新的,服务器是新的,装的环境也是最新的。所以没有心理压力,都用最新的。

cd /usr/local/src

wget http://pecl.php.net/get/swoole-4.3.1.tgz

tar -xzvf swoole-4.3.1.tgz

cd swoole-4.3.1

phpize

# 对 ssl 的支持。这个还是比较重要的
./configure --enable-openssl 

make && make install

make test

vim /alidata/service/php/etc/php.ini

# 尾部追加
extension=swoole.so

# 重启 php
/etc/init.d/php-fpm restart

# 查看扩展
# php -m|grep swoole

继续阅读

2月 20

以前,还需要写中间件来处理邮箱是否验证过了。5.7 开始,Laravel 自带了邮箱验证的相关字段和功能。

以此基础,从零开始吧。

生成注册登录

php artisan make:auth

修改执行以下操作

修改 User 模型,使其实现 MustVerifyEmail 接口

class User extends Authenticatable implements MustVerifyEmail

启用与邮箱验证相关的路由(验证邮箱页面、重发验证邮件页面等),修改 routes/web.php

Auth::routes(['verify' => true]);

Laravel 自带了一个名为 verified 的中间件,如果一个未验证邮箱的用户尝试访问一个配置了 verified 中间件的路由,Laravel 就会提示该用户邮箱未激活。修改路由,加了一个中间件,测试看看。

Route::get('/', 'PageController@home')->name('home')->middleware('verified');

访问首页,发现会跳转到验证邮箱的页面了。证明邮箱验证生效。

看看 users 表,我们发现和以前比,多了一个 email_verified_at 字段。

激活邮箱

我们可以临时使用 MailHog 来模拟邮箱激活。

MailHog 是 Homestead 自带的一个组件,可以很方便地调试发送邮件。直接使用端口号 8025 就可以访问到。那么,怎么让其接受到邮件呢。修改 .env 文件。将 host 和 port 修改成下边的即可。

MAIL_HOST=127.0.0.1
MAIL_PORT=1025

修改完毕,刷新 mailhog 页面。点击首页链接,会跳转到验证页面。发送验证,查看邮箱,点击激活。再访问首页是不是就可以访问了。再看看数据库,会发现 email_verified_at 字段以及有值(日期时间)了。