花式搭建 Laravel 运行环境线上 LNMP、本地 DNMP

  • 今天撸了台7$一年的服务器,当时心里美滋滋,然后就被教育了,卡和慢,主要是不想备案就先凑合.

算了现在我们从零开始部署一个laravel-blog,目标是域名访问

这个服务商真的contOS7 真的难用7.5的系统强制 2.6的内核

在2.6内核前提下 我们使用yum 安装LNMP。
docker组一个NMP的使用,我换虚拟机搭本地环境
查看内核版本

uname -sr Linux 2.6.32-042stab132.1

更换yum 源

参考:

  • mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup备份

  • wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 添加阿里源

  • yum clean all 清除缓存

  • yum makecache 生成缓存

  • yum update -y更新

  • 好慢 心态有点崩,为什么就管不住这个手

  • yum install vim && yum install net-tools习惯了vim 加上一个网络分析小工具

    Nginx

    官网yum安装参考

  • vi /etc/yum.repos.d/nginx.repo 创建yum源文件

    [nginx]
    name=nginx repo
    baseurl=http://nginx.org/packages/OS/OSRELEASE/$basearch/
    gpgcheck=0
    enabled=1
  • 根据提示修改后 添加

    [nginx]
    name=nginx repo
    baseurl=http://nginx.org/packages/centos/7/$basearch/
    gpgcheck=0
    enabled=1

    nginx配置介绍

  • yum list|grep nginx 查看yum源中的nginx

    nginx.x86_64                             1:1.14.0-1.el7_4.ngx           nginx   
    nginx-debug.x86_64                       1:1.8.0-1.el7.ngx              nginx   
    nginx-debuginfo.x86_64                   1:1.14.0-1.el7_4.ngx           nginx   
    nginx-module-geoip.x86_64                1:1.14.0-1.el7_4.ngx           nginx   
    nginx-module-geoip-debuginfo.x86_64      1:1.14.0-1.el7_4.ngx           nginx   
    nginx-module-image-filter.x86_64         1:1.14.0-1.el7_4.ngx           nginx   
    nginx-module-image-filter-debuginfo.x86_64
                                         1:1.14.0-1.el7_4.ngx           nginx   
    nginx-module-njs.x86_64                  1:1.14.0.0.2.4-1.el7_4.ngx     nginx   
    nginx-module-njs-debuginfo.x86_64        1:1.14.0.0.2.4-1.el7_4.ngx     nginx   
    nginx-module-perl.x86_64                 1:1.14.0-1.el7_4.ngx           nginx   
    nginx-module-perl-debuginfo.x86_64       1:1.14.0-1.el7_4.ngx           nginx   
    nginx-module-xslt.x86_64                 1:1.14.0-1.el7_4.ngx           nginx   
    nginx-module-xslt-debuginfo.x86_64       1:1.14.0-1.el7_4.ngx           nginx   
    nginx-nr-agent.noarch                    2.0.0-12.el7.ngx               nginx   
    pcp-pmda-nginx.x86_64                    3.12.2-5.el7                   base  
  • yum install nginx -y 安装nginx

  • systemctl enable nginx 开机自启nginx

  • systemctl start nginx 启动nginx

  • 然后输入IP到浏览器访问成功

  • 默认配置位置 /etc/nginx/nginx.conf /etc/nginx/conf.d/default.conf


PHP7.2

  • 我们知道yum源是没有7.2的包的但是PHP官网似乎没有yum安装教程,编译的有但是不想做
  • 当当当当这个时候出现了一位好心人 传送门虽然是全英文也很好懂
    拉取php7.2的包
    yum install epel-release
    rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
  • 安装PHP和扩展
    yum install mod_php72w php72w-opcache php72w-common php72w-gd php72w-mbstring php72w-mysql php72w-xml php72w-cli php72w-fpm php72w-devel -y
  • 配置文件位置/etc/php.ini
  • 然后php -m就可以查看装了哪些扩展 嗯 基本用的都开了
  • systemctl start php-fpm 虽然是一台机器但我们还是用php-fpm模式 也可以使用.sock的模块加载模式 理论上会快一些
  • systemctl enable php-fpm 开机自启
