Laravel项目线上服务器docker化部署实战全过程记录指导(转 2021-04-02)

龙学
2023-12-01

最近,笔者终于在重重困难之下,完成了自己的第一个laravel项目,有什么感受呢,当然就是laravel虽然体型大,但是功能也更全了。总起来说,是一个在php后端领域值得深入挖掘,日积月累的框架。项目的本地开发和测试都已经完成,那么接下来面临的自然是部署到公网服务器上。当然我们也不会直接就在服务器上裸露部署,而是使用笔者前几篇文章提到的docker容器技术进行容器化隔离部署。那么从一个刚初始化后的服务器到部署完,该是怎么一个过程呢,让我们来一探究竟。

首先介绍我们的程序及服务器的配置:

后端程序及依赖安装程序
1.Laravel5.8
2.mysql5.7
3.composer

服务器及容器配置
1.腾讯云服务器
2.docker镜像:nginx-php(笔者订制nginx-php开发环境,读者可以自行下载使用,其中集成了nginx1.14,php7.2,以及php7.2-fpm,composer依赖安装器,非常适合php后端开发的开箱即用)
3.docker镜像:mysql5.7

下面开始正题:

一 服务器的初始化配置
我使用的是腾讯云服务器,安装系统为后端人员最喜闻乐见的ubuntu16.04,给服务器装完系统之后,我们需要做以下操作:

1.修改用户名
一般在服务器初始化后,一般会分配统一的用户名,如腾讯云分配的是ubuntu用户名,我们一定要修改用户名为自己的自定义名称,这样就能一定程度上防止黑客猜到你的用户名,进行ssh远程登录,是维护服务器安全的一个基本操作。点此进行操作。记得修改完用户名后将服务器重启

注意,一般不要将服务器开通root登录,否则,一旦服务器被黑,服务器的一切都暴露在危险之中,如果非要修改服务器为root登录的话,点此进行操作。

而后,关于程序环境的搭建,和服务器系统就无关了,因为我们使用了容器技术,就要把所有的软件开发环境放在docker容器中。

2.将apt镜像源换为阿里云镜像源
更换操作如下:更换镜像源

如果是腾讯云服务器的话,本身的源镜像就是腾讯云的国内镜像,就不需要进行替换。

二 Docker环境的搭建及镜像的拉取和运行
1.ubuntu中安装docker
安装教程:ubuntu系统docker官方安装文档

2.设置docker阿里云下载源
(安装时间较为漫长,可以点上一杯咖啡了),但是,如果你是国内服务器的话,很不幸的是,你被wall了,这个时候,万能的阿里云镜像源就会帮助到你了。
使用阿里云docekr-ce镜像进行下载安装:
1.docker阿里云镜像安装操作方法
2.docker阿里云镜像地址

注意:阿里云镜像库已经基本包含了所有常用的开源镜像,可以放心快速的使用:官方镜像

安装完docker之后,可以创建docker用户组,将当前用户加入其中,之后使用docker就不用再打sudo,使用管理员权限:操作方法如下

3.下载,安装,运行docker镜像nginx-php,mysql5.7
如上面介绍的nginx-php容器,是一个集成了Nginx,php,php-fpm.composer,甚至还有imagick 处理图像的php扩展,并且自带php-mysql扩展,能够为laravel的数据库迁移提供数据库驱动。专门为php后端开发量身打造的开发环境,真正做到即插即用。
nginx-php docekr 镜像地址

镜像下载完成之后,开始运行镜像,生成容器。

(1)nginx-php的运行
首先,在宿主服务器中创建nginx服务器架构文件夹,用来完成docekr容器向宿主机的文件映射。因为每次需要更改文件就进入docker容器中,实在是太难受了。
首先在文件中建立以下文件夹目录:
.
├── conf
├── log
│ ├── access.log
│ └── error.log
└── www
conf:用来存放nginx虚拟主机配置文件,后缀同意为.conf
log:用来存放nginx的日志文件
www:用来存放程序代码文件

创建完成之后,运行nginx-php镜像,生成容器,在运行时,注意三个文件夹的映射指定。
命令为:

docker run -itd --name pipihome -p 8601:8601 -p 8602:8602 -p 8603:8603 -v /usr/local/code/mine/pipihome/www/:/var/www -v /usr/local/code/mine/pipihome/conf/:/etc/nginx/conf.d -v /usr/local/code/mine/pipihome/log/:/var/log/nginx 4c2729e78cfa
1
注意:在这里,我不选择目录的映射,而是直接进入docker容器中进行环境的搭建和项目的部署。原因是,在docker中,默认是root权限,因为它不是直接的宿主服务器,所以使用root权限,安全问题要小很多。更重要的原因是,如果将镜像中内容映射到宿主机中,那么文件系统在宿主机和容器中分别进行修改时,就有可能导致用户的权限问题,非常复杂,使用不太友好。不进行目录映射也能够完全的实现容器物理和逻辑的隔离独立。推荐这种使用方法,当然,上面那一种也可以使用,但要视情况而定。一定要注意目录映射导致的宿主机用户和容器用户不同导致的权限不满足问题。

运行完全独立的容器,命令为:

docker run -itd --name pipihome -p 8601:8601 -p 8602:8602 -p 8603:8603 --privileged 4c2729e78cfa
1
注意:加入 --privileged 启动选项,就能够使docker中的root用户拥有宿主机的root权限,能够使用宿主机的硬件等资源,具有宿主机的完全权限。否则的话docker中root的权限就相当于宿主机中普通用户。
该项是必须加入的,否则在之后的开发中,如果需要在docker容器中使用宿主机资源,就会提示权限不足,从而产生很多配置问题。

而后进入容器bash中,进行开发环境的搭建和代码的部署。

(2)nginx的配置
1.增大nginx服务器客户端上传文件的大小限制:
因为往往在客户端都有文件上传服务器的需求存在,且现在上传的文件都较大。
打开文件/etc/nginx/nginx.conf,添加如下代码:

client_max_body_size 50m;
1
修改完成之后重启nginx服务。
然而,本镜像已经预先添加了该功能,可以不用管该条配置了。

2.配置虚拟服务器:
首先配置后端laravel api访问的虚拟主机:
注意:该nginx-php框架已经配置好在nginx配置文件中的虚拟主机配置文件夹路径,只用在/etc/nginx/conf.d中新建以conf为后缀的配置文件就可以为服务器添加新的虚拟主机。
在文件夹/etc/nginx/conf.d中添加api.conf虚拟主机配置文件,代码如下:
(如果是开启ssl协议,https访问的虚拟主机,则需要提前将ssl证书上传至能引用到的位置)

server {
        listen 443;
        server_name domain.com;
        root filepath;
        index index.html index.htm index.php;

        ssl on;
        ssl_certificate /etc/nginx/ssl/www.domain.com_bundle.crt;
        ssl_certificate_key /etc/nginx/ssl/www.domain.com.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;

        add_header X-Frame-Options "SAMEORIGIN";
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Content-Type-Options "nosniff";

        charset utf-8;

        location / {
                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_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include        fastcgi_params;
                fastcgi_pass   unix:/var/run/php/php7.2-fpm.sock;
        }

        location ~ /\.(?!well-known).* {
                deny all;
        }
    }

配置完成之后,将laravel项目程序文件移至服务器文件根目录中,笔者使用git直接pull远程仓库代码:
首先

git init
1
初始化git仓库,而后添加远程代码仓库地址:

git remote add origin https://github.com/user/repo.git
1
laravel项目代码拉取本地之后,使用composer进行项目依赖的安装

composer install
1
如果你的服务器配置太低,内存过小,比如说1G或者2G,就会发生这个异常:

产生这个异常的原因是因为composer在安装依赖的时候,会占用大量内存,如果内存不足,就会报错,并停止安装依赖。那该怎么办呢?是有办法能解决的。
思路就是把服务器的物理存储作为暂时性的内存使用,来顺利完成本次依赖的安装:
ubuntu进行物理存储虚拟内存化
操作成功之后,即可进行依赖的安装。

注意:在安装完依赖之后,注意将暂时的虚拟内存释放至物理内存,要不然,物理内存的io速度远远小于真正的内存,影响服务器效率。
进入虚拟内存配置文件文件夹

