前言
Tinywebserver是github上一个十分优秀的开源项目,帮助初学者学习如何搭建一个服务器.

本文讲述如何在使用docker部署mysql容器的情况下跟该项目进行连接并将项目运行起来,而不是直接使用普通的mysql与该项目连接

主流的运行方式
运行Tinywebserver服务器

运行项目

下面讲述如何把mysql容器和项目进行连接,前提是你需要有一个正在运行的mysql容器.

1.下载项目的源代码

git clone https://github.com/qinguoyi/TinyWebServer.git

2.使用文本编辑器或者Clion打开项目,找到main.cpp

在这里插入图片描述

在这个位置,写入你docker中mysql容器的用户名,密码,还有数据库的名字,这里数据库的名字随意.

3.进入mysql容器之中创建一个跟你上面名字一样的数据库(前提是保证你的mysql容器正在运行,可以参考之前的文章)

docker exec -it mysql bash
mysql -u root -p

创建一个数据库

	create database yourdb;
	USE yourdb;
    CREATE TABLE user(
        username char(50) NULL,
        passwd char(50) NULL
    )ENGINE=InnoDB;
    INSERT INTO user(username, passwd) VALUES('name', 'passwd');

这样才能跟项目中登陆界面的用户名-密码相匹配.
运行好项目之后,用户的登录名-密码就会存在这个表之中

4.将mysql的容器的ip地址和端口绑定到项目上

在项目中的sql_connection.cpp文件中,定义了数据库的属性IP地址,端口,数据库名,密码等.

在这里插入图片描述
然后在项目中的Webserver.cpp中,定义了初始化数据库连接池的函数
在这里插入图片描述
其中url默认是 localhost

如果你是直接下载的mysql,而非docker实例化的mysql容器的话,这里的localhost是不需要更改的.
但是如果是docker实例化的mysql容器,我们需要把localhost替换成mysql容器的IP地址

我们可以用如下方式查看容器的IP地址:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <容器名称或容器ID>

之后就会在控制台上显示一行ip地址,替换localhost即可

接下来我们还要检查一下端口,原项目默认的端口是3306,如果你的mysql容器所占用的端口不是3306的话,你需要也把这里的3306替换成的mysql容器的端口

使用命令

docker ps

即可看到mysql容器对应的端口了
绑定好mysql容器的端口和ip地址之后,接下来的操作就都一样了

5.编译Tinywebserver服务器项目

cd Tinywebserver
sh ./build.sh

这里是用shell解释器,执行build.sh脚本中的shell命令
这个build.sh脚本中只有一行命令,就是【make server】,构建server目标文件
这个地方对应该项目中的makefile文件,接下来我们来分析一下它的makefile文件
不关心这部分的话可以直接跳过这部分内容直接往下看.
makefile

CXX ?= g++

DEBUG ?= 1
ifeq ($(DEBUG), 1)
    CXXFLAGS += -g
else
    CXXFLAGS += -O2

endif

server: main.cpp  ./timer/lst_timer.cpp ./http/http_conn.cpp ./log/log.cpp ./CGImysql/sql_connection_pool.cpp  webserver.cpp config.cpp
	$(CXX) -o server  $^ $(CXXFLAGS) -lpthread -lmysqlclient

clean:
	rm  -r server
CXX ?= g++:定义了一个变量CXX,并将其默认值设置为"g++",表示编译器的命令。

DEBUG ?= 1:定义了一个变量DEBUG,并将其默认值设置为"1",表示是否开启调试模式。

ifeq ($(DEBUG), 1) 和 else 和 endif:这是一个条件语句块,用于根据DEBUG的值设置CXXFLAGS变量。如果DEBUG的值为1,则将CXXFLAGS设置为"-g",表示开启调试信息;否则,将CXXFLAGS设置为"-O2",表示优化编译。

server: main.cpp ./timer/lst_timer.cpp ./http/http_conn.cpp ./log/log.cpp ./CGImysql/sql_connection_pool.cpp webserver.cpp config.cpp:定义了一个目标"server",它依赖于多个源文件,包括main.cpp、lst_timer.cpp、http_conn.cpp、log.cpp、sql_connection_pool.cpp、webserver.cpp和config.cpp。

$(CXX) -o server $^ $(CXXFLAGS) -lpthread -lmysqlclient:这是生成目标"server"的命令。使用变量$(CXX)表示编译器命令,-o指定输出文件名为"server",$^表示所有依赖文件的列表,$(CXXFLAGS)表示编译器选项,-lpthread和-lmysqlclient表示链接的库文件。

clean: rm -r server:定义了一个目标"clean",用于删除生成的目标文件"server"。通过运行make clean命令,可以执行此命令来清理编译过程中生成的文件。

该Makefile文件的主要作用是定义了编译目标"server"的规则,包括依赖关系和编译选项。通过运行make server命令,可以编译生成名为"server"的可执行文件。而运行make clean命令则可以清理生成的目标文件。

编译时遇到的错误:fatal error: mysql.h: No such file or directory
解决方法:安装链接库

apt-get install libmysqlclient-dev
./server

此时命令是不会退出的,会一直占用控制台.
如果命令直接退出,就是运行失败,此时可以查看项目的日志查看报错信息;在项目中会生成一个serverlog文件
在这里插入图片描述
如果该文件中有这样的提示,说明数据库没连接上
你需要检查你的数据库名,密码,IP地址,端口,表结构等信息确保数据库没有问题.

接着在浏览器中输入 ip地址:9006即可进入项目

查看虚拟机的ip地址:

ip addr

在这里插入图片描述
端口9006是项目默认的端口
它的位置在Config.cpp文件中,可以自行修改
在这里插入图片描述
接下来就可以直接在浏览器中输入 ip:9006运行项目,运行结果如图:
在这里插入图片描述
出了这个图代表运行成功了


运行时遇到的一些其他问题

重启mysql容器时发现端口被占用

当我使用命令

docker restart mysql

时,系统提示我这个端口正在使用,重启失败,但是我通过docker ps
查看所有正在运行的容器时,并没有mysql,使用 docker stop mysql也无济于事.

如下是解决方法:

sudo lsof -i :端口号

这样就可以找到占用这个端口号的进程,接下来使用指令

sudo kill 进程号

就可以杀死这个进程,正常使用该端口了

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