结合php-fpm与nginx

vi /etc/nginx/conf.d/default.conf

设置root路径 和转发给php-fpm处理

    location / {
        root   /data/www/;
        index index.php  index.html index.htm;
    }

    location ~* \.php$ {
        fastcgi_index   index.php;
        fastcgi_pass    127.0.0.1:9000;
        include         fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
    }
  • nginx -t语法检测 nginx -s reload 热重启
  • mkdir -p /data/www 递归创建根目录
  • touch /data/www/index.php 创建空文件index.php
  • echo '<?php phpinfo();' >> /data/www/index.php
  • 发现file not found 404错误
    • 原因大概和我新建了文件夹有关导致 $document_root 这个变量没指向我在的位置
      fastcgi_param   SCRIPT_FILENAME    /data/www$fastcgi_script_name;

      然后 nginx -s reload 就OK了

mysql5.6

  • 由于contos7 默认使用mariadb
  • rpm -qa|grep -i mariadb 查看源
    • mariadb-libs-5.5.60-1.el7_5.x86_64
  • rpm -qa|grep mariadb|xargs rpm -e --nodeps 卸载源
  • rpm -qa|grep -i mariadb 再次查看就为空了
    安装mysql
  • 下载安装包文件。
    • wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
  • rpm -ivh mysql-community-release-el7-5.noarch.rpm 安装包
  • yum repolist all | grep mysql 列出可安装mysql
mysql-connectors-community/x86_64 MySQL Connectors Community      enabled:    65
mysql-connectors-community-source MySQL Connectors Community - So disabled
mysql-tools-community/x86_64      MySQL Tools Community           enabled:    69
mysql-tools-community-source      MySQL Tools Community - Source  disabled
mysql55-community/x86_64          MySQL 5.5 Community Server      disabled
mysql55-community-source          MySQL 5.5 Community Server - So disabled
mysql56-community/x86_64          MySQL 5.6 Community Server      enabled:   412
mysql56-community-source          MySQL 5.6 Community Server - So disabled
mysql57-community-dmr/x86_64      MySQL 5.7 Community Server Deve disabled
mysql57-community-dmr-source      MySQL 5.7 Community Server Deve disabled
  • 默认mysql5.6可安装 yum install mysql-server -y
  • systemctl start mysqld mysql开启
  • systemctl enable mysqld 默认开机自启

mysql增加密码 和允许远程登录

#最开始没有密码
mysql -u root
use mysql;
update user set password=PASSWORD("xxxxxxxxx") where User = 'root';
flush privileges;
# root密码设定完成

GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "xxxxxxxxx";
# 允许远程root登录完成

git

yum install git -y
在、/data/www/下从我的github仓库中拉取blog 代码
git clone https://github.com/whyiyhw/hello-laravel.git
mv hello-laravel/ blog/ 更改文件名

composer安装

  • 下载安装脚本 - composer-setup.php - 到当前目录
    php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"
  • 执行安装过程。
    php composer-setup.php
  • 删除安装脚本
    php -r "unlink('composer-setup.php');"
  • 添加到全局
    mv composer.phar /bin/composer
  • 更换镜像到国内
    composer config -g repo.packagist composer https://packagist.phpcomposer.com

laravel运行

cd /data/www/blog/
cp .env.example .env

vim .env
#修改
DB_PORT=3306
DB_DATABASE=blog
DB_USERNAME=root
DB_PASSWORD=23333
CACHE_DRIVER=array
:wq

#更新组件
composer update
#新建秘钥
php artisan key:generate

设置域名解析

