Laravel 项目部署到云服务器(CentOS 7 系统)

手头有一台买来搭梯子的搬瓦工云服务器,系统是Centos 7,正好拿来练习下部署Laravel项目。这里使用XShell链接到云主机,并且所有操作都在root账号下操作,非root账号时终端命令前面需添加sudo

LNMP 环境搭建

参考本论坛大牛的这篇:Laravel 之道特别篇一: yum 安装 LNMP 环境

我的云主机已经是Centos 7,所以不用安装Centos 7 的步骤。期间可能会遇到nginx配置好了,访问主机IP却没有效果的问题,这时候可以尝试重启nginx:systemctl restart nginx

安装和配置git

  1. 开启 Wandisco GIT 源,这样能保证下载到较新版本的git。开启方法:

    1. 云主机终端输入以下代码:
      vi /etc/yum.repos.d/wandisco-git.repo

      这样就在 /etc/yum.repos.d/ 目录新建了一个 yum 源文件 wandisco-git.repo
      按键盘上的 io 进入编辑模式,复制粘贴以下代码:

      [wandisco-git]
      name=Wandisco GIT Repository
      baseurl=http://opensource.wandisco.com/centos/7/git/$basearch/
      enabled=1
      gpgcheck=1
      gpgkey=http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco

      esc 键退出编辑模式,输入 :wq 保存并退出 vi/vim 编辑器。

    2. 导入GPG keys
      rpm --import http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco
    3. 安装git
      yum install git
    4. 查看版本号
      git --version

      我这里安装的版本是2.18.0 。

  2. 配置git
    运行以下命令:

    git config --global user.name "Your Name"
    git config --global user.email "youremail@yourdomain.com"

    用户名和邮箱改为你自己的。

  3. 生成密钥对

    参考文档: https://git-scm.com/book/zh/v2/服务器上的-Git-生成-SSH-公钥

密钥对生成后,将公钥 id_rsa.pub 的内容拷贝添加到你的github上,添加地址: https://github.com/settings/keys

安装Composer

Composer 依赖 php-cli,该应用已经在搭建LNMP环境的时候安装了,这里不需要再次安装。Composer 安装步骤依次如下:

yum -y update
cd /tmp
curl -sS https://getcomposer.org/installer | php

让composer全局可用:

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

安装redis

依次运行以下命令:

yum install epel-release
yum install redis -y
systemctl start redis.service
 systemctl enable redis

检查运行状态:

systemctl status redis.service

如看到Active: active (running) ...则表示redis已在运行中。
测试redis:

redis-cli ping

如输出PONG,则表示redis已经可以连通。

Laravel项目安装

拉取github上的Laravel项目代码

cd /www/wwwroot
git clone git@github.com:Your-User-Name/larabbs.git larabbs

将clone后面的地址替换成你自己的github上的项目地址。

安装依赖

cd larabbs
composer install 

安装过程中,如果缺少相关php扩展,会有报错。从报错信息中,将所有缺少的扩展记录下来,逐个安装。
如,缺少pdo扩展,则运行yum -y install php72w-pdo,依此类推,安装xxx扩展,则运行yum -y install php72w-xxx
安装后重启nginx和php-fpm,依次运行:systemctl restart nginxsystemctl restart php-fpm

配置环境变量

  1. 在项目目录 larabbs 下复制 .env.example.env
    cp .env.example .env
  2. 生成APP_KEY
    php artisan key:generate
  3. 打开.env进行配置
    vi ./.env
  4. 需更改的配置如下,依照备注进行修改
    APP_NAME=你的APP名字
    APP_ENV=production # 这里设为生成环境
    APP_KEY=base64:前面生成的key不用改
    APP_DEBUG=false # 关闭调试模式
    APP_URL=你的主机地址
    LOG_CHANNEL=stack
    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=larabbs
    DB_USERNAME=root
    DB_PASSWORD=你的数据库密码
    BROADCAST_DRIVER=log
    CACHE_DRIVER=redis  # 这里使用redis
    SESSION_DRIVER=file
    SESSION_LIFETIME=120
    QUEUE_DRIVER=redis # 这里使用redis
    .
    .
    .
    MAIL_DRIVER=smtp
    MAIL_HOST=smtp.qq.com
    MAIL_PORT=25
    MAIL_USERNAME=你的QQ邮箱
    MAIL_PASSWORD=你的smtp服务的密码
    MAIL_ENCRYPTION=tls
    MAIL_FROM_ADDRESS=你的邮箱地址
    MAIL_FROM_NAME=LaraBBS
    .
    .
    .
    BAIDU_TRANSLATE_APPID=你的百度翻译APPID
    BAIDU_TRANSLATE_KEY=你的百度翻译KEY

