【Web开发】Python实现Web服务器(Ubuntu下调试Flask)

在这里插入图片描述

基于Python的Web服务器系列相关文章编写如下:

  1. 【Web开发】Python实现Web服务器(Flask快速入门)
  2. 【Web开发】Python实现Web服务器(Flask案例测试)
  3. 【Web开发】Python实现Web服务器(Flask部署上线)
  4. 【Web开发】Python实现Web服务器(Flask+Tornado+nginx)
  5. 【Web开发】Python实现Web服务器(Ubuntu下安装Flask)
  6. 【Web开发】Python实现Web服务器(Ubuntu下打包Flask)
  7. 【Web开发】Python实现Web服务器(Ubuntu下调试Flask)
  8. 【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL)

文章目录

  • 1、简介
  • 2、ubuntu远程访问
  • 3、ubuntu进程管理
    • 3.1 top命令查看进程pid
    • 3.2 ps命令查看进程
    • 3.3 kill命令关闭进程
    • 3.4 nohup命令
    • 3.5 设置开机自启动
  • 4、ubuntu网络端口管理
    • 4.1 查看端口是否被占用方法
    • 4.2 列出所有端口(包含TCP和UDP)
    • 4.3 列出所有TCP端口
    • 4.4 列出所有UDP端口
    • 4.5 列出所有处于监听状态的 Sockets
    • 4.6 只列出所有监听tcp端口
    • 4.7 只列出所有监听udp端口
    • 4.8 只列出所有监听UNIX端口
    • 4.9 输出中显示 PID 和进程名称
    • 4.10 输出中不显示主机,端口和用户名
    • 4.11 显示核心路由信息
    • 4.12 找出程序运行的端口
    • 4.13 找出运行在指定端口的进程
  • 5、ubuntu防火墙设置
    • 5.1 查看防火墙状态
    • 5.2 开启和关闭防火墙
    • 5.3 打开或关闭某个端口
  • 6、flask测试
    • 6.1 配置python开发环境
    • 6.2 创建虚拟环境venv
    • 6.3 安装flask库
    • 6.4 测试flask入门例子
    • 6.5 测试flask图表例子(pyecharts)
  • 结语

1、简介

本文介绍在ubuntu系统中如何远程开发,防火墙设置,配置python开发环境,以及使用flask框架进行web服务器的开发。

2、ubuntu远程访问

在虚拟机VMware Workstation Pro中安装了一个Ubuntu系统。
有人反映新装的Ubuntu竟然没有默认安装ssh。

更新一下软件源:

sudo apt-get update

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第1张图片
下载ssh并安装:
安装命令:sudo apt-get install openssh-server
卸载命令:sudo apt-get remove openssh-server

sudo apt-get install openssh-server

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第2张图片
查看是否开启了ssh服务 (没有开始的话使用命令sudo service ssh start)

sudo service ssh start
sudo ps -e | grep ssh

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第3张图片
看到sshd那说明ssh-server已经启动了。若没有则可以这样启动:sudo /etc/init.d/ssh start 或者 service ssh start。

进入Ubuntu,Ctrl+Alt+T打开终端,输入ifconfig命令查看IP情况,如下图:

ifconfig

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第4张图片
首先要保证虚拟机和主机之间可以互相ping通,如果不能ping通则后续工作无法进行。
打开Putty客户端,出现以下界面,填入相关参数:
【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第5张图片
输入ubuntu系统的用户名和密码:
【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第6张图片
成功进入命令行界面:
【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第7张图片

putty连接Ubuntu虚拟机超时,Network error: Connection timed out?
网络能ping通,但是putty连接Ubuntu时却显示连接超时?

(1)如果仍然无法远程访问ubuntu系统,可能是ubuntu防火墙开了,关掉试试。
(2)也可以试试还原vmware的网络设置,当然ip等信息会自动变化。
【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第8张图片
【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第9张图片
点击还原默认设置即可,还原后,他的子网地址会改变,linux的ip地址也会改变。

3、ubuntu进程管理

3.1 top命令查看进程pid