修改nginx vim /etc/nginx/conf.d/default.conf

    server_name  www.blogxy.cn;

    location / {
        root   /data/www/blog/public;
        try_files $uri $uri/ /index.php?$query_string;
        index index.php  index.html index.htm;
    }

   location ~ \.php(.*)$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
            fastcgi_param  SCRIPT_FILENAME  /data/www/blog/public$fastcgi_script_name;
            fastcgi_param  PATH_INFO  $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
            include        fastcgi_params;
        }

nginx -t && nginx -s reload 检测热重启
chmod -R 777 storage/ 赋予运行目录执行权限

设置https

免费https网站lets-encrypt

# 我选择脚本自动安装
yum -y install yum-utils

yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional

yum install python2-certbot-nginx -y

certbot --nginx #安装提示一步步走下去就OK

由于一次只有三个月,设定自动脚本来更新证书

yum install crontabs 一般都有crontab 没有就自己安装
systemctl enable crond 开机自启
systemctl start crond 开启定时任务
crondtab -e 编辑定时任务

0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew

  • 这样就完成了https 自动更新

安装swoole扩展

  • 也许以后会加一些其他功能测试来加速laravel 先把swoole安装好
  • swoole安装要求
    Linux 内核版本 2.3.32 以上
    gcc4.4 以上版本或者clang
    4.x版本起需要gcc-4.8或更高版本, 编译失败请先尝试升级gcc
    编译为 libswoole.so 作为 C/C++ 库时需要使用 cmake-2.4 或更高版本
  • 内核版本 uname -sr 看出来为2.6
  • gcc 不存在 yum install gcc -y
  • yum install cmake -y
  • yum install pcre-devel make autoconf -y
  • yum install gcc-c++ -y
  • 拉取swoole代码 git clone https://github.com/swoole/swoole-src.git
  • 由于不想再装扩展了 就先编译一个基础版本 swoole
    cd swoole
    phpize
    ./configure
    make && make install
  • 注意提示信息每台主机差的配置都不一样,我这个算是很全了,根据差的配置安装就OK
    Installing shared extensions:     /usr/lib64/php/modules/
    Installing header files:          /usr/include/php/
  • 安装之后会有扩展安装位置的提示
  • 有根据我们之前 phpinfo的信息 知道 php.ini 并不是 扩展的位置所在真实的位置在/etc/php.d/
  • cd /etc/php.d && vim swoole.ini
  • 添加 extension=swoole.so
  • 重启 php-fpm systemctl restart php-fpm

    优化nginx 压缩静态文件

  • 在对应的server 下面增加
    gzip on;
        gzip_min_length  1k;
        gzip_buffers     4 16k;
        gzip_http_version 1.1;
        gzip_comp_level 2;
        gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss image/png image/jpeg image/jpg;
        gzip_vary on;
        gzip_proxied   expired no-cache no-store private auth;
        gzip_disable   "MSIE [1-6]\.";
    访问www.blogxy.cn 会发现快了一点点...

    大功告成一半

    接下来 搭建本地虚拟机环境 使用dokcer加 lnmp镜像 总算不用一卡一卡了

  • 这里我默认你有用virtualBoxbox 或是 VMware装好了 contOS7 这个系统内外网互动
  • 没有网线的情况下 virtualBox 用的很难受
    • virtualBox 实现内外网互通
      • 最主要的就是理解网卡模式
      • NAT 只能访问外网,不能被主机本身访问
      • Host-Only 只能被局域网访问 不能访问外网
      • 内外互通实现就是开两张网卡连接的是host-only 连接外网使用另一张 还需要 (端口转发?不确定)

起步 安装

  • yum update
  • 我使用的是contOS7的源所以不用更换源
  • yum intsall -y docker && systemctl enable docker
  • 安装并开机自启docker
  • 我这里选择 /var/www/html 作为根目录

