在Vapor奇幻之旅(01开篇) 中我介绍了如何用swift来构建web应用,这篇文章我会介绍如何在ubuntu服务器上部署vapor项目。
我使用的系统环境是 Ubuntu 16.04,这里的教程理论上来说在Ubuntu 14.04和16.10上均适用:
下面是配置服务器的步骤:
安装配置Nginx
代码语言:javascript复制$ sudo apt-get update
$ sudo apt-get install nginx
安装完Nginx后需要配置防火墙,如果不用防火墙也没有问题,作为练习使用可以关闭防火墙。第一次弄这个的时候我开了防火墙,发现ssh连接不上了,后来想到可能是防火墙阻止了,于是去阿里云网站打开终端关闭了防火墙,这时才能用系统的终端连接ssh。
防火墙配置如下:
代码语言:javascript复制$ sudo ufw allow 'Nginx HTTP'
$ sudo ufw status
执行以下命令查看Nginx的运行状态:
代码语言:javascript复制systemctl status nginx
可以看到这时nginx已经运行起来了
image.png
此时输入服务器的ip地址,就可以看到nginx的欢迎页面了。
安装Vapor
代码语言:javascript复制$ eval "$(curl -sL https://apt.vapor.sh)"
$ sudo apt-get install swift vapor
$ eval "$(curl -sL check.vapor.sh)"
完成安装后可以在服务器上随手创建一个项目以供测试:
代码语言:javascript复制vapor new HelloVapor
配置Nginx
编辑/etc/nginx/sites-available目录下的default.conf
代码语言:javascript复制server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
try_files $uri @proxy;
location @proxy {
proxy_pass http://127.0.0.1:8080;
proxy_pass_header Server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass_header Server;
proxy_connect_timeout 3s;
proxy_read_timeout 10s;
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
#try_files $uri $uri/ =404;
}
}
这时候nginx已经配置好了
重启nginx
代码语言:javascript复制sudo systemctl restart nginx
编译并运行刚刚创建好的项目
代码语言:javascript复制cd ~/HelloVapor
vapor build
vapor run
这时候打开浏览器输入地址(http://服务器的ip/HelloVapor)就可以在浏览器看到
代码语言:javascript复制{"hello":"world"}
安装配置Supervisor
当我们用vapor run在服务器上运行web应用时,我们会发现命令行不能继续进行其他操作,如果使用ctr c退出当前操作或者关闭控制台,则不能继续访问HelloVapor程序,这是因为退出的时候我们的web应用的进程也随着一起关闭了。以前我试过很多方法,但是都并不稳定,直到官方推荐了Supervisor,我才如获至宝,Supervisor是一个进程管控程序,可以让我们很容易的控制vapor程序的启动和停止
- 安装Supervisor
sudo apt-get update
sudo apt-get install supervisor
- 配置Supervisor
1、进入/etc/supervisor/conf.d目录
2、使用vim创建HelloVapor.conf的配置文件
代码语言:javascript复制vim HelloVapor.conf
- 插入以下内容:
[program:HelloVapor]
command=/root/HelloVapor/.build/release/Run serve --env=production
directory=/root/HelloVapor
autostart=true
autorestart=true
user=root
stdout_logfile=/var/log/supervisor/%(program_name)-stdout.log
stderr_logfile=/var/log/supervisor/%(program_name)-stderr.log
environment=PORT=8080
- 修改项目里的Config/production/servers.json
只需要修改这一行
"port": "$PORT"
这样项目就可以使用supervisor配置的端口了
- 加载刚刚的配置:
sudo supervisorctl reread
sudo supervisorctl add hello
sudo supervisorctl start hello
注意,如果运行到reread这里报错ERROR (spawn error)
请检查.conf写的是否正确,配置完之后一定要reread。
如果有必要可以执行
代码语言:javascript复制sudo supervisorctl reload
有其他报错可以到/var/log/supervisor/目录下查看日志
以下命令查看supervisor的状态:
代码语言:javascript复制supervisorctl status
显示
代码语言:javascript复制HelloVapor RUNNING pid 15221, uptime 0:00:16
说明运行成功
这时候我们再访问地址(http://服务器的ip/HelloVapor)就可以看到hello world 的json了。
Trouble Shooting
- 一步一步调试,运行成功再进行下一步
- 如果不成功,回滚到可以运行的配置,逐步添加配置来测试
- 在服务器上使用template创建应用会显示404页面,因为template还没有更新,可以创建纯净版的项目然后在Package.swift里面添加相关依赖,手动构建工程。
- 如果在配置中有疑问,欢迎在评论区讨论
关于Vapor其他知识,可以参考以下文章:
Vapor奇幻之旅(01开始)
Vapor奇幻之旅(02部署)
Vapor奇幻之旅(03上手)
Vapor奇幻之旅(04Routing)
Vapor奇幻之旅(05 Fluent)
Vapor奇幻之旅(06 PostgreSQL)
Vapor奇幻之旅(07 连接服务端PostgreSQL)
Vapor奇幻之旅(08 连接服务端MongoDB)
Vapor奇幻之旅(09 连接MySQL)
希望你对我的教程能够喜欢,你们的赞是我持续的动力,欢迎加入QQ群参与互动:431296189