top

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第10张图片

3.2 ps命令查看进程

相关参数整理如下:

-aux    以BSD风格显示进程 常用
-efH    以System V风格显示进程
-e , -A 显示所有进程
a         显示终端上所有用户的进程
x         显示无终端进程
u         显示详细信息
f          树状显示
w        完整显示信息
l          显示长列表
ps

在这里插入图片描述

ps aux

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第11张图片

ps aux| grep pyheat

在这里插入图片描述

3.3 kill命令关闭进程

kill -9  pid    #用来强制终止指定pid进程(推荐使用此方法)
kill -9 -1      #终止你拥有的全部进程
kill -9 15494

在这里插入图片描述

pkill  firefox

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第12张图片

3.4 nohup命令

nohup 命令是英语词组 no hangup 的缩写,意思是不挂断,也就是指程序不退出。这个命令会使程序忽略 HUP 信号,保证程序能够正常进行。

  • 1、nohup 是 no hang up 的缩写,就是不挂断的意思。
  • 2、nohup命令:在系统上运行一个进程的时候,不想让其在你退出账号时关闭,即可用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。
  • 3、nohup在不规定的情况下,所以输出内容会到nohup.out中。
nohup python3 demo.py >/dev/null 2>&1 &

run.py为Flask项目的启动脚本,在python环境中不间断的运行run.py,并且将标准内容和错误内容输出到flask.log这个日志文件中,即请求api若出现报错信息即可通过日志定位到问题。

nohup python3 run.py >> /www/wwwroot/log/flask.log 2>&1 &
  • 2>&1的意思:
0 表示stdin标准输入,用户键盘输入的内容
1 表示stdout标准输出,输出到显示屏的内容
2 表示stderr标准错误,报错内容
2>&1是一个整体,>左右不能有空格,即将错误内容重定向输入到标准输出中去。
  • nohup和&的区别:
    1、&才是后台运行
    2、nohup : 不挂断的运行,注意并没有后台运行的功能,,就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH连接都不会影响他的运行,注意了nohup没有后台运行的意思;
    【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第13张图片

3.5 设置开机自启动

在/usr/lib/systemd/system目录下包含了各种unit文件,有service后缀的服务unit,有target后缀的开机级别unit等,这里介绍关于service后缀的文件。因为systemd在开机要想执行自启动,都是通过这些*.service 的unit控制的,服务又分为系统服务(system)和用户服务(user)。
系统服务目录:/usr/lib/systemd/system/,开机不登录就能运行的程序(常用于开机自启)。
用户服务目录:/usr/lib/systemd/user/,需要登录以后才能运行的程序。

(づ ̄ 3 ̄)づ(づ ̄ 3 ̄)づ(づ ̄ 3 ̄)づ(づ ̄ 3 ̄)づ(づ ̄ 3 ̄)づ(づ ̄ 3 ̄)づ(づ ̄ 3 ̄)づ(づ ̄ 3 ̄)づ(づ ̄ 3 ̄)づ(づ ̄ 3 ̄)づ

在/usr/lib/systemd/system目录下新建my1225.service文件:

[Unit]
#服务描述
#Description=test Service
#指定了在systemd在执行完那些target之后再启动该服务
After=network.target

[Service]
#定义Service的运行类型,这种一般是开机自启动文件就是可执行文件
Type=simple

#Type=forking,这种一般是开机自启动文件为shell脚本文件,脚本文件里面可能写了多个需要
#开机自启动的程序,forking代表子进程的方式,就是脚本里的程序以子进程后台运行。

#定义systemctl start|stop|reload *.service 的执行方法(具体命令需要写绝对路径)
ExecStart=/home/tomcat/Desktop/test.sh -start#-start加不加都行
#创建私有的内存临时空间
PrivateTmp=True

[Install]
#多用户
WantedBy=multi-user.target
重载系统服务:systemctl daemon-reload
设置开机启动:systemctl enable *.service
启动服务:systemctl start *.service
停止服务:systemctl stop *.service
重启服务:systemctl restart *.service