更换镜像

  • 有阿里云账号就能使用上面的镜像

  • https://cr.console.aliyun.com/#/accelerator

  • 上面是网址可以拿到自己专属的镜像加速

  • vim /etc/docker/daemon.json

  • 修改成自己的镜像加速

    "registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]
  • systemctl daemon-reload

  • systemctl restart docker

安装并使用mysql镜像

  • docker pull mysql:5.6
  • 不用5.7/8.0的原因是不用设定远程账户~懒一步是一步
  • docker run -d -p 3307:3306 --name mysql56 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6
  • -d 守护进程 -p端口转发 -e 设定初始化密码
  • --name 设定容器 名
  • 进行连接测试 成功 注意端口为之前设定的3307

安装并使用redis镜像

  • docker pull redis:3.2
  • docker run -d -p 6379:6379 --name redis32 redis:3.2 redis-server

安装并使用php-fpm镜像

  • docker pull php:7.2-fpm

  • 我是在本地虚拟机上完成的 由于权限问题,需要在所有共享文件夹 docker run 这步 加上 --privileged=true 下面相同

    docker run -d \
    -v /var/www/html:/var/www/html \
    -p 9000:9000 --link mysql56:mysql \
    -p 3679:3679 --link redis32:redis \
    --name phpfpm72 --privileged=true php:7.2-fpm
    • 运行生成一个php7.2的容器
    • docker exec -ti phpfpm72 /bin/bash
    • -ti 打开图形界面
    • /bin/bash 执行 这个命令
    • exec 可以在 不exit的情况下进行附加操作
    • 进去后需要 apt-get update 里面是debian9系统
    • docker-php-ext-install pdo_mysql 来装pdo_mysql扩展
    • 以下这些扩展都可以安装 不过好多有坑
      bcmath bz2 calendar ctype curl dba dom enchant exif fileinfo filter ftp gd gettext gmp hash iconv imap interbase intl json ldap mbstring mysqli oci8 odbc opcache pcntl pdo pdo_dblib pdo_firebird pdo_mysql pdo_oci pdo_odbc pdo_pgsql pdo_sqlite pgsql phar posix pspell readline recode reflection session shmop simplexml snmp soap sockets sodium spl standard sysvmsg sysvsem sysvshm tidy tokenizer wddx xml xmlreader xmlrpc xmlwriter xsl zend_test zip
  • 一般来说可以官方提供了 docker-php-exc-install 这个工具来下载

  • 但是 由于gd库需要freetype扩展才能使用生成验证码的一个函数

  • 官方使用的是 Debian9系统 docker-php-exc-install gd

  • 报错 png.h not found. 需要安装 libpng-dev 装libpng会需要另一连串的扩展(0_0)

  • 直接apt-get会报错 Debian如何换源 ?

  • cd /etc/apt && cp sources.list ./sources.list.bak

  • apt-get install vim

  • vim sources.list
    deb http://mirrors.163.com/debian/ stretch main non-free contrib
    deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib
    deb http://mirrors.163.com/debian/ stretch-backports main non-free contrib
    deb-src http://mirrors.163.com/debian/ stretch main non-free contrib
    deb-src http://mirrors.163.com/debian/ stretch-updates main non-free contrib
    deb-src http://mirrors.163.com/debian/ stretch-backports main non-free contrib
    //如果连apt-get update都做不到   可以先 rm sources.list 再创一个新的
    echo "deb http://mirrors.163.com/debian/ stretch main non-free contrib
    deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib
    deb http://mirrors.163.com/debian/ stretch-backports main non-free contrib
    deb-src http://mirrors.163.com/debian/ stretch main non-free contrib
    deb-src http://mirrors.163.com/debian/ stretch-updates main non-free contrib
    deb-src http://mirrors.163.com/debian/ stretch-backports main non-free contrib" >> sources.list
    //将源更换为上述  新的源
    apt-get update
    apt-get install libfreetype6-dev -y
    apt-get install libpng-dev -y
    apt-get install libjpeg62-turbo-dev -y
    //如果源没出问题 上述应该都能安装
    docker-php-ext-configure gd --with-freetype-dir=/usr/include --with-jpeg-dir=/usr/include
    //先编译gd库的扩展
    docker-php-ext-install gd
    这样就在docker容器内完美安装了gd库
    • apt-get install net-tools 来装网络工具包
    • 使用 netstat -tunlp 来查看 端口很网络状态可以看到9000端口正在被监听