数据库和数据表创建

登录数据库后运行以下命令创建数据库:

CREATE DATABASE larabbs DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

接着进行数据表迁移:

php artisan migrate

如出现这样的报错:could not find driver ...,可能缺少了pdo_mysql扩展,运行yum -y install php72w-pdo_mysql 安装。安装后同样重启 nginx 和 php-fpm 。

Nginx配置

在 /etc/nginx/conf.d 下面新建 larabbs.conf nginx配置文件,输入下列内容:

server {
    listen 80;
    server_name localhost;
    root /www/wwwroot/larabbs;

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

    index index.php index.html index.htm;

    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$ {
        root /www/wwwroot/larabbs;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

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

注意 conf.d 的其他配置文件,如有 listen 80,需把端口改为其他的,以免跟本配置冲突。

Crontab配置

由于程序中使用到了计划任务,需要在系统中配置Crontab。运行以下命令:

export EDITOR=vi && crontab -e

在打开的文件中,复制粘贴以下代码:

* * * * * php /home/vagrant/Code/larabbs/artisan schedule:run >> /dev/null 2>&1

esc键并输入:wq保存退出。

遇到的一些问题

  1. 运行composer update后输出Killed
    原因:系统内存不足
    解决方法:

    1. 在本地环境运行composer update
    2. 上传新的composer.lock文件到服务器
    3. 服务器上运行composer install
      这样就解决的依赖包更新的问题。
  2. 运行 composer 时提示:Do not run Composer as root/super user...
    虽然有提示,但还是可以正常运行,暂时不用解决。

  3. 文件写入权限问题
    storage、uploads等文件/文件夹没有写入权限会报错,这时需要给他们足够的权限。运行chmod -R 777 /path/to/filename授权。

  4. 更改配置后注意重启 nginx 和 php-fpm 。

  5. 使用yum直接安装 php、mysql 等软件,版本都很低, 需要重新配置yum源。

结尾

在这过程中,感觉centos 7 的 yum 不是很好用,仓库老旧,需要重新配置yum源,不知道这是什么历史遗留问题。
最后,骄傲地贴一下本次折腾的成果吧:http://144.34.151.40/

本作品采用《CC 协议》,转载必须注明作者和本文链接
Was mich nicht umbringt, macht mich stärker
本帖由系统于 4年前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 9

还要注意crontab用户写入文件权限问题

编译安装也可以尝试下,或者用docker

5年前 评论

@lovecn 我是在root用户下创建的crontab,执行的任务是读写数据库和redis,需要怎么考虑权限的问题?

5年前 评论

@tsin 既然是用root用户增加的计划任务,那么执行计划任务的用户就是root,而你程序目录的所属权限组可能不会是root(一般都是nobody、ningx等),这样的话,如果开启了debug记录日志的话,计划任务中生成的日志文件所属者就是root,这个时候程序正常执行就会出现权限不足问题,所以 crontab -e -u 程序目录所属者

5年前 评论

以下是个人想法。

  1. CentOS 默认就给 root,所以容易出现 composer 提示请勿使用 root 用户,这一点是我放弃 CentOS 的原因之一...
  2. chmod -R 777 在生产环境非常危险,意味着任何人取得任何权限都可以修改你的代码注入任意后门。
  3. SSH 密钥应当添加到 GitHub 或其他版本控制系统的部署密钥内,而不是用户密钥。
  4. 更新 nginx 配置后只需要 reload 即可,不需要重启。
  5. 真心不建议用 yum,各种缺包... 上回手贱删了 python 2.x,结果 yum 死活起不来了,重装 python 也没恢复...
5年前 评论

@Wi1dcard 感谢分享!文件夹权限给755可否?SSH公钥我是添加到Github的。

5年前 评论

@tsin

  1. 具体权限要看你的用户、用户组、文件所有者、Web 服务进程所有者 来具体配置,不过总的来说,755 至少比 777 安全多了。
  2. 我的意思是 GitHub 的部署密钥 或 其他版本控制系统的部署密钥。
5年前 评论

较基础,但步骤很详细,值得学习

4年前 评论

redis的目录在哪,没有找到/www/wwwroot的目录啊?

3年前 评论

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