Ubuntu16.04上使用Nginx部署Laravel应用程序

Laravel 是一个非常流行的PHP框架,以编码风格优雅著称,每行代码都非常简洁,富有表达力,并且拥有强大的组件开发生态,号称为web艺术家创造的PHP框架。我最近的个人项目尝试了下Laravel框架,部署的的时候遇到了一些坑,这里记录下。

我用的服务器是DigitalOcean的Ubuntu 16.04 LTS,其他公司的服务器应该也大同小异,有一些公司甚至简化了安装流程,几乎不用改动配置文件就可以让自己的程序跑起来(比如阿里云

安装依赖

更新apt-get

1
sudo apt-get update

安装 php7.0

1
sudo apt-get install php7.0-mbstring php7.0-fpm php7.0-xml composer unzip

配置MySql

安装

1
2

sudo apt-get install mysql-server

安装期间会提示你设置新的密码,一定要记住了。

配置

登录MySQL root 账号:

1
mysql -u root -p

然后创建一个名为 laravel 的数据库,数据库可以是别的名字:

1
CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

然后再创建一个允许访问这个数据库的用户,这里使用 laraveluser 作为用户名

1
GRANT ALL ON laravel.* TO 'laraveluser'@'localhost' IDENTIFIED BY 'password';

刷新权限

1
FLUSH PRIVILEGES;

退出

1
EXIT;

安装 pdo_mysql

pdo_mysql 是php需要用到的mysql的驱动

1
sudo apt-get install php7.0-mysql

安装nginx

安装

1
sudo apt install nginx

安装 laravel

这里使用laravel 发布在GitHub 上的演示程序 QuickStart 来作为例子。

先在nginx目录下创建一个叫quickstart的文件夹

1
sudo mkdir -p /var/www/html/quickstart

然后到新目录将项目git clone 下来

1
2
cd /var/www/html/quickstart
git clone https://github.com/laravel/quickstart-basic .

注意 git clone 最后有个点

然后安装laravel的依赖

1
composer install

配置 .env

1
vim .env

修改数据库字段:

1
2
3
4
5
6
7
8
9
APP_ENV=local
APP_DEBUG=true
APP_KEY=b809vCwvtawRbsG0BmP1tWgnlXQfdsaw
APP_URL=http://localhost

DB_HOST=127.0.0.1
DB_DATABASE=laravel
DB_USERNAME=laraveluser
DB_PASSWORD=password

保存,退出

迁移数据库

1
php artisan migrate

配置 Nginx

将storage和bootstrap/cache目录的组所有权更改为www-data, 因为服务器需要向这两个文件夹里面写东西

1
2
sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache

修改配置文件

1
vim /etc/nginx/sites-enabled/default
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
server {
listen 80;
listen [::]:80;
root /var/www/html/quickstart/public;

# Add index.php to the list if you are using PHP
index index.php index.html index.nginx-debian.html;

server_name _;
location / {

try_files $uri $uri/ /index.php?$query_string;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
include snippets/fastcgi-php.conf;
#
# # With php7.0-cgi alone:
# fastcgi_pass 127.0.0.1:9000;
# # With php7.0-fpm:
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
deny all;
}
}

然后

1
sudo systemctl reload nginx

现在访问服务器IP地址就可以浏览网页了。


我遇到过的报错

Operation timed out (IPv6 issues)

You may run into errors if IPv6 is not configured correctly. A common error is:
The “https://getcomposer.org/version" file could not be downloaded: failed to
open stream: Operation timed out

1
sudo sh -c "echo 'precedence ::ffff:0:0/96 100' >> /etc/gai.conf"

No application encryption key has been specified.

1
php artisan key:generate

Laravel 5.4: Specified key was too long error

1 PDOException::(“SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes”)
/home/pi/Desktop/kxcrmserver/vendor/laravel/framework/src/Illuminate/Database/Connection.php:458
2 PDOStatement::execute()
/home/pi/Desktop/kxcrmserver/vendor/laravel/framework/src/Illuminate/Database/Connection.php:458

1
2
3
4
5
6
use Illuminate\Support\Facades\Schema; 

public function boot() {
Schema::defaultStringLength(191);
}

nginx 的错误日志在这个位置:/var/log/nginx/error.log,大部分问题都需要查看日志然后单独解决。