安装nginx

- `docker pull nginx`

```
  docker run -d -v /var/www/html:/var/www/html \
  -p 80:80 --name nginx --link phpfpm72:phpfpm \
  --privileged=true nginx:latest
```

- `docker exec -ti nginx /bin/bash`
- `apt-get update`
- `apt-get install net-tools -y`
- `apt-get install -y vim`
- `vim /etc/nginx/conf.d/default.conf `
    server {
        listen       80;
        server_name  _;
        root   "/var/www/html/blog/public";
        location / {
            index  index.html index.htm index.php;
            try_files $uri $uri/ /index.php?$query_string;
        }

        location = /favicon.ico { access_log off; log_not_found off; }
        location = /robots.txt  { access_log off; log_not_found off; }

        error_page 404 /index.php;

        location ~ \.php(.*)$ {
            fastcgi_pass   phpfpm72:9000;
            fastcgi_index  index.php;
            fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO  $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
            include        fastcgi_params;
        }
    }
- 你可以在容器中exit 后去 /var/www/blog/public vim 一个index.php来查看效果
- `nginx -s reload` exit容器再`docker restart phpfpm72`使php扩展打开
- 这样就搭建好了一个dnmp环境...

备注:低版本PHP的mcrypt扩展 需要先 apt-get install libmcrypt-dev

重新从镜像 转成容器的时候 为了避免 直接退出需要 加上 docker-php-entrypoint php-fpm 这个命令

```
docker run -d -v /var/www:/var/www/html -p 9000:9000 --link mysql56:mysql --name phpfpm-71 615e docker-php-entrypoint php-fpm
```
容器和镜像文件之间的导入导出
- 导出 docker export [container id] > test.tar

- 导入 导出的文件可以使用docker import 导入为镜像
    - `docker import - test/contod:v1.0`

使用phpstrom的sftp 同步本地代码到虚拟机

  • 如图 先配置好



  • 然后设定自动更新
    • 先把代码传上去 第一张图片的 上传选项
    • 然后设定 第一张图片的 自动上传选项
  • 最后就是本地写代码保存之后 就直接上传到 虚拟机 虚拟机映射到容器内部的nginx 和phpfpm web程序就跑起来了
  • 还是根据上面部署laravel的一些 操作做完了就能通过IP 访问你的web程序
    注:
  • setenforce 0 临时关闭selinux IP可用mysql这样的别名替代
  • 需要认识到 你的代码是在容器而不是在虚拟机里面跑,那么一些小问题就没什么关系

    总算写完了,vagrant 和 laradock 这样的东西明年再写吧,今年不想再操心环境了

本帖已被设为精华帖!
本帖由系统于 4年前 自动加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 4
xianyunyehe

都用docker啦,为啥还跑个虚拟机。windows 10 支持docker呀。

推荐一个docker 一键的脚本

https://github.com/yeszao/dnmp

5年前 评论
QQQCCC 3年前

感谢
自己配置的开发环境欢迎使用
https://github.com/Al-Waler/DNMP

5年前 评论

为什么安装失败了

 yum install net-tools
error: rpmdb: BDB0113 Thread/process 23439/140210621216832 failed: BDB1507 Thread died in Berkeley DB library
error: db5 error(-30973) from dbenv->failchk: BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery
error: cannot open Packages index using db5 -  (-30973)
error: cannot open Packages database in /var/lib/rpm
CRITICAL:yum.main:

Error: rpmdb open failed
5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!