花式搭建 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
-
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
-
yum list|grep nginx
查看yum源中的nginxnginx.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.phpecho '<?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了
- 原因大概和我新建了文件夹有关导致 $document_root 这个变量没指向我在的位置
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
# 我选择脚本自动安装
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 连接外网使用另一张 还需要 (端口转发?不确定)
- virtualBox 实现内外网互通
起步 安装
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 这样的东西明年再写吧,今年不想再操心环境了
都用docker啦,为啥还跑个虚拟机。windows 10 支持docker呀。
推荐一个docker 一键的脚本
https://github.com/yeszao/dnmp
感谢
自己配置的开发环境欢迎使用
https://github.com/Al-Waler/DNMP
为什么安装失败了
@lovecn https://www.cnblogs.com/xuegqcto/p/8464361...
fastcgi_split_path_info ^((?U).+.php)(/?.+)$; 这个有啥作用啊?