接下来我们需要给新创建的服务器安装必要的运行环境,我们将通过一个脚本来安装,首先请确保通过 SSH 登录到了服务器上。
阿里云的按量付费服务器关机一段时间之后再开机,公网 IP 可能发生改变,需要仔细检查。如果发生改变需要在 Homestead 的
~/.ssh/config 里加入对应的新 IP。
由于该脚本只支持 Ubuntu 16.04,请确保你的服务器系统无误。
然后执行如下命令
$ wget-qO- https://raw.githubusercontent.com/summerblue/laravel-ubuntu-init/master/download.sh - | bash
安装完毕之后会在屏幕上输出Mysql的 root 密码,请妥善保存。
同时按照屏幕上的指示,需要执行一下:
$ source~/.bash_aliases
接下来我们需要创建一个新的Nginx站点用于Laravel Shop 项目的访问,执行如下命令:
$ cd~/laravel-ubuntu-init/
$ ./16.04/nginx_add_site.sh
该脚本会询问项目名,我们输入 laravel-shop
;站点域名我们输入 -,这是因为我们之后会直接通过 IP 来访问站点,不需要域名;最后会让我们确认输入是否正确,输入 y 并回车即可。
现在我们来看看这个脚本是否运行成功,执行一下命令:
$ cd/var/www/
$ ll
可以看到在 /var/www/
目录下已经创建好了 laravel-shop
目录。
接下来我们要测试一下刚刚创建的站点能否正确解析 PHP 代码,执行以下命令:
$ cd /var/www/laravel-shop/
$ mkdir -p public
$ echo '<?phpphpinfo();'> public/index.php
然后在浏览器中输入云服务器的外网 IP:
发现输出了Nginx的默认页,与我们预期不符,这是因为Nginx有一个默认站点,当使用 IP 访问时会展示默认站点的内容,因此我们需要把这个默认站点配置删除,然后重启Nginx使之生效:
$ rm-f /etc/nginx/sites-enabled/default
$ systemctl restart nginx.service
现在再刷新页面看看:
可以看到 phpinfo()
的输出,说明能够正确执行 PHP 代码。
接下来我们还需要安装Elasticsearch,执行以下命令:
$ cd~/laravel-ubuntu-init
$ ./16.04/install_elasticsearch.sh
在安装 JAVA 的时候可能会比较慢,需要耐心等待。这个脚本会安装最新版本的Elasticsearch以及对应版本的 IK 分词插件。
如果安装 JAVA 的过程持续超过 10 分钟,可以试试开一个新的终端窗口并ssh登录到服务器,然后执行
$ tail-f /var/log/laravel-ubuntu-init.log
这一列是平均下载速度,如果这个值比较低,可能是国际带宽不稳定,可以换一个时间再试试。
当屏幕显示『安装完毕』之后,我们来确认一下Elasticsearch是否正常运行,执行以下命令:
$ psaux|grepelasticsearch
$ curl127.0.0.1:9200
第一个命令是查看是否有Elasticsearch进程,第二个命令是尝试调用Elasticsearch的接口。正常的输出如下:
为了安全考虑,通常我们不会直接用Mysql的 root 账号作为项目中连接Mysql的账号,这样即使项目出现了 SQL 注入漏洞,也可以把风险控制在当前项目中,而不会影响到使用同一数据库的其他项目。
因此接下来我们需要给Laravel Shop
项目创建一个独立的Mysql用户以及对应的数据库,之前的安装脚本里有封装好的脚本,可以直接执行:
$ cd~/laravel-ubuntu-init/
$ ./16.04/mysql_add_user.sh
首先会询问Mysql的 root
密码,填入之前在屏幕上的 root
密码;用户名输入 laravel-shop
;创建同名数据库输入 y
:
可以看到创建成功,同时屏幕上有新账户的密码,保存好。
现在我们来测试一下,输入以下命令:
$ mysql-u'laravel-shop'-p
在 Enter password:
处粘贴刚刚保存的密码并回车,如果密码正确可以看到以下界面:
现在我们来看看数据库是否创建成功:
mysql> show databases;
可以看到 laravel-shop 说明创建成功。
接下来我们需要把我们的代码部署到云服务器上。
在部署代码到服务器之前,我们需要先在 Homestead 中将代码 Push 到Github上:
$ cd/var/www/
// 删除之前创建的站点目录
$ rm-rfpro/
// 末尾的laravel-shop 不要漏,代表克隆项目到pro目录中
$ sudowww'git clone https://{你自己的github项目地址} laravel-shop'
$ cdpro/
如果我们用 root
身份去执行 git clone
命令,克隆下来的目录和文件会归属于 root
账户,而 PHP 和Nginx的运行账户都是 www-data
,这就会导致Nginx / PHP 无法读写项目目录,从而导致我们的站点无法正常运行。
因此我们应该以 www-data
身份去执行命令,这样创建的目录和文件就归属于 www-data
,之后所有可能生成文件的命令我们都应该以 www-data
身份去执行。
为了让我们更方便地以 www-data 身份执行命令,安装脚本提供了 sudowww
这个别名,它等价于 sudo -H -u www-data sh -c
,使用时只需要在原命令两端加上单引号即可。
请确保上面每一步都成功之后再执行下一个的命令,最终输出如下:
接下来我们需要下载 composer 包,由于 composer install
命令会往 vendor
目录写文件,因此需要用 www-data
身份执行:
$ sudowww'composer install'
正式的部署应该要加上 --no-dev 参数来避免安装只有开发环境才需要的包,而这里没有加这个参数是因为我们之后需要执行
db:seed
来生成假数据,而db:seed
会依赖于一个开发环境包fzaninotto/faker
。
上面命令输出如下:
中间部分省略…
接下来我们需要下载Nodejs依赖,我们编译前端代码的时候需要用到这些依赖,同样由于 yarn
命令会写入文件,所以需要加上 sudowww
:
$ sudowww'SASS_BINARY_SITE=http://npm.taobao.org/mirrors/node-sass yarn'
网络环境不好的情况下可能会比较慢,耐心等待。
接下来我们需要创建一个 .env
文件,先复制 .env.example
到 .env
:
$ sudowww'cp .env.example .env'
// php命令也要用sudowww
$ sudowww'php artisan key:generate'
$ vim.env
然后将 .env
文件按如下内容修改:
APP_NAME="Laravel Shop"
APP_ENV=production
APP_KEY={保持原本的值}
APP_DEBUG=false
APP_URL=http://{你的服务器 IP}
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel-shop
DB_USERNAME=laravel-shop
DB_PASSWORD={刚刚创建的Mysql用户密码}
BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=redis
SESSION_DRIVER=file
SESSION_LIFETIME=120
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
ES_HOSTS=127.0.0.1:9200
接下来我们需要创建数据库表,执行命令:
$ sudowww'php artisan migrate'
由于我们把 .env
中的 APP_ENV
设成了 production
,因此会询问我们是否确认操作,输入 yes
后回车:
然后是Elasticsearch的迁移命令:
$ sudowww'php artisan es:migrate'
接下来我们通过 db:seed
命令生成假数据:
$ sudowww'php artisan db:seed'
$ sudowww'php artisan db:seed --class=DDRProductsSeeder'
同样会询问是否确认,均输入 yes
回车:
接下来我们需要把管理后台的菜单、权限、管理用户的数据导入到系统中,执行以下命令:
$ mysql-uroot-p laravel-shop < database/admin.sql
然后输入Mysql root 密码并回车:
现在访问 http://{外网 IP}/admin 并以用户 admin 密码 admin 登录:
能正常登陆说明后台数据导入成功。
接下来构建前端代码,需要以 www-data
身份执行:
$ sudowww'yarn production'