d=====( ̄▽ ̄*)bd=====( ̄▽ ̄*)bd=====( ̄▽ ̄*)bd=====( ̄▽ ̄*)bd=====( ̄▽ ̄*)bd=====( ̄▽ ̄*)bd=====( ̄▽ ̄*)b

Ubuntu 20.04的服务管理是基于systemd的,因此设置服务自启动最推荐的方法是在/etc/systemd/user目录下创建一个systemd服务文件,配置好要执行的服务。
(1)创建我们需要开机自启动的脚本,例如test.sh

#!/bin/bash -e 
 
# source /home/tomcat/venv_demo/bin/activate flask_test
# source命令进行conda环境激活,需要使用绝对路径打开acvatie目录指定。
 
cd /home/tomcat/flask_test
gunicorn -w 4 -b 127.0.0.1:8000 flask_test:app &
 
exit 0

(2)在/etc/systemd/user目录下创建一个systemd服务文件, 命名为my1225.service

[Unit]
After=network.service
# After表示在哪个服务启动后启动我们的程序,After=network.service 表示网络连接完成后,启动我们的程序

[Service]
ExecStart=/home/tomcat/test.sh # 此处只能绝对路径
# ExecStart表示我们的脚本(步骤1中的test.sh)的执行路径

[Install]
WantedBy=default.target
# WantedBy默认填default.target,表示我们程序所在的服务组。
# vi /etc/systemd/system/flaskapp.service

[Unit]
Description=A Gunicorn example to serve Flask App
After=network.target

[Service]
WorkingDirectory=/home/tomcat
ExecStart=/home/tomcat/python/bin/gunicorn -w 3 -b 0.0.0.0:8888 wsgi:app --timeout 120

[Install]
WantedBy=multi-user.target

(3)将systemd服务文件和我们的脚本更改权限,使其可执行。

sudo chmod 744 ~/test.sh
sudo chmod 664 /etc/systemd/user/my1225.service

(4)重新加载系统的systemd服务文件,并启用我们自己写的my1225.service文件。

sudo systemctl daemon-reload
systemctl --user enable my1225.service

(5)取消开机自启动

systemctl --user disable my1225.service
cd /etc/systemd/user
rm my1225.service

(。・∀・)ノ (。・∀・)ノ (。・∀・)ノ (。・∀・)ノ (。・∀・)ノ (。・∀・)ノ (。・∀・)ノ (。・∀・)ノ (。・∀・)ノ (。・∀・)ノ

创建一个systemd单元文件将允许Ubuntu的init系统自动启动uWSGI并在服务器启动时为Flask应用程序提供服务。
在/etc/systemd/system目录创建一个以.service为结尾的单元文件开始:

sudo nano /etc/systemd/system/myproject.service
[Unit]
Description=uWSGI instance to serve myproject
After=network.target
​
[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myproject
Environment="PATH=/home/sammy/myproject/myprojectenv/bin"
ExecStart=/home/sammy/myproject/myprojectenv/bin/uwsgi --ini myproject.ini
​
[Install]
WantedBy=multi-user.target

这样,我们的systemd服务文件就完成了。立即保存并关闭它。
我们现在可以启动我们创建的uWSGI服务并启用它,以便它在启动时启动:

sudo systemctl start myproject
sudo systemctl enable myproject
sudo systemctl status myproject

( o=^•ェ•)o ┏━┓( o=^•ェ•)o ┏━┓( o=^•ェ•)o ┏━┓( o=^•ェ•)o ┏━┓( o=^•ェ•)o ┏━┓( o=^•ェ•)o ┏━┓(

(1)创建系统服务

vim /usr/lib/systemd/system/robot.service
[Unit]
Description=robot
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/python3/bin/ENV/bin/python /usr/local/python3/bin/ENV/p3.py &
PrivateTmp=true
[Install]
WantedBy=multi-user.target

ExecStart为服务启动时执行的命令,不能用相对路径, 一定要全路径。
这里也可以将命令写到任意的.sh文件中。
(2)启用自定义系统服务

systemctl enable robot
systemctl start robot
ps aux|grep robot

4、ubuntu网络端口管理

netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。

-a或–all:显示所有连线中的Socket;
-A<网络类型>或–<网络类型>:列出该网络类型连线中的相关地址;
-c或–continuous:持续列出网络状态;
-C或–cache:显示路由器配置的快取信息;
-e或–extend:显示网络其他相关信息;
-F或–fib:显示FIB;
-g或–groups:显示多重广播功能群组组员名单;
-h或–help:在线帮助;
-i或–interfaces:显示网络界面信息表单;
-l或–listening:显示监控中的服务器的Socket;
-M或–masquerade:显示伪装的网络连线;
-n或–numeric:直接使用ip地址,而不通过域名服务器;
-N或–netlink或–symbolic:显示网络硬件外围设备的符号连接名称;
-o或–timers:显示计时器;
-p或–programs:显示正在使用Socket的程序识别码和程序名称;
-r或–route:显示Routing Table;
-s或–statistice:显示网络工作信息统计表;
-t或–tcp:显示TCP传输协议的连线状况;
-u或–udp:显示UDP传输协议的连线状况;
-v或–verbose:显示指令执行过程;
-V或–version:显示版本信息;
-w或–raw:显示RAW传输协议的连线状况;
-x或–unix:此参数的效果和指定"-A unix"参数相同;
–ip或–inet:此参数的效果和指定"-A inet"参数相同。

4.1 查看端口是否被占用方法

netstat -anp |grep 40001

在这里插入图片描述

4.2 列出所有端口(包含TCP和UDP)

netstat -a

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第14张图片

4.3 列出所有TCP端口

netstat -at

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第15张图片

4.4 列出所有UDP端口

netstat -au

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第16张图片

4.5 列出所有处于监听状态的 Sockets

netstat -l

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第17张图片

4.6 只列出所有监听tcp端口

netstat -lt

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第18张图片

4.7 只列出所有监听udp端口

netstat -lu

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第19张图片

4.8 只列出所有监听UNIX端口

netstat -lx

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第20张图片

4.9 输出中显示 PID 和进程名称

netstat -pt

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第21张图片

4.10 输出中不显示主机,端口和用户名

netstat -an

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第22张图片

4.11 显示核心路由信息

netstat -r
# or
netstat -rn

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第23张图片
显示网络接口列表:

netstat -i

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第24张图片

4.12 找出程序运行的端口

netstat -tunlp | grep ssh

在这里插入图片描述
【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第25张图片
【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第26张图片

4.13 找出运行在指定端口的进程

netstat -an | grep ":3306"

在这里插入图片描述
通过端口找进程ID:

netstat -tunlp | grep 80 | awk '{print $7}' | cut -d/ -f1
netstat -nltp
#或者
netstat -nltp | grep python
#或者
netstat -apn | grep 10010

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第27张图片

5、ubuntu防火墙设置

5.1 查看防火墙状态

由于LInux原始的防火墙工具iptables过于繁琐,所以ubuntu默认提供了一个基于iptable之上的防火墙工具ufw。
ubuntu 9.10默认的便是UFW防火墙,它已经支持界面操作了。在命令行运行ufw命令就可以看到提示的一系列可进行的操作。
Ubuntu20.04一般都默认安装了UFW(Uncomplicated Firewall),它是一款轻量化的工具,主要用于对输入输出的流量进行监控。
如果没有安装,请用下面的命令安装:

sudo apt install ufw

正常情况安装以后应该是默认禁止状态的,输入如下命令查看状态:

sudo ufw status verbose

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第28张图片
这表示防火墙没有开启,下面启用防火墙。

sudo ufw status

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第29张图片

5.2 开启和关闭防火墙

只需设置如下三条命令:

sudo apt install ufw
sudo ufw enable
sudo ufw default deny

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第30张图片
sudo ufw default allow/deny:外来访问默认允许/拒绝。
sudo ufw enable/disable:打开/关闭ufw。
sudo ufw status:查看已经定义的ufw规则。
sudo ufw delete allow/deny 20:删除以前定义的"允许/拒绝访问20端口"的规则。

sudo ufw disable

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第31张图片

5.3 打开或关闭某个端口

sudo ufw allow 53 允许外部访问53端口(tcp/udp)
sudo ufw allow 3690 允许外部访问3690端口(svn)
sudo ufw allow from 192.168.1.111 允许此IP访问所有的本机端口
sudo ufw allow proto tcp from 192.168.0.0/24 to any port 22  允许指定的IP段访问特定端口
sudo ufw delete allow smtp 删除上面建立的某条规则,比如删除svn端口就是 sudo ufw delete allow 3690 
sudo ufw allow 40001
sudo ufw delete allow 40001

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第32张图片

6、flask测试

以 Flask 项目为例,Flask作为Web框架,它的作用主要是为了开发Web应用程序。
一个Web应用程序包含了三个部分,前端,服务端,数据库。

  • 数据库负责存储数据,作为数据存储和查询的引擎;
  • 前端网站作为用户直接查看的页面,负责展示数据。
  • Flask 负责对数据库进行操作,将数据库中的数据渲染至前端。

6.1 配置python开发环境

python

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第33张图片

python3
# or
python3 -V

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第34张图片
【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第35张图片

pip list

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第36张图片

sudo apt install python3-pip

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第37张图片

pip list

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第38张图片

6.2 创建虚拟环境venv

# 新建测试文件夹
mkdir test
cd test

# 注意:python3 内置了venv,所以不用再pip安装virtualenv了。
# venv_demo 就是虚拟环境的名字
python -m venv venv_demo  

# 激活虚拟环境
venv_demo/Scripts/activate

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第39张图片
创建虚拟环境失败,系统提示需要装工具。安装虚拟环境库venv工具。

sudo apt install python3.8-venv

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第40张图片
安装成功,再继续创建虚拟环境如下:

python -m venv venv_demo  

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第41张图片
激活虚拟环境如下:

source venv_demo/bin/activate

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第42张图片

python
python -V
pip list

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第43张图片

6.3 安装flask库

pip install flask

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第44张图片
安装一步到位,安装成功如上。

6.4 测试flask入门例子

编写测试脚本demo.py如下:

  • demo.py:
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!小沐!'

if __name__ == '__main__':
    app.run()

运行命令如下:

python demo.py

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第45张图片
运行结果,跨电脑无法访问。即使防火墙允许了端口5000。
【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第46张图片
修改测试脚本demo.py如下:

  • demo.py:
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!小沐!'

if __name__ == '__main__':
    app.run(host="0.0.0.0")

运行命令如下:

python demo.py

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第47张图片
【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第48张图片
运行结果,跨电脑可以访问。

6.5 测试flask图表例子(pyecharts)

新建一个项目flask_pyecharts

  • (1)安装pyecharts库
pip install pyecharts

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第49张图片

pip list

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第50张图片

  • (2)拷贝 pyecharts 模板
    【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第51张图片

将链接中的以下模板
├── jupyter_lab.html
├── jupyter_notebook.html
├── macro
├── nteract.html
├── simple_chart.html
├── simple_page.html
└── table.html
全部拷贝到 tempaltes 文件夹中
https://github.com/pyecharts/pyecharts/tree/master/pyecharts/render/templates

  • (3)编写测试脚本demo_echart.py如下:
from flask import Flask
# from jinja2 import Markup
from markupsafe import Markup

from pyecharts import options as opts
from pyecharts.charts import Bar

app = Flask(__name__, static_folder="templates")


def bar_base() -> Bar:
    c = (
        Bar()
            .add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
            .add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
            .add_yaxis("商家B", [15, 25, 16, 55, 48, 8])
            .set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="我是副标题"))
    )
    return c


@app.route("/")
def index():
    c = bar_base()
    return Markup(c.render_embed())


if __name__ == "__main__":
    app.run(host="0.0.0.0")

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第52张图片
【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第53张图片

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第54张图片

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)_第55张图片

你可能感兴趣的:(Python,Web,Linux,flask,python,ubuntu,linux,webserver)