/etc/swap
1
输入关闭释放物理存储虚拟内存化的命令

swapoff swapfile
1
即可完成虚拟内存的释放,释放虚拟内存。

注意:安装完成后,要新建.env文件,作为laravel项目的配置文件。且要文件递归式的将整个项目文件夹的权限改为700,保证laravel项目中日志文件等其他文件的创建执行过程。

(3) php配置
修改php.ini配置,增加php处理上传文件的大小限制:
php配置文件位置为:

/etc/php/7.2/fpm/php.ini
1
修改的配置内容为:

upload_max_filesize = 50M
post_max_size = 50M
1
2
修改完成之后,重启php-fpm服务即可。
然而,本镜像已经预先添加了该功能,可以不用管该条配置了。

(4) mysql镜像的运行和配置
运行mysql镜像,命令为:

docker run -itd -p port:3306 --name mysql -e MYSQL_ROOT_PASSWORD=password 8679ced16d20
1
注意:docker中mysql启动的运行端口为3306.

注意:docker启动时 -p 指定的端口映射和容器中主体应用的运行端口不是一回事。即docker中mysql运行的端口和-p指定的没有任何关系,-p 只是指定了一个宿主机和容器的端口映射关系。

在一般开发情况下,我们一般会使用navicat远程连接mysql数据库,那么远程连接mysql数据库需要注意什么呢?
1.mysql数据库要开启root的远程主机访问权限。
2.mysql数据库要解除默认的只能本地访问的配置。
3.云服务器要开启mysql对应端口的安全组访问。
三条同时满足,才可以远程连接mysql。参考链接

注意:docker中的apt软件源是国外的官方源,下载速度那简直是一言难尽啊,所以,首先要将docker容器的软件源换为阿里云的软件源。方法如下:

进入宿主机apt软件源配置文件目录

/etc/apt
1
在该文件夹中,新建文件sources.list.aliyun
编辑该文件,写入以下内容:

deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse

deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse

deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse

deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse

deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
保存,退出。

将该文件从宿主机中复制进入容器中,替换容器中原有的sources.list文件,命令为:

docker cp sources.list.aliyun 1ae6a9b82595:/etc/apt/sources.list
1
然后进入容器bash内部,执行:

apt-get update
1
此时会出现以下异常:

GPG error: The following signatures couldn't be verified because the public key is not available
1
此时,执行以下两条命令即可完美解决:

sudo gpg --keyserver keyserver.ubuntu.com --recv 5523BAEEB01FA116 //(这个公钥根据提示来写的)
sudo gpg --export --armor 5523BAEEB01FA116 | sudo apt-key add -
1
2
解决完成之后,再次运行update,即可完美更换为阿里云apt源。

注意:docker的mysql5.7镜像运行后直接满足上文所述的 ”mysql远程连接三大条件“ 的前两条,再将腾讯云相应端口的入向端口的安全组打开,即可完美实现远程mysql的navicat连接。

三 laravel项目配置注意事项。
1.文件夹执行权限的注意。
如果需要在程序中向某个文件夹中创建新文件夹或者文件,需要用户对于该文件夹有执行权限,也就是至少需要该文件夹的权限为700,注意在部署后运行前修改这类文件夹的权限。可用于上传图片文件夹中的创建和操作。

2.laravel环境配置文件中数据库连接的配置
在laravel .env文件中配置项目数据库连接时,如果mysql,redis也是docker容器服务,在填写数据库服务主机地址,host时,注意,可以使用docker容器的虚拟网络地址,而不用直接写公网地址,相应的,端口就直接写数据库服务在容器中的运行端口,而不是宿主机的外部映射端口。
查看容器虚拟网络地址的命令:

docker inspect containerId(容器id) | grep IPAddress
1
3.laravel中数据迁移提示找不到数据库驱动的问题
该问题一般是由于php缺少php-mysql扩展的问题,直接安装该扩展即可,安装命令为:

apt-get install php-mysql
service php7.2-fpm restart
1
2
安装完成之后即可进行数据库迁移。
注意:上文提到的,笔者自己制作的laravel开发环境docker镜像 nginx-php 的最新版本已经集成了php-mysql扩展,可以放心直接使用,是不是很香呢?
 

 类似资料: