Iris 与 Django 框架搭建服务器 实例应用
从windows到云服务器
目标是在云服务器上构建网站,后端使用iris和django框架,基于Ubuntu-20.04.5-live-server,windows10上使用VMware® Workstation 16 Pro,ngrok测试后,再移植到云服务器,做一下记录。
Ubuntu-20.04.5-live-server的安装
官网下载:ubuntu-20.04.5-live-server-amd64 iso文件。
虚拟机配置:
安装过程:
1.语言选择
-
选择是否升级
-
键盘布置
-
网络设置
-
主机拨号上网,虚拟机网络设置经验
虚拟机设置,网络设置选择仅主机模式。windows 找到更改适配器选项设置,选择主机上网网卡,属性----共享-----选择虚拟机网卡,观察虚拟机ip变化,直至跳出ip地址,在下一步镜像地址中进行验证是否连接成功。
-
代理设置
-
设置镜像源
-
硬盘配置
8.磁盘分区:主要设置"/SWAP"内存的2倍,“/boot” 1G,"/ “20G以上,”/home"20G以上。
9.设置相关名称和密码
10.安装ssh,用于远程登陆
11.开始安装
12.安装完成后,卸载iso文件,重启。
13.本地安装KDE桌面,sudo 执行
apt update
apt upgrade
apt install kubuntu-desktop #资源占用大,本地测试安装,服务端放弃。
系统配置
1.配置输入法,kde下增加中文字体,设置时区。
2.安装输入法,apt install fcitx fcitx-googlepinyin, 编辑profile, 添加export GTK_IM_MODULE=fcitx; export QT_IM_MODULE=fcitx; export XMODIFIERS=“@im=fcitx”。
3.输入法设置
4.完成基本配置
创建docker
#关注官网 https://docs.docker.com/engine/install/ubuntu/
1.curl -sSL https://get.daocloud.io/docker | sh
2.拉取镜像:sudo docker pull ubuntu:20.04
3.创建容器并绑定端口:sudo docker run -itd -p 192.168.1.101:80:8080 --name XXXXX ubuntu:20.04
4.开启容器:sudo docker start XXXXXXXXXXX
5.进入容器:sudo docker exec -it xxxxxxx /bin/bash
6.至此,系统和Docker配置完成,接下来就是在Docker环境下搭建服务器。
安装Iris框架
1.下载golang,安装。
apt-get update
apt-get install wget
wget https://golang.google.cn/dl/go1.19.3.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.19.3.linux-amd64.tar.gz # 解压
sudo vim /etc/profile #配置
export PATH=$PATH:/usr/local/go/bin
go env -w GOPROXY=https://goproxy.cn,direct,#国内源
go env -w GO111MODULE=on #启用mod
中文乱码问题:
locale #查看当前字符情况
apt-get install language-pack-zh-hans
vim /etc/profile 添加export LANG=C.UTF-8
source /etc/profile
sudo docker restart
go mod init 项目名称
go mod tidy
package main
import (
"encoding/json"
"os"
"path/filepath"
"website/pythonapp" //python 应用shell方式
"website/databases" // Mysql
"github.com/kataras/iris/v12"
_ "github.com/go-sql-driver/mysql"
)
var db *sql.DB
var stau int
type sqluser struct { //数据库用户结构体
username string
UserInfo_id int
password string
token string
}
var u sqluser
const maxSize = 8 * iris.MB //定义上传文件大小
func main() {
app := iris.Default()
stau, db = databases.InitDB() //数据库初始化
f, _ := os.Create("iris.log")
app.Logger().SetOutput(f)
app.Configure(iris.WithConfiguration(iris.Configuration{
//如果设置为true,当人为中断程序执行时,则不会自动正常将服务器关闭。如果设置为true,需要自己自定义处理。
DisableInterruptHandler: false,
//该配置项表示更正并将请求的路径重定向到已注册的路径
//比如:如果请求/home/ 但找不到此Route的处理程序,然后路由器检查/home处理程序是否存在,如果是,(permant)将客户端重定向到正确的路径/home。
//默认为false
DisablePathCorrection: false,
//
EnablePathEscape: false,
FireMethodNotAllowed: false,
DisableBodyConsumptionOnUnmarshal: false,
DisableAutoFireStatusCode: false,
TimeFormat: "Mon,02 Jan 2006 15:04:05 GMT",
Charset: "utf-8",
}))
app.Post("/irisfile", upfiles)
app.Run(iris.Addr(":8080"))
}
func upfiles(ctx iris.Context) {
path := "/home/"
ctx.SetMaxRequestBodySize(maxSize)
name := ctx.PostValue("name")
password := ctx.PostValue("password")
var res string
if stau != 0 {
sqlstring := "select * from UserInfo where username=" + "'" + username + "'"
err := db.QueryRow(sqlstring).Scan(&u.UserInfo_id, &u.username, &u.password, &u.token)
if err != nil {
res = "用户不存在"
} else {
if u.username == name {
if u.password == password {
defer img.Close()
destimg := filepath.Join(path, imghead.Filename)
_, errimg = ctx.SaveFormFile(imghead, destimg)
if errimg != nil {
ctx.JSON(iris.Map{
"code": "500",
"msg": errimg.Error(),
})
return
res = pythonapp.Ocr()
} else {
res = "密码错误"
}
} else {
res = "用户名不存在"
}
}
}
}
ctx.JSON(iris.Map{
"msg": res,
})
}
package pythonapp
var djstaue string
req := requests.Requests()
data := requests.Datas{
"img": jppath + "/" + "jp.jpg",
}
resp, errdj := req.Post("http://127.0.0.1:8080/starocr/", data) #django
安装Django框架
#安装python3.8
apt-get install python3.8
export PATH=$PATH:/usr/bin/python3.8
apt-get install pip //pip 附加很多GCC,G++等
#安装Django
pip install Django
#创建项目
django-admin startproject xxx
cd xxx
#创建应用
python3 manage.py startapp xxx
配置setting.py文件: ALLOWED_HOSTS = [‘修改为本机地址或服务器地址’]或者为服务器IP地址不含端口,INSTALLED_APPS 增加‘xxx’创建的应用。
测试:python3 manage.py runserver 127.0.0.1:8080
url和views:各个应用下创建视图函数和路由函数,项目名称下有总视图函数和路由函数,总路由函数中设置应用中的路由:include(‘xxx.urls’),name参数为反定向路由,name的值等于Html中{% url ‘name’%} ,本次实例用不到。
安装uwsgi
pip install uwsgi --no-cache-dir #禁用缓存,编译
#配置
vim uwsgi.ini
[uwsgi]
;对外提供 http 服务的端口,使用Ngrok时,使用http
;https=0,/server.crt,/server.key,HIGH #ssl证书
;shared-socket = 0.0.0.0:443
http = 127.0.0.1:8005
;使用nginx连接时使用,Django程序所在服务器地址
;socket=127.0.0.1:8005
; 通过该端口可以监控 uwsgi 的负载情况
;stats = 0.0.0.0:1004
;PYTHONHOME = /documents/MonitorCenter/MonitorCenter/venv/bin/python3
;home=/documents/MonitorCenter/MonitorCenter
;项目目录
chdir=/mysite
;项目中wsgi.py文件的目录,相对于项目目录
wsgi-file=mysite/wsgi.py
;home=/vcmt #虚拟环境下启用
;static-map=/static=/home/lxx/mysite/static
; 进程数
processes=5
; 线程数
threads=8
enable-threads=true
; 设置一个请求的超时时间(秒),如果一个请求超过了这个时间,则请求被丢弃
harakiri = 60
;置工作进程使用物理内存超过N MB就回收重启
reload-on-rss=2048
; 设置工作进程使用虚拟内存超过N MB就回收重启
reload-on-as= 1024
; uwsgi服务器的角色
master=True
; 存放进程编号的文件
module=mystite.wsgi
; 日志文件,因为uwsgi可以脱离终端在后台运行,日志看不见。我们以前的runserver是依赖终端的
daemonize=/logs/uwsgilog/uwsgi.log
stats=/logs/uwsgilog/uwsgi.status
pidfile=/logs/uwsgilog/uwsgi.pid
; 指定依赖的虚拟环境
;virtualenv=/home/python/.virtualenvs/django_py3
# 设置socket的监听队列大小(默认:100)。
listen=1024
# 设置用于uwsgi包解析的内部缓存区大小。默认是4k
buffer-size=65535
;设置每个工作进程处理请求的上限,达到上限时,将回收(重启)该进程。可以预防内存泄漏
max-requests=50
; 服务停止时自动移除unix Socket和pid文件
vacuum=true
uwsgi --ini uwsgi.ini 启动
Docker 移植服务器
#将容器生产镜像
sudo docker commit -a "署名" -m "备注信息" 容器ID 镜像名称
sudo docker commit -a "csdn" -m "2022年完成配置" 32ecdcd60e19 phone:1.0
#保存镜像,磁盘空间可能不足,必要时迁移数据腾空间
sudo docker save phone1.0 > test.tar
#上传服务器
pscp test.tar csdn@ip:路径
#服务器加载镜像
sudo docker load < test.tar
#创建新容器
sudo docker run -itd -p 192.168.1.101:80:8080 --name XXXXX phone1.0
#docker 端口映射修改 /var/lib/docker/containers/ID/hostconfig.json
实例说明
1.对外web由iris控制输出,映射docker端口,Python实例应用为OpenCV,paddleocr,go调用Python,一是引用go-python包(没尝试过);二是直接shell命令运行,三是Django,用于内部127.0.0.1,go request 请求Django;此实例应用第三中方案。