C++
纲领性
https://github.com/0voice/introduce_c-cpp_manual
https://github.com/0voice/cpp_new_features
webserver项目
相关参考资料
https://www.nowcoder.com/discuss/353159561039257600?sourceSSR=search
https://www.agedcat.com/post/4f05b258
https://github.com/qinguoyi/TinyWebServer
https://www.nowcoder.com/discuss/419276598265827328?sourceSSR=search
视频教程:
https://www.nowcoder.com/study/live/690/4/8
项目部署
所用的开源项目链接:
https://github.com/markparticle/WebServer
部署平台和相关环境
- 腾讯云服务器ubuntu 18.04 LTS
- mysql 5.7.41(ubuntu 18.04默认安装这个版本)
坑:一开始用的是ubuntu 20.4,默认安装mysql 8,然后配置mysql账户密码时不能使用webserver相关代码。
坑:还用了wsl尝试部署,但是同样的操作,最后运行make出的文件,项目会出奇怪的bug,无法正常启动
mysql安装与配置
参考:
https://segmentfault.com/a/1190000023081074
- 安装mysql的三个东西:
//本体,真正的mysql服务器
sudo apt-get install mysql-server
//mysql命令行客户端,提供mysql -u root -p这种功能的
sudo apt-get install mysql-client
//编程用到的静态文件、链接库等,例如项目中用到的mysql.h
sudo apt-get install libmysqlclient-dev
- 更改密码,目的是创造一个默认的root用户,使得可以在命令行登录
mysql -u root -p
。先查看目前mysql默认安装情况下的用户名和密码配置:
sudo cat /etc/mysql/debian.cnf
- 用查到的密码登录mysql:
//查到的密码为:
password=xxxxxxxxxx
//查到的用户名为:
debian-sys-maint
//登录:
mysql -u debian-sys-maint -p
//输入上面查到的密码
- 成功登录mysql后,需要修改密码:
use mysql;
// 下一行,密码改为了yourpassword,可以设置成其他的
update mysql.user set authentication_string=password('yourpassword') where user='root' and Host ='localhost';
update user set plugin="mysql_native_password";
flush privileges;
quit;
坑:
一开始用的是ubuntu 20.4,默认安装mysql 8,然后配置mysql账户密码时不能使用上面的相关代码,还把mysql弄的无法登陆了。最终重装ubuntu 18.04完全复刻原始项目配置才成功。
- 修改完密码之后,重启mysql服务并用新设置的root用户登录。若成功,说明mysql已经安装并配置完毕
sudo service mysql restart
mysql -u root -p 新密码
项目初始化并运行
- 初始化mysql用户表,这个表用来存储网站的合法登录用户。
// 建立yourdb库
create database yourdb;
// 创建user表
USE yourdb;
CREATE TABLE user(
username char(50) NULL,
password char(50) NULL
)ENGINE=InnoDB;
// 添加数据
INSERT INTO user(username, password) VALUES('name', 'password');
- 将项目从github clone下来
国内服务器由于网络关系,访问github速度慢且不稳定,可使用一些中间代理加速:
//原始clone链接
git clone https://github.com/markparticle/WebServer.git
//加速clone链接
git clone https://gitclone.com/github.com/markparticle/WebServer.git
参考:https://cloud.tencent.com/developer/article/1744627
vim修改主函数中相关的数据库用户名、数据库密码、项目要部署到的网络端口
一次使用vim修改main.cpp的基础流程:
#使用vim打开目标文件
vi main.cpp
sudo vi main.cpp //在wsl中,文件通常是只读,权限不够时需要修改文件就要加sudo
#打开文件以后按i进行insert,开始修改目标文件
i
#键盘上的pageup,pagedown可以帮助快速翻页
#编辑完成以后保存并退出
esc //先退出编辑模式,进入操作模式
:q //不保存直接退出
:wq //保存并退出
main.cpp:
/*
* @Author : mark
* @Date : 2020-06-18
* @copyleft Apache 2.0
*/
#include <unistd.h>
#include "server/webserver.h"
int main() {
/* 守护进程 后台运行 */
//daemon(1, 0);
WebServer server(
1316, 3, 60000, false, /* 端口 ET模式 timeoutMs 优雅退出 */
3306, "root", "root", "webserver", /* Mysql配置 */
12, 6, true, 1, 1024); /* 连接池数量 线程池数量 日志开关 日志等级 日志异步队列容量 */
server.Start();
}
上面需要修改的部分:
WebServer server(
1316, 3, 60000, false, /* 这里的1316就是我们要部署到的端口
3306, "root", "root", "webserver",
/* Mysql配置 第一个参数:默认localhost连接端口,第二个参数:要使用的mysql登录用户名,第三个参数:要使用的mysql登录用户的密码 */
12, 6, true, 1, 1024); /* 连接池数量 线程池数量 日志开关 日志等级 日志异步队列容量 */
生成可执行项目的文件并运行项目
使用make工具编译链接项目中的代码文件,生成可执行文件server
- 在项目根目录下运行
make
- 执行上一步make中生成的可执行文件
server
./bin/server
上述过程发生了什么?
-
在项目根目录下
make
:这将会使用根目录下Makefile中的配置进行make操作
/Makefile:
all:
mkdir -p bin
cd build && make
可以看到,makefile中其实就是提前写好的shell指令集合
第一步,创建bin文件夹;第二步,进入build文件夹并在build下执行make
- 让我们继续看看build下的make在干嘛:
/build/Makefile:
CXX = g++
CFLAGS = -std=c++14 -O2 -Wall -g
TARGET = server
OBJS = ../code/log/*.cpp ../code/pool/*.cpp ../code/timer/*.cpp \
../code/http/*.cpp ../code/server/*.cpp \
../code/buffer/*.cpp ../code/main.cpp
all: $(OBJS)
$(CXX) $(CFLAGS) $(OBJS) -o ../bin/$(TARGET) -pthread -lmysqlclient
clean:
rm -rf ../bin/$(OBJS) $(TARGET)
可以看到,这是在编译源文件,生成TARGET = server,其中c++使用c++14版本,编译器为g++之类的。
使用浏览器测试部署好的项目
在浏览器中输入
云服务器公网ip:项目部署的port
我这里的port为1316(端口配置写在根目录的main.cpp中,可通过vim自行修改)
服务器防火墙/安全组设置
如果对服务器使用经验不足或者计算机网络敏锐度差一些,很可能意识不到这个问题,在云服务器上部署并运行server可执行文件以后,启动项目的bash进程进入阻塞,暗示项目跑起来了,但是自己用个人电脑访问(云服务器公网ip:项目部署的port)
却拿不到http响应。
对于云服务器,每个向外暴露的端口都要设置在防火墙里,否则外界无法访问,因此为程序需要的端口设置防火墙.
在腾讯云服务器的防火墙配置中,添加
端口为1316,连接方式为TCP的新规则
然后使用个人电脑浏览器(比如自己的windows笔记本)访问(云服务器公网ip:项目部署的port)
。观察到:浏览器成功拿到了http响应。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构