从零开始部署一个 Laravel 站点

JellyBool

JellyBool

阿里云买ECS的时候选择自己习惯的镜像系统,我一般都是使用Linux Ubuntu,所以,以下的配置都是在Ubuntu 14.04稳定支持版的环境中搭建Linux+Nginx+Mysql+PHP环境的

首先,在一般的情况下,刚刚购买的阿里云ECS的Linux中会给你预装Apache,我们先把它给删了

通过下面的命令来删除Apache

sudo service apache2 stop

update-rc.d -f apache2 remove
sudo apt-get remove apache2

删除完之后,更新一下包列表

sudo apt-get update

1.安装Nginx

sudo apt-get install nginx

安装完Nginx,执行sudo service nginx start,再在浏览器地址栏输入你的公网IP,你就可以看的welcome to Nginx的界面了

2.安装Mysql

sudo apt-get install mysql-server mysql-client

过程中会提示你设置Mysql的密码,就跟平时的密码设置一样,一
次输入,一次确认。密码确认完毕后基本等一会就安装好了。尝试

mysql -u root -p

如果登录成功,那Mysql就正确安装了。

3.安装PHP

sudo apt-get install php5-fpm php5-cli php5-mcrypt

只有通过php5-fpm,PHP在Nginx下才能正常运行,遂,安装之。

至于php5-mcrypt,有些PHP框架会依赖于这个,比如Laravel就是,所以也把它装上了。

4.配置PHP

sudo vim /etc/php5/fpm/php.ini

打开PHP配置文件,找到cgi.fix_pathinfo选项,去掉它前面的注释分号;,然后将它的值设置为0,如下

cgi.fix_pathinfo=0

5.启用php5-mcrypt:

sudo php5enmod mcrypt

6.重启php5-fpm:

sudo service php5-fpm restart

在搭建完LEMP环境之后,首先要明确两个重要目录

Nginx的默认root文件夹

/usr/share/nginx/html

Nginx的服务器配置文件所在目录

/etc/nginx/sites-available/

上面两个目录记住就好,很常用,先摆出来

下面一步一步在阿里云ECS上部署Laravel

1.创建网站的根目录

sudo mkdir -p /var/www

2.配置nginx服务器

sudo vim /etc/nginx/sites-available/default

打开nginx的配置文件之后,找到server这一块,大概是长这个样子的

server {

        listen 80 default_server;

        listen [::]:80 default_server ipv6only=on;


        root /usr/share/nginx/html;

        index index.html index.htm;


        server_name localhost;


        location / {

                try_files $uri $uri/ =404;

        }

}

其中rootindexserver_namelocation这几行需要稍微修改一下

root修改

root /var/www/laravel/public;

这里就是将nginx服务器的根目录指向Laravel的public文件夹下,后续的Laravel项目的代码我们会放在我们之前创建的/var/www/laravel目录下

index修改

index index.php index.html index.htm;

这里需要注意的是,index.php排在最前面

server_name修改

server_name server_domain_or_IP;

server_domain_or_IP修改为你的公网IP

location修改

location / {

        try_files $uri $uri/ /index.php?$query_string;

}

修改完是这样的:

server {

    listen 80 default_server;

    listen [::]:80 default_server ipv6only=on;


    root /var/www/laravel/public;

    index index.php index.html index.htm;


    server_name server_domain_or_IP;


    location / {

            try_files $uri $uri/ /index.php?$query_string;

    }

}

最后我们还需要配置一下Nginx,让其执行PHP文件。同样是在这个文件里,在location下方添加下面的配置:

server {

    listen 80 default_server;

    listen [::]:80 default_server ipv6only=on;


    root /var/www/laravel/public;

    index index.php index.html index.htm;


    server_name server_domain_or_IP;


    location / {

        try_files $uri $uri/ /index.php?$query_string;

    }


    location ~ \.php$ {

        try_files $uri /index.php =404;

        fastcgi_split_path_info ^(.+\.php)(/.+)$;

        fastcgi_pass unix:/var/run/php5-fpm.sock;

        fastcgi_index index.php;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        include fastcgi_params;

    }

}

注意,这一块是自己加上去的:

 location ~ \.php$ {

        try_files $uri /index.php =404;

        fastcgi_split_path_info ^(.+\.php)(/.+)$;

        fastcgi_pass unix:/var/run/php5-fpm.sock;

        fastcgi_index index.php;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        include fastcgi_params;

    }

配置完之后重启Nginx,使上面的配置项生效。

sudo service nginx restart

3.创建Laravel项目

在配置完nginx后,怎么获取Laravel的项目代码呢?有以下几种方法:

(1).直接composer安装

直接通过composer来安装,你可以在CES上通过执行

cd ~

curl -sS https://getcomposer.org/installer | php

上面命令会安装composer

composer全局使用:

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

然后在/var/www目录下直接执行

sudo composer create-project laravel/laravel laravel

因为我们之前创建/var/www目录,你可以直接cd /var/www然后执行上面的命令。然后坐等安装完成。

(2).直接上传代码

使用下面命令上传

scp -r laravel root@your_IP:

然后在阿里云的ECS上将laravel移动到/var/www目录下

sudo mv laravel/ /var/www

(3).使用Git和Coding平台

个人比较喜欢使用git来上传代码,可以很方便的更新代码和进行回滚,一旦版本更新出Bug我可以借助Git的强大版本管理能力来修复Bug。流程大概是这样:

本地代码---->Coding---->阿里云ECS

既然要使用git,那么先在ECS上安装git

sudo apt-get install git

安装完成就可以使用git了,然后在Coding上创建一个私有项目laravel,里面包含所有该Laravel项目所需代码。

一旦本地代码都推送到Coding,然后在/var/www目录下直接使用

git clone your-project-git-link

your-project-git-link替换为你Coding上的laravel项目地址

4.最后的最后

不管哪种方式安装的代码,/var/www/都是属于root用户的,而访问网站的用户则需要正确的权限和访问限制,我们可以通过下面的命令来实现。

sudo chown -R :www-data /var/www/laravel

根据Laravel的官方文档,/var/www/laravel/storage 目录需要给网站的用户权限

sudo chmod -R 775 /var/www/laravel/storage

5.BINGO

在浏览器输入:

http://server_domain_or_IP

至此,你可以在阿里云的ECS上随意地用Laravel了,Happy Hacking

本文由 JellyBool 创作, 转载和引用遵循 署名-非商业性使用 2.5 中国大陆 进行许可。

共有 72 条评论

JellyBool

视频教程在这里:

https://laravist.com/lesson/2

haoran

Apache如何部署?

NorthWish

博主你好,按照你的教程搭建环境。composer创建laravel时候报错。我的ecs是512内存,跟内存有关系吗?

JellyBool

估计就是,至少1G内存吧 @NorthWish

NorthWish

博主你好,根据你的教程成功搭建了环境并安装了laravel。发现两个问题。
1.sudo chmod -R 775 /var/www/laravel/app/storage
storage是在laravel目录下
2.php artisan migrate 执行数据迁移时报错
[PDOException]
could not find driver

sudo apt-get install php5-mysql 之后 数据迁移成功

最后,希望博主抽空写一个coding.net公匙、添加远程仓库等的教程。感觉你的文章和视频很实用,博主加油!!!

JellyBool

哎,现在做不了那么多的事,就像今天录个视频,有折腾了很久 @NorthWish

sasarain

你这个教程里的lavavel是哪个版本里的?

JellyBool

laravel 5.1 @sasarain

460611929

哈喽 我想问下 一个云虚拟机上 Ubuntu nginx上面 如何配多个laravel 项目的站点

460611929

哈喽 我想问下 一个云虚拟机上 Ubuntu nginx上面 如何配多个laravel 项目的站点@JellyBool

woailuosj

@JellyBool 我也想问一下nginx怎么配置多域名站点?我搜到的人家的nginx目录和你这里不一样 nginx域名配置文件存放目录:/usr/local/nginx/conf/servers

JellyBool

我记得帖子里面就有…… @woailuosj

woailuosj

@JellyBool 这个帖子吗?

woailuosj

@JellyBool 谢谢

bigtotoro

我怎么没部署成功呢, nginx错误日志没有设置哦。我想找看看

ogre222

hello 我想问下 sudo php5enmod mcrypt 报错
sudo: php5enmod: command not found
如何解决呢?@JellyBool

已解决。。

tracytheron

我在自己机器上正常,但部署到阿里云上时,除了访问 / 可以访问,其他路由全部返回 404,请问有可能是什么原因?

tracytheron

哦,知道原因了,是因为我使用了dingo/api, .env里面的API_DOMAIN写成了localhost。

xuan9230

提示几个容易错的地方:

  1. 修改root时,博主使用了laravel,要换成自己的项目名
  2. 部署到服务器后,如果不是使用composer生成项目,运行时可能遇到autoload.php on line 17错误。安装composer并执行composer install即可。
  3. 如遇到cipher错误,php artisan key:generate并把生成密钥放到.env里 APP_KEY=yourkey

博主么么哒 用你的教程搭了两个网站了 拿了工资就给你donate:)))

xuan9230

已捐赠水电费 虽然不多 请查收:)

JellyBool

感谢感谢,已收到 @xuan9230

来份果子狸

博主你好,我试着使用git和coding去同步代码,但是出现一个问题,就是我本地推送之后,vendor这个文件夹始终推送不上去,请问一下是为什么?

JellyBool

那是因为你ignore了吧。。真的是这样的话,去了解一下git的基础用法吧 @来份果子狸

霸王乌贼之大智若愚_699

@JellyBool 楼主你用的是什么命令工具的(Itm)是什么命令工具来着

谢伟志

great post

谢伟志

请问为什么我修改/etc/nginx/sites-available/default 下 server 的index为index index.php index.html index.htm;, 访问出现500的? 去掉的话就会403, 我已经设置了/var/www/laravel/storage/var/www/laravel的权限了.

JellyBool

看看nginx的log吧 @谢伟志

sunding0308

有没有配合数据库使用的教程?

JellyBool 回复 sunding0308

你配置一下数据库连接就可以了。laravist上很多这些教程

wuyutaott

按照,教程做了很多遍了,服务器一直返回500,不知道啥地方弄错了

JellyBool 回复 wuyutaott

你看看 nginx logs 就知道了

wuyutaott 回复 JellyBool

找到问题了,按照帖子的做法操作,在linux上安装的php版本是5.5.9,而按照视频里面的做法(composer create-project laravel/laravel 没有指定版本号)创建laravel的版本号是5.3,一年以前估计创建出来的工程是5.1,我查了一下laravel 5.1 5.2最低要求php5.5.9,laravel 5.3要求php >=5.6.4,所以我没配置成功,修改了我的工程为5.1版本之后,没有问题了

wuyutaott 回复 JellyBool

另外我还有个问题,在阿里云上linux安装了mysql如何才能让Navicat远程进行连接,我连接,提示拒绝连接

JellyBool 回复 wuyutaott

如果是使用 ssh 链接,请确保 默认的 22 端口开启并允许链接。在安装的 mysql 的时候,也开启允许远程链接

mikezhang

博主你好 现在遇到个这样的问题,求解

Warning: require(/home/wwwroot/api.xxx.com/bootstrap/../vendor/autoload.php): failed to open stream: Permission denied in /home/wwwroot/api.xxx.com/bootstrap/autoload.php on line 16

Fatal error: require(): Failed opening required '/home/wwwroot/api.xxx.com/bootstrap/../vendor/autoload.php' (include_path='.:/usr/local/php/lib/php') in /home/wwwroot/api.xxx.com/bootstrap/autoload.php on line 16
JellyBool 回复 mikezhang

给一下 bootstrap 这个文件夹的权限

mikezhang 回复 JellyBool

现在又这样了

Warning: require_once(/home/wwwroot/api.xxx.com/vendor/composer/autoload_real.php): failed to open stream: Permission denied in /home/wwwroot/api.xxx.com/vendor/autoload.php on line 5

Fatal error: require_once(): Failed opening required '/home/wwwroot/api.xxx.com/vendor/composer/autoload_real.php' (include_path='.:/usr/local/php/lib/php') in /home/wwwroot/api.xxx.com/vendor/autoload.php on line 5
JellyBool 回复 mikezhang

额…你确定给了 www 正确的权限和www-data 了么

vartist

我在自己电脑上安装的 debian ,安装 composer 没有成功!我该怎么弄呢?

vartist

打了 ‘’‘ cd ~’‘’, 居然好了,不太懂。。。

vartist

我安装了 debian, 弄好了 nginx, mysql, php, laravel, 想通过局域网中的其他 windows 电脑访问 debian 的 localhost, 我该怎么设置!有人知道吗?我的防火墙没有配置过!(我也找了好多教程,但都没配置成功)

vartist

@JellBool, 我想在 /www 下做多个项目, 比如 /www/object1, /www/object2 … 但是根据上面的配置, localhost 会直接进入到 laravel, 请问我该如何配置? linux 我刚接触不久。

JellyBool 回复 vartist

配置不同的 server:

server {
 root  /www/object1/public
}

server {
 root  /www/object2/public
}
vartist 回复 JellyBool

他们不会互相冲突吗?
我修改了 nginx 的配置文件(在默认的server后面填了一个,填了80端口,然后 root ...), 重启服务的时候报错了!(Job for nginx.service failed. See 'systemctl status nginx.service' and 'journalctl -xn' for details) 小白表示看不懂。。

JellyBool 回复 vartist

debian 我不太熟悉,估计是你的配置文件有错吧。

你执行 nginx -t 看看有什么配置错误没

vartist 回复 JellyBool

配置没有问题,刚才看了一下啊! 我去掉 80 端口的设置,然后它就可以正常重启了,但是 localhost 依然直接访问 laravel 了。/www/object/public, public是专属的一个目录吗?还是一种表述呢?

JellyBool 回复 vartist

laravel 项目默认使用的是 public 目录下的 index.php 作为入口文件,看一下这个

https://www.laravist.com/series/deploy-laravel-app-on-vps

fsdstar

博主您好,我是按照git进行克隆项目到ECS上,但是一直显示403,但是我要是访问具体的某个文件是成功的,这是项目的地址https://github.com/fsdstar/blog

JellyBool 回复 fsdstar

你看这个 https://www.laravist.com/series/deploy-laravel-app-on-vps

注意 nginx 的配置 和 vendor 目录是否有提交

fsdstar 回复 JellyBool

-rw-r–r-- 1 root root 414 Apr 11 20:10 .env
-rw-r–r-- 1 root root 403 Apr 11 20:10 .env.example
drwxr-xr-x 8 root root 4096 Apr 11 20:10 .git/
-rw-r–r-- 1 root root 61 Apr 11 20:10 .gitattributes
-rw-r–r-- 1 root root 73 Apr 11 20:10 .gitignore
-rw-r–r-- 1 root root 532 Apr 11 20:10 gulpfile.js
-rw-r–r-- 1 root root 159 Apr 11 20:10 package.json
-rw-r–r-- 1 root root 870 Apr 11 20:10 phpunit.xml
drwxr-xr-x 10 root root 4096 Apr 11 20:10 public/
-rw-r–r-- 1 root root 1925 Apr 11 20:10 readme.md
drwxr-xr-x 5 root root 4096 Apr 11 20:10 resources/
-rw-r–r-- 1 root root 567 Apr 11 20:10 server.php
drwxr-xr-x 5 root root 4096 Apr 11 20:10 storage/
drwxr-xr-x 2 root root 4096 Apr 11 20:10 tests/
drwxr-xr-x 30 root root 4096 Apr 11 20:10 vendor/
都包含了,这个项目是我本地编写上传的都是可以正常运行的

我再看看您发的连接

JellyBool 回复 fsdstar

一看你这权限就不对啊,这个项目应该是 www-data 这个用户所有的。

你认真看看视频吧

yzzshmily

上docker吧。

fxinstar

博主你好,我安装好composer后会报如下错误。Do not run Composer as root/super user! See https://getcomposer.org/root for details,找了很久也没找到解决办法,博主有什么建议吗?

结果新建一个用户,并在该用户下执行composer命令就可以了,不知道会不会对后续产生影响

JellyBool 回复 fxinstar

别用 root 用户执行就好了啊

fxinstar 回复 JellyBool

谢谢 了~~ 博主这篇文章,很实用,厉害

zn1805024725

博主 在centos中 怎么给这个www-data 权限

JellyBool 回复 zn1805024725

应该差不多的吧,我不熟悉 centos

zn1805024725

我配置了 所有东西以后还是显示404

DevilAngel

我感觉我弄了一天, 在服务器上网站一直打不开.
最后的最后, 看到 vendor 目录我就惊呆了.
原来我本地安装的 Laravel 里的 Git 默认把 vendor 目录排除了.
修改之, 重新上传, 重新获取. Ok! 备注一下, 希望可以帮到其他人.

Hyttt456

JellyBool 你好

我使用你的配置来配置laravel5.5遇到了一些问题, 我的网站打开总是会502错误

这是我的配置文件:nginx.conf
server
{
listen 80 default_server;

listen [::]:80 default_server ipv6only=on;


root /data/www/hello_laravel/public;

index index.php index.html index.htm;


server_name _;


location / {

    try_files $uri $uri/ /index.php?$query_string;

}


location ~ \.php$ {

    try_files $uri /index.php =404;

    fastcgi_split_path_info ^(.+\.php)(/.+)$;

    fastcgi_pass unix:/var/run/php5-fpm.sock;

    fastcgi_index index.php;

    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

    include fastcgi_params;

  }
}

以及报的错误:
502 Bad Gateway

nginx

JellyBool 回复 Hyttt456

看 nginx 的 log 信息就好

Hyttt456 回复 JellyBool

找到原因了,感谢Jelly

jame

想买个vip,在购买之前有点问题想咨询你,就是不知道怎么样才能及时联系到你