为laravel/lumen queue 配置 supervisor

近期工作中使用了 laravel框架中的队列服务,需要运行队列处理器 php /path/to/artisan queue:work --tries 3 命令

测试环境部署时需要:

  • 终止原有queue:work命令
  • 开启新queue:work命令

依照laravel教程(https://laravel-china.org/docs/laravel/5.6/queues/1395#supervisor-configuration)推荐使用进程管理工具 supervisor

Supervisor 安装

yum install supervisor  # centos
sudo apt-get install supervisor  # ubuntu

supervisord 是进程管理的服务端,常驻进程辅助干活
supervisorctl 是客户端,用来执行查看、加载等命令

Supervisor 配置

生成配置文件

echo_supervisord_conf > /etc/supervisord.conf

编辑配置文件

vim /etc/supervisord.conf

配置文件中配置除了最后两行,使用默认的就行。vim中使用G把光标跳到文件末尾,将最后一行修改为如下。

# file: /etc/supervisord.conf
...
[include]
files = /etc/supervisor/*.conf

创建文件夹

mkdir -p /etc/supervisor/

创建queue work启动脚本

vim /etc/supervisor/lumen_worker.conf

lumen_worker.conf 文件内容 注意修改项目artisan文件路径

[program:lumen_worker]
process_name=%(program_name)s_%(process_num)02d
command=php /path/to/artisan queue:listen --tries 3 --sleep 3
autostart=true
autorestart=true
user=root
numprocs=1
redirect_stderr=true
stdout_logfile=/tmp/lumen_worker.log

启动 supervisor

supervisord  
# 启动supervisord服务,默认使用/etc/supervisord.conf配置文件。
# 如果报错Error: Another program is already listening on a port that one of our HTTP servers is configured to use.说明已经启动,继续即可。

supervisorctl reload  # 重启 supervisord
supervisorctl reread  # 重新读取配置文件 supervisord
supervisorctl start lumen_worker:*  # 启动lumen_worker服务

supervisorctl restart lumen_worker:*  # 重启lumen_worker服务

启动后查看一下运行状态

supervisorctl status

应该能看到lumen_worker处于RUNNING状态:

[root@X /etc/supervisor]# supervisorctl status
lumen_worker:lumen_worker_00     RUNNING   pid 19317, uptime 0:01:49

自建 Laravel 的 Docker 开发环境

好久没写东西,今天说一说怎么自建一个 Laravel 运行的 Docker 环境。
市面上最出名的莫过于「laradock」https://github.com/laradock/laradock

未分类

Docker PHP development environment.
使用参考:http://laradock.io/

既然是「自建」,那我们可以参考这个,最小化满足 Laravel 运行的需要。

下面是我罗列出的基本条件:

  1. 软件:PHP 7.2、Nginx、MySQL、Composer、NPM or Yarn 等等;
  2. 使用国内镜像;使用国内镜像;使用国内镜像;
  3. 易于扩展使用,如随时可以切换 PHP 版本,或者 Apache 和 Nginx 切换使用。

Docker-Compose

要达到可扩展行,和「laradock」一样,使用 Docker-Compose 编排的方式,将核心的几个 image 组装在一起。

php-fpm

这里我们使用的是「DaoCloud」加速镜像 —— 7.2-fpm-alpine。

该版本既用 PHP 7.2 版本,而且 alpine 最小化系统,可以基于此,安装环境需要的额外工具:如,composer、nodejs、python、yarn 等。
FROM daocloud.io/php:7.2-fpm-alpine

MAINTAINER coding01 <[email protected]>

RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

RUN apk add --no-cache --virtual .build-deps 
        $PHPIZE_DEPS 
        curl-dev 
        imagemagick-dev 
        libtool 
        libxml2-dev 
        postgresql-dev 
        sqlite-dev 
    && apk add --no-cache 
        curl 
        git 
        imagemagick 
        mysql-client 
        postgresql-libs 
    && pecl install imagick 
    && docker-php-ext-enable imagick 
    && docker-php-ext-install 
        curl 
        iconv 
        mbstring 
        pdo 
        pdo_mysql 
        pdo_pgsql 
        pdo_sqlite 
        pcntl 
        tokenizer 
        xml 
        zip 
    && curl -s https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin/ --filename=composer 
    && apk del -f .build-deps

# 修改 composer 为国内镜像
RUN composer config -g repo.packagist composer https://packagist.laravel-china.org

# install prestissimo
RUN composer global require "hirak/prestissimo"

# install laravel envoy
RUN composer global require "laravel/envoy"

#install laravel installer
RUN composer global require "laravel/installer"

RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

RUN apk update && apk add -u nodejs libpng-dev python

ENV PATH /root/.yarn/bin:$PATH

RUN apk update 
  && apk add curl bash binutils tar 
  && rm -rf /var/cache/apk/* 
  && /bin/bash 
  && touch ~/.bashrc 
  && curl -o- -L https://yarnpkg.com/install.sh | bash 
  && yarn config set registry 'https://registry.npm.taobao.org' 
  && npm install -g cnpm --registry=https://registry.npm.taobao.org

WORKDIR /var/www

其中安装 alpine 系统插件,我们使用 mirrors.aliyun.com 阿里云镜像。

php:7.2-fpm-alpine 具体使用,可以参考:dashboard.daocloud.io/packages/01…

nginx

我们使用 nginx,主要是将网站的配置文件载入 nginx 中。

FROM daocloud.io/nginx:1.13-alpine

MAINTAINER coding01 <[email protected]>

ADD vhost.conf /etc/nginx/conf.d/default.conf

WORKDIR /var/www

剩下就是连接这些 images。最后看看 docker-compose.yml 文件内容:

version: '2'
services:

  # The Application
  app:
    build:
      context: ./
      dockerfile: app.dockerfile
    working_dir: /var/www
    volumes:
      - ../:/var/www
    environment:
      - "DB_PORT=3306"
      - "DB_HOST=database"
      - "REDIS_HOST=redis"
      - "REDIS_PORT=6379"

  # The Web Server
  web:
    build:
      context: ./
      dockerfile: web.dockerfile
    working_dir: /var/www
    volumes_from:
      - app
    ports:
      - 8080:80

  # The Database
  database:
    image: daocloud.io/mysql:5.7.4
    volumes:
      - dbdata:/var/lib/mysql
    environment:
      - "MYSQL_DATABASE=homestead"
      - "MYSQL_USER=homestead"
      - "MYSQL_PASSWORD=secret"
      - "MYSQL_ROOT_PASSWORD=secret"
    ports:
        - "3306:3306"

  redis:
    image: daocloud.io/library/redis:4.0.10-alpine
    command: redis-server --appendonly yes

volumes:
  dbdata:

测试一遍

创建 Laravel 项目

composer create-project laravel/laravel demo

注:为了做测试,可以将 vendor 文件夹和 composer.lock 文件删除。

git clone

在 demo 项目相同文件夹下,git clone 我们自建的「laraveldocker」:
git clone https://github.com/fanly/laraveldocker.git

修改 docker-compose.yml

将 docker-compose.yml 文件的路径执行我们的项目:

app:
    build:
      context: ./
      dockerfile: app.dockerfile
    working_dir: /var/www
    volumes:
      - ../:/var/www

build

在 laraveldocker 下执行构建命令:

docker-compose up

未分类

整个速度还是蛮快的

未分类

接下来进入容器内

docker exec -it de075c525528 bash

我们看看安装插件的效果:

未分类

使用的是 https://packagist.laravel-china.org 国内镜像。

注:该镜像是由 Laravel China 社区联合 又拍云 与 优帆远扬 共同合作推出的公益项目,旨在为广大 PHP 用户提供稳定和高速的 Composer 国内镜像服务。

值得推荐使用

参考:laravel-china.org/topics/4484…

使用 yarn 或者 cnpm 安装插件:

未分类

生成 Laravel key secret:

cp .env.example .env
php artisan key:generate

Application key [base64:4A7VK6MEX7FakPLDSLji97kz/nyWUAWhW4wYn3gefsY=] set successfully.

运行下看看效果吧:

未分类

我们接下来看看数据库连接吧,修改 .env:

DB_CONNECTION=mysql
DB_HOST=database
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

我们使用 php artisan make:auth 来生成布局、注册和登录视图以及所有的认证接口的路由。同时它还会生成 HomeController 来处理应用的登录请求。使用 php artisan migrate 来载入数据。

未分类

我们看看数据表:

未分类

至此,说明我们连接 MySQL 数据库 OK.

总结

在学习过程中,使用别人做好的 Dockerfile,虽可以直接拿来使用,但如果能自给自足,那最好不过了。

通过自建 docker 开发环境过程中,也能让自己学到更多。接下来还会不断完善,最小化满足开发需要。

代码已放在 github 上,欢迎参考和提出 issue:

github.com/fanly/larav…

ubuntu上安装composer和laravel

ubuntu上安装PHP框架laravel。

一、准备

1、服务器要求

laravel框架对系统的要求可以用Laravel Homestead 虚拟机满足,如果不使用Homestead作为开发环境需要服务器符合以下要求:

  • PHP >= 7.0.0

  • PHP OpenSSL 扩展

  • PHP PDO 扩展

  • PHP Mbstring扩展

  • PHP Tokenizer 扩展

  • PHP XML 扩展

2、安装PHP扩展

未分类

3、安装配置composer

3.1 安装composer

依次输入下面命令安装composer

php -r "copy('https://install.phpcomposer.com/installer','composer-setup.php');"下载安装脚本 - composer-setup.php - 到当前目录。
php composer-setup.php执行安装过程
php -r "unlink('composer-setup.php');"删除安装脚本

全局安装

sudo mv composer.phar /usr/local/bin/composer

安装完以后 composer -v

未分类

说明安装成功了。

3.2 配置composer

修改composer的全局配置文件

composer config -g repo.packagist composer https://packagist.phpcomposer.com

然后执行 composer selfupdate

二、安装配置laravel

安装laravel

composer global require "laravel/installer=~1.1"

配置laravel

export PATH="~/.config/composer/vendor/bin:$PATH" 添加环境变量

并填加在 /etc/bash.bashrc 执行 source ~/.bashrc 让环境变量立即生效

然后就去 /var/www 新建一个laravel项目

laravel new laravel 在laravel new的时候会报几个文件没有权限,直接给777权限就OK了。

修改laravel目录权限

sudo chown -R :www-data /var/www/laravel
sudo chmod -R 775 /var/www/laravel/storage

然后laravel就弄好了,跑起来吧。

配置laravel的nginx站点

server{}配置

server{
        #端口配置
        listen 80;
        #域名配置
        server_name laravel.cc;

        index index.php index.html index.htm;
        #站点配置到public
        root /data/wwwroot/laravel.cc/public;
      #日志记录
        access_log /data/logs/nginx.laravel.cc.log access;
        error_log /data/logs/nginx.laravel.cc.error debug;
     #静态文件配置
        location ~ .*.(jpg|jpeg|gif|png|bmp|css|js|swf|txt|ttf|woff|ico)$ {
                expires 7d;
                break;
        }

        location / {
         #重点区
                try_files $uri $uri/ /index.php?$query_string;
                index index.php index.html index.htm;
        }
        #静态文件配置
        location /logs {
                autoindex on;
                autoindex_exact_size off;
                autoindex_localtime on;
                break;
        }
        #处理php配置
        location ~ ".php$" {
                include fastcgi_params;
                fastcgi_index index.php;
                #在nginx.conf配置server_mango
                fastcgi_pass server_mango;
        }
}

http下的server_mango配置
  

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    log_format access '$remote_addr [$time_local] "$http_host" "$request" "$status $body_bytes_sent" "$http_referer" "$http_user_agent" "$http_x_forwarded_for"';
    #access_log  logs/access.log  main;

    sendfile        on;
    tcp_nopush     on;
    server_tokens       off;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    gzip on;
    gzip_min_length  5k;
    gzip_buffers     4 16k;
    #gzip_http_version 1.0;
    gzip_comp_level 3;
    gzip_types       text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
    gzip_vary on;
    #重点区与server{}中的处理php应用到的
    upstream server_mango {
        server 127.0.0.1:9000;
    }
    #加载vhost下的.conf后缀所有文件
    include /usr/local/nginx/conf/vhost/*.conf;
}

使用 Docker 搭建 Laravel 本地环境

Laravel 官方提供 Homestead 和 Valet 作为本地开发环境,Homestead 是一个官方预封装的 Vagrant Box,也就是一个虚拟机,但是跟 docker 比,它占用体积太大,启动速度慢,同时响应速度很慢,现在有了 docker 这种更好的方式,可以轻松方便的搭建整套 PHP 开发环境。

本文就介绍如何使用 docker 搭建 Laravel 本地环境。

安装 docker

首先安装 docker。

克隆 laradock

laradock 官方文档:http://laradock.io/

laradock github:https://github.com/laradock/laradock

laradock 是一个包含全功能用于 docker 的 PHP 运行环境,使用 docker-compose 方式部署。(特别说明:它不仅用于 Laravel 环境搭建,而且支持所有其他 PHP 框架,它就是一整套 PHP 的环境。)

部署 PHP 环境

1. 克隆 laradock

git clone https://github.com/Laradock/laradock.git

2. 创建环境变量文件

cp env-example .env

3. 直接用 docker-compose 运行需要启用的服务,如:

docker-compose up -d nginx mysql redis beanstalkd

这样就启动了所需的 PHP 运行环境,php-fpm 默认会运行,所以不需要指定。

未分类

Laravel 配置文件

Laravel 配置文件需要注意的问题是,在 .env 文件中,mysql 和 redis 的地址需填写成这样,而不是 ip 地址形式:

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=tanteng.me
DB_USERNAME=root
DB_PASSWORD=root

REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379

注意代码中高亮部分。

Nginx 配置

在本地通过域名方式访问站点,要将 host 中域名绑定到本地,同时还需要增加 nginx 配置。

未分类

如图,在 laradock 项目的 nginx 文件夹下的 sites 目录下添加配置文件即可。

执行 composer

执行 composer 等操作,需要进入到 workspace 容器中进行,使用命令:

docker-compose exec workspace bash

进入到 workspace 容器,就可以进行 compose 命令等操作了。

具体使用上的问题请参加 laradock 官方文档,上面都有说明。

laravel 守护进程Supervisor的配置

安装Supervisor

Supervisor是Linux系统中常用的进程守护程序。如果队列进程queue:work意外关闭,它会自动重启启动队列进程。在Ubuntu安装Supervisor 非常简单:

sudo apt-get install supervisor

注:如果自己配置Supervisor有困难,可以考虑使用Laravel Forge,它会为Laravel项目自动安装并配置Supervisor。

配置Supervisor

Supervisor配置文件通常存放在/etc/supervisor/conf.d目录,在该目录中,可以创建多个配置文件指示Supervisor如何监视进程,例如,让我们创建一个开启并监视queue:work进程的laravel-worker.conf文件:

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/forge/app.com/artisan queue:work sqs --sleep=3 --tries=3
autostart=true
autorestart=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log

在本例中,numprocs指令让Supervisor运行8个queue:work进程并监视它们,如果失败的话自动重启。配置文件创建好了之后,可以使用如下命令更新Supervisor配置并开启进程:

启动Supervisor

当你成功创建配置文件后,你需要刷新Supervisor 的配置信息:

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*

你可以通过Supervisor官方文档获的更多信息: http://supervisord.org/index.html