
🍺基于Python的Web服务器系列相关文章编写如下🍺:
本文介绍在ubuntu系统中如何远程开发,防火墙设置,配置python开发环境,以及使用flask框架进行web服务器的开发。
在虚拟机VMware Workstation Pro中安装了一个Ubuntu系统。
有人反映新装的Ubuntu竟然没有默认安装ssh。
更新一下软件源:
sudo apt-get update

下载ssh并安装:
安装命令:sudo apt-get install openssh-server
卸载命令:sudo apt-get remove openssh-server
sudo apt-get install openssh-server

查看是否开启了ssh服务 (没有开始的话使用命令sudo service ssh start)
sudo service ssh start
sudo ps -e | grep ssh

看到sshd那说明ssh-server已经启动了。若没有则可以这样启动:sudo /etc/init.d/ssh start 或者 service ssh start。
进入Ubuntu,Ctrl+Alt+T打开终端,输入ifconfig命令查看IP情况,如下图:
ifconfig

首先要保证虚拟机和主机之间可以互相ping通,如果不能ping通则后续工作无法进行。
打开Putty客户端,出现以下界面,填入相关参数:

输入ubuntu系统的用户名和密码:

成功进入命令行界面:

putty连接Ubuntu虚拟机超时,Network error: Connection timed out?
网络能ping通,但是putty连接Ubuntu时却显示连接超时?
(1)如果仍然无法远程访问ubuntu系统,可能是ubuntu防火墙开了,关掉试试。
(2)也可以试试还原vmware的网络设置,当然ip等信息会自动变化。


点击还原默认设置即可,还原后,他的子网地址会改变,linux的ip地址也会改变。
netstat -anp |grep 40001
top

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

ps aux

ps aux| grep pyheat

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

pkill firefox

nohup 命令是英语词组 no hangup 的缩写,意思是不挂断,也就是指程序不退出。这个命令会使程序忽略 HUP 信号,保证程序能够正常进行。
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 &
0 表示stdin标准输入,用户键盘输入的内容
1 表示stdout标准输出,输出到显示屏的内容
2 表示stderr标准错误,报错内容
2>&1是一个整体,>左右不能有空格,即将错误内容重定向输入到标准输出中去。

在/usr/lib/systemd/system目录下包含了各种unit文件,有service后缀的服务unit,有target后缀的开机级别unit等,这里介绍关于service后缀的文件。因为systemd在开机要想执行自启动,都是通过这些*.service 的unit控制的,服务又分为系统服务(system)和用户服务(user)。
系统服务目录:/usr/lib/systemd/system/,开机不登录就能运行的程序(常用于开机自启)。
用户服务目录:/usr/lib/systemd/user/,需要登录以后才能运行的程序。
在/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
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
由于LInux原始的防火墙工具iptables过于繁琐,所以ubuntu默认提供了一个基于iptable之上的防火墙工具ufw。
ubuntu 9.10默认的便是UFW防火墙,它已经支持界面操作了。在命令行运行ufw命令就可以看到提示的一系列可进行的操作。
Ubuntu20.04一般都默认安装了UFW(Uncomplicated Firewall),它是一款轻量化的工具,主要用于对输入输出的流量进行监控。
如果没有安装,请用下面的命令安装:
sudo apt install ufw
正常情况安装以后应该是默认禁止状态的,输入如下命令查看状态:
sudo ufw status verbose

这表示防火墙没有开启,下面启用防火墙。
sudo ufw status

只需设置如下三条命令:
sudo apt install ufw
sudo ufw enable
sudo ufw default deny

sudo ufw default allow/deny:外来访问默认允许/拒绝。
sudo ufw enable/disable:打开/关闭ufw。
sudo ufw status:查看已经定义的ufw规则。
sudo ufw delete allow/deny 20:删除以前定义的"允许/拒绝访问20端口"的规则。
sudo ufw disable

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

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

python3
# or
python3 -V


pip list

sudo apt install python3-pip

pip list

# 新建测试文件夹
mkdir test
cd test# 注意:python3 内置了venv,所以不用再pip安装virtualenv了。
# venv_demo 就是虚拟环境的名字
python -m venv venv_demo # 激活虚拟环境
venv_demo/Scripts/activate

创建虚拟环境失败,系统提示需要装工具。安装虚拟环境库venv工具。
sudo apt install python3.8-venv

安装成功,再继续创建虚拟环境如下:
python -m venv venv_demo

激活虚拟环境如下:
source venv_demo/bin/activate

python
python -V
pip list

pip install flask

安装一步到位,安装成功如上。
编写测试脚本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

运行结果,跨电脑无法访问。即使防火墙允许了端口5000。

修改测试脚本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


运行结果,跨电脑可以访问。
新建一个项目flask_pyecharts
pip install pyecharts

pip list


将链接中的以下模板
├── 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
from flask import Flask
# from jinja2 import Markup
from markupsafe import Markupfrom pyecharts import options as opts
from pyecharts.charts import Barapp = 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")



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

上一篇:箭头函数的使用
下一篇:《解构领域驱动设计》读书笔记