使用SSH客户端(如SecureCRT)远程连接Linux操作系统,使用动态开发语言Node.js搭建网页运行环境,并实现从MySQL中读取学生学号和姓名信息到页面中显示。
要求分别在本地和云端操作成功,云端的网页能被外网访问。
本地操作系统:Windows 10
本地虚拟机运行平台:VMware Workstation Pro 14
本地虚拟机镜像:CentOS-7-x86_64-Minimal-1908.iso
云服务器提供商:阿里云计算有限公司
Linux发行版本及版本号:CentOS 7.6 64位
SecureCRT
本人安装的是Node.js 12.16.3版本,其他版本的安装和配置可能有所变化。
详见博客《Linux实验:MySQL的安装和配置》。
wget -c https://nodejs.org/dist/v12.16.3/node-v12.16.3-linux-x64.tar.xz
tar -xvf node-v12.16.3-linux-x64.tar.xz
# 移动到/usr/local/nodejs文件夹下
mv node-v12.16.3-linux-x64 /usr/local/nodejs
# 建立软链接使得能全局使用node命令
ln -s /usr/local/nodejs/bin/node /usr/bin/node
# 建立软链接使得能全局使用npm命令
ln -s /usr/local/nodejs/bin/npm /usr/bin/npm
# 查看node版本
node –v
# 查看npm版本
npm -v
网址https://nodejs.org/dist/有许多Node.js版本可供选择和下载。
npm install mysql
# 在当前目录下新建Node.js的工作目录
mkdir nodejs
cd nodejs
# 网页文件放在工作目录下
vi MyNodejs.js
# 按下i键进入编辑模式,输入以下内容:
var mysql = require('mysql');
// 创建数据库连接
var connection = mysql.createConnection({
host : 'localhost',
user : '用户名',
password : '密码',
port : '3306',
database : '数据库名'
});
connection.connect(); // 连接数据库
var sql = 'SELECT * FROM 数据表名'; // 编写sql查询语句
// 执行sql语句并在控制台输出结果
connection.query(sql,function(err,result){
if(err){
console.log('数据库访问失败: ', err.message);
return;
}
console.log(result);
});
connection.end(); // 断开数据库连接
# 按下esc键退出编辑模式
# 保存并退出文件
:wq
# 运行网页文件
node MyNodejs.js
# 查看结果后ctrl+c结束网页文件的运行
Node.js连接MySQL语法参考《Node.js 连接 MySQL | 菜鸟教程》。
# 本人使用9080作为Node.js文件访问的端口
# 重启防火墙,以保证防火墙一定是开启的
systemctl restart firewalld
# 在防火墙添加端口9080且设置永久开启
firewall-cmd --zone=public --add-port=9080/tcp --permanent
# 重新加载防火墙,使上一步操作生效
firewall-cmd --reload
# 查看9080端口是否开放
firewall-cmd --zone=public --query-port=9080/tcp
如果是Linux云服务器,则还要在阿里云服务器控制台增加端口为9080的安全组规则,才能保证Node.js网页能被访问,结果如下图所示。具体操作请参考博客《Linux脚本编程:sudo命令下安装ssh服务并自定义端口和允许root登陆》中代码实现部分的注意事项。
# 重启防火墙,以保证防火墙一定是开启的
systemctl restart firewalld
# 在防火墙添加服务http且设置永久开启
firewall-cmd --zone=public --add-service=http --permanent
# 重新加载防火墙,使上一步操作生效
firewall-cmd --reload
# 查看http服务是否开放
firewall-cmd --query-service http
此步是为了让Linux云服务器IP能被外网访问。
# 网页文件放在工作目录下
vi MyNodejs.js
# 按下i键进入编辑模式,输入以下内容实现题目要求:
var http = require('http');
var url = require('url');
var mysql = require('mysql');
// 创建数据库连接
var connection = mysql.createConnection({
host : 'localhost',
user : '用户名',
password : '密码',
port : '3306',
database : '数据库名'
});
var sql = 'SELECT * FROM 数据表名';
// 创建服务器
http.createServer(function (request, response) {
// 解析请求,包括文件名
var pathname = url.parse(request.url).pathname;
if(pathname !="/MyNodejs.js"){
// HTTP 状态码: 404 : NOT FOUND
// Content Type: text/html
response.writeHead(404,{'Content-Type': 'text/html'});
response.write(
''+
''+
''+
''+
'');
response.end('该网页地址不存在!
');
return;
}else{
// HTTP 状态码: 200 : OK
// Content Type: text/html
response.writeHead(200, {'Content-Type': 'text/html'});
response.write(
''+
''+
''+
''+
'');
// 执行sql语句
connection.query(sql,function(err,result){
if(err){
response.write('数据库访问失败: '+err.message);
}else {
result.forEach(r =>{
response.write('学号: '+r.id+' - '+'姓名: '+r.name+'
');
})
// 发送响应数据
response.end();
}
});
}
}).listen(9080);
# 按下esc键退出编辑模式
# 保存并退出文件
:wq
Node.js网页语法参考《Node.js Web 模块 | 菜鸟教程》。
# 运行可执行文件,&表示后台运行,不加的话ctrl+c退出当前命令后网页将不能访问
nohup node MyNodejs.js >> /dev/null 2>&1 &
# 使用exit退出终端,防止nohup失效
exit
# 在浏览器输入IP:9080/MyNodejs.js查看网页是否正常显示
nohup 是 no hang up 的缩写,就是不挂断的意思,使用该命令是为了解决断开SSH连接后网页不能访问的问题。参考《nohup》。
本人发现Node.js程序像Golang程序一样用nohup设置后台一直运行后,一断开终端还是会停止运行。阅读许多资料后,才在书籍《构建高可用Linux服务器》中看到作者的提醒——nohup有时候会出现一个小问题,就是执行该命令后,必须要通过在命令行输入exit命令的方式来退出终端连接,否则指定的后台进程会随终端的关闭而自动关闭,可能的原因是不以命令行形式退出终端会让一些主机出于可能是异常退出的考虑而关闭用户设置的后台进程。
本人在实际运行中还发现,Node.js网页在一段时间后仍然会报错不能访问,查询许多资料后还是找不到原因,欢迎知情的朋友到评论区讨论!不过发现一个解决方法,就是在Node.js网页正常运行后,每隔一两个小时到浏览器访问它,慢慢地再隔较长时间后去访问,网页依旧在正常运行了。
如果文章内容出错或者您有更好的解决方法,欢迎到评论区指正和讨论!