比较好的网站空间,国外对旅游网站建设的现状,做纹身注册什么网站好,关于门户网站建设通报contents 服务器一、相关概念1.1 云服务器与实例1.2 关于域名解析延时与80端口1.3 关于备案1.4 关于SSL证书1.5 关于SSL证书的签发1.6 关于SSL证书的部署1.7 关于LNMP和LAMP1.8 关于bt面板 二、单服务器单一级域名多网站2.1 创建多个二级域名2.2 解析二级域名绑定到服务器上2.3… contents 服务器一、相关概念1.1 云服务器与实例1.2 关于域名解析延时与80端口1.3 关于备案1.4 关于SSL证书1.5 关于SSL证书的签发1.6 关于SSL证书的部署1.7 关于LNMP和LAMP1.8 关于bt面板 二、单服务器单一级域名多网站2.1 创建多个二级域名2.2 解析二级域名绑定到服务器上2.3 理解二级域名的访问2.4 实现不同的域名访问不同的文件 部署flask一、远程连接服务器二、配置MySQL2.1 放通端口2.2 安装MySQL并启动2.3 配置MySQL2.4 更改config.py2.5 本地连接远程数据库2.6 本地构造数据库信息 三、配置Nginx3.1 放通端口3.2 安装Nginx并启动 四、配置python4.1 安装python4.2 安装python环境管理包 五、项目相关5.1 创建py虚拟环境5.2 Git管理5.3 配置flask运行环境5.4 运行flask应用1 内测阶段2 公测阶段 5.4 一些bug 服务器
一、相关概念
1.1 云服务器与实例
一个云服务器相当于一个抽象的类在其中购买配置了指定的实例后相当于实例化一个类从而一个云服务器对应一个实例
1.2 关于域名解析延时与80端口
在给购买好的域名进行解析的时候即指向自己服务器的公网IP的时候可能会有一段时间的延时。但其实可能是没有给云服务器放通80端口导致的
1.3 关于备案
首先需要清除的概念是备案指的是给网站主机也就是云服务器进行备案而一般而言的域名备案其实就是给云服务器备案只不过叫做域名备案很可能是因为大家在使用域名的时候才发现不备案是无法通过域名访问网站的。这是因为云服务器厂家做的设定也只是顺应了政策的需求
当前的形式是对于指向中国大陆 ip 的云服务器需要备案如果指向的是非中国大陆的 ip就不需要备案了。一般而言中文的指向HK英文的指向UK
1.4 关于SSL证书
http协议默认使用的是80端口而申请了SSL证书后通过https协议访问的网站默认使用的是443端口因此需要提前在实例的安全组中放通443端口
1.5 关于SSL证书的签发
如果是基于bt面板操作的话。可以通过ssl选项中“Let’s Encrypt”的选项免费申请三个月的用量由于是基于bt面板管理需要打开强制通过https进入这个选项从而直接默认使用https协议访问网站如果想要通过官方渠道获取。可以在阿里云或者腾讯云等直接免费领取一定额度的ssl证书
1.6 关于SSL证书的部署
获得已签发的ssl证书后下载下来再通过bt面板进行部署
证书文件pem 文件密钥文件key 文件 1.7 关于LNMP和LAMP
LNMP是一组Linux操作系统下的Nginx、MySQL、PHP和Perl的组合安装包常用于构建高性能的Web服务器。通过使用LNMP可以快速搭建一个功能强大的网站系统LAMP是指Linux、Apache、MySQL和PHP的组合它是一个开源的Web开发平台。这个组合通常被用来构建高性能的Web应用程序
1.8 关于bt面板
简介其实就是一个类windows的linux环境下的可视化管理工具
安装服务器安装宝塔面板基于不同的linux系统会有不同的指令详情见宝塔面板安装地址选择相应的指令进行安装即可
进入通过bt指令进入服务器可视化管理界面 管理安装网站运行所需的环境耗时如下 二、单服务器单一级域名多网站
参考通过Nginx在一台服务器部署多个Web应用
2.1 创建多个二级域名
多个网站可以通过二级域名的形式只依赖一个一级域名从而实现一个域名衍生出多个子域名的形式即一级域名为 baidu.com二级域名为 mcn.baidu.com、career.baidu.com 等等
2.2 解析二级域名绑定到服务器上
每一个二级域名都需要解析到相应的IP地址即主机记录对应记录值才能进行后续的访问。其实可以理解为将不同的二级域名都绑定到当前的服务器上像这样 2.3 理解二级域名的访问
我们通过不同的二级域名访问网站时其实就是访问不同的文件夹中的文件信息像这样 2.4 实现不同的域名访问不同的文件
这时我们就需要配置 nginx 的代理服务器了 nginx 中的 nginx.conf 文件示例配置如下
##### example project #####
server {listen 443 ssl; # 监听的端口server_name test.cn; # 监听的网址# ssl证书的相关文件路径ssl_certificate /usr/local/nginx/ssl/test.cn_bundle.pem;ssl_certificate_key /usr/local/nginx/ssl/test.cn.key;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;# 项目路径location / {proxy_pass https://localhost:8080/; # 转向“本地”8080端口# root path; # 根目录# index demo.html; # 设置默认页# proxy_pass http://mysvr; # 请求转向 mysvr 定义的服务器列表# deny 127.0.0.1; # 拒绝的ip# allow 172.18.5.54; # 允许的ip }
}假如此时我们需要 docs.example.com 访问文档分站静态www.example.com 与 example.com 都访问主站动态我们就需要配置 nginx 中的 nginx.conf 文件如下
#----- docs.example.com -----#
server {listen 443 ssl; # 监听的端口server_name docs.example.com; # 监听的网址# ssl证书的相关文件路径ssl_certificate /usr/local/nginx/ssl/test.cn_bundle.pem;ssl_certificate_key /usr/local/nginx/ssl/test.cn.key;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;# 项目路径location / {root /usr/web/docs; # 根目录}
}#----- www.example.com -----#
server {listen 443 ssl; # 监听的端口server_name www.example.com; # 监听的网址# ssl证书的相关文件路径ssl_certificate /usr/local/nginx/ssl/b.test.cn_bundle.pem;ssl_certificate_key /usr/local/nginx/ssl/b.test.cn.key;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;location / {root /usr/web/www; # 根目录}
}#----- example.com -----#
server {listen 443 ssl; # 监听的端口server_name www.example.com; # 监听的网址# ssl证书的相关文件路径ssl_certificate /usr/local/nginx/ssl/b.test.cn_bundle.pem;ssl_certificate_key /usr/local/nginx/ssl/b.test.cn.key;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;location / {proxy_pass https://www; # 请求转向 mysvr 定义的服务器列表}
}部署flask
一、远程连接服务器
服务器信息
[rootDwjDemo1 ~]# cat /etc/os-releaseNAMEAlibaba Cloud Linux 发行版的名称
VERSION3 (Soaring Falcon) 发行版的版本号
IDalinux 唯一的标识符
ID_LIKErhel fedora centos anolis 一些类似的发行版
VERSION_ID3 发行版的版本编号
PLATFORM_IDplatform:al8 平台的标识符
PRETTY_NAMEAlibaba Cloud Linux 3 (Soaring Falcon) 可读的发行版名称和版本号
ANSI_COLOR0;31 ANSI终端输出的颜色: 0;31通常用于表示错误或警告信息
HOME_URLhttps://www.aliyun.com/ 发行版的官方网站链接连接方法 方法一利用阿里云自带的服务器连接入口远程连接服务器 方法二使用MobaXterm端口连接工具并更新全局软件 yum update输入 username 和 password
二、配置MySQL
2.1 放通端口
服务器放通端口3306
2.2 安装MySQL并启动
参考Linux安装mysql8.0官方教程
2.3 配置MySQL
设置mysql登录密码
在服务器中连接mysql
mysql -uroot -p授予权限给自己
# MySQL 5 版本
GRANT ALL ON *.* TO root% IDENTIFIED BY 替换成你的root密码 WITH GRANT OPTION;# MySQL 8 版本
ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 替换成你的root密码;使用数据库
use mysql允许远程登录数据库
update user set host % where user root;刷新更新配置
FLUSH PRIVILEGES;2.4 更改config.py
修改项目中 config.py 中的配置信息
# Time : 2023-12-03 23:25
# File : config.py
# Author : Mr_Dwj
配置文件1. 数据库配置信息2. ...
# 数据库的配置信息
HOSTNAME
PORT 3306
DATABASE test1
USERNAME
PASSWORD
DB_URI mysqlpymysql://{}:{}{}:{}/{}?charsetutf8mb4.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
SQLALCHEMY_DATABASE_URI DB_URI2.5 本地连接远程数据库 2.6 本地构造数据库信息
拷贝数据库表 - 直接在DataGrip中寻找进行复制即可 三、配置Nginx
参考Linux安装Nginx超详细步骤
3.1 放通端口
服务器放通80端口
3.2 安装Nginx并启动
进入nginx官网并下载稳定版至本地
上传服务器直接通过mobaxterm拖拽并解压到当前目录下并进入nginx文件夹
tar -zxvf nginx-1.20.tar.gz
cd /home/nginx-1.20/配置nginx并编译安装
# 配置configure
# --prefix 代表安装的路径
# --with-http_ssl_module 安装ssl
# --with-http_stub_status_module 查看nginx的客户端状态
./configure --prefix/usr/local/nginx-1.20 --with-http_ssl_module --with-http_stub_status_module# 编译安装
make make install进入sbin目录启动nginx
# 启动nginx
./nginx解决启动遇到的端口占用的问题 killall -9 nginx 杀掉 nginx 的进程然后重启 然后浏览器通过http的80端口访问公网ip就可以看到欢呼雀跃的一幕 四、配置python
4.1 安装python
参考linux安装python
命令集合
# 安装python依赖
If you want a release build with all stable optimizations active (PGO, etc),please run ./configure --enable-optimizations# 本地下载拖拽上传至服务器解压安装包
tar -xvf Python-3.11.tgz# 进入安装包配置安装路径
cd Python-3.10.6
./configure --prefix/usr/local/python311# 编译安装
make make install# 将最新的python创建软链链接
ln -s /usr/local/python311/bin/python3.11 /usr/bin/python311# 修改yum依赖默认的python版本
vi /usr/libexec/urlgrabber-ext-down
vi /usr/bin/yum# 修改防火墙
vi /usr/bin/firewall-cmd
vi /usr/sbin/firewalld# 创建pip软连接
ln -s /usr/local/python311/bin/pip3.11 /usr/bin/pip311vim的编辑指令
# 进入编辑模式
i# 退出编辑模式进入命令模式
Esc# 保存并关闭文件
:w# 退出vim编辑模式
:q4.2 安装python环境管理包
安装python虚拟环境管理依赖
pip install virtualenvwrapper配置虚拟环境
# 在根目录下进入.bashrc文件进行编辑
vi .bashrc
i# ctrlf进入末尾粘贴一下文字保存并退出
export WORKON_HOME$HOME/.virtualenvs
VIRTUALENVWRAPPER_PYTHON/usr/bin/python311
source /usr/local/bin/virtualenvwrapper.sh# 刷新配置文件
source ~/.bashrc刷新配置文件时报错virtualenvwrapper.sh: There was a problem running the initialization hooks. 解决方案参考virtualenvwrapper.sh报错: There was a problem running the initialization hooks.解决 五、项目相关
5.1 创建py虚拟环境
创建虚拟py环境
mkvirtualenv --python/usr/bin/python311 EnvName启动虚拟环境
workon EnvName退出虚拟环境
deactivate5.2 Git管理
进入python虚拟环境目录EnvName
初次部署拉取远程源文件
git clone https://github.com/Explorer-Dong/YunJinWeb.git后续更新覆盖原始代码并重新运行应用
git pull# 找到所有uwsgi进程
ps -ef|grep uwsgi
# 杀死所有进程
kill -9 进程号
# 退出uwsgi但是不停止服务的操作
uwsgi -d --ini uwsgi.ini5.3 配置flask运行环境
检查本项目所需py模块
pip freeze requirements.txt安装所需py模块
pip install -r requirements.txt5.4 运行flask应用
1 内测阶段
使用flask自带的服务器运行
运行flask主接口文件 app.py
python app.py运行app.py时报错端口已被占用解决方案 方法一换一个端口运行 方法二杀死其余的端口占用进程重启应用 # 检测端口占用
netstat -npl | grep 端口# 查找占用端口的进程的PID
sudo lsof -i:端口# 根据PID杀死该进程
sudo kill -9 PID2 公测阶段
使用uwsgi应用服务器运行
安装并配置uwsgi应用服务器 安装uwsgi包 pip install uwsgi创建uwsgi.ini文件并编辑 touch uwsgi.ini[uwsgi]# -------------------- 路径相关的设置 --------------------# 项目的路径
chdir /root/.virtualenvs/test111/demo/# Flask的uwsgi文件配对的应用
wsgi-file /root/.virtualenvs/test111/demo/app.py# 回调的app对象
callable app# Python虚拟环境的路径
home /root/.virtualenvs/test111# -------------------- 进程相关的设置 --------------------# 主进程
master true# 最大数量的工作进程
processes 10# 监听5000端口或监听socket文件与nginx配合
http :5000 # socket监听
# socket /srv/[项目名称]/[项目名称].sock# 设置socket的权限
# chmod-socket 666# 退出的时候是否清理环境
vacuum true通过uwsgi应用服务器运行flask应用 uwsgi启动flask项目(venv虚拟环境) # 初始启动uwsgi指令
uwsgi --ini uwsgi.ini退出uwsgi但是不停止服务的操作 # 退出uwsgi但是不停止服务的操作
uwsgi -d --ini uwsgi.ini# 此时想要停止就需要找到uwsgi的进程并全部杀死# 找到所有uwsgi进程ps -ef|grep uwsgi# 杀死所有进程kill -9 进程号5.4 一些bug
问题一读取json时出现问题 error: UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xc3 in position 39: invalid continuation byte reason: 对 string 解码时出现错误 solve: 将app.py中的 with open(static/json/image_text.json, r) as f:image_text json.load(f)改为 with open(static/json/image_text.json, r, encodinggbk) as f:image_text json.load(f)参考https://bobbyhadz.com/blog/python-unicodedecodeerror-utf-8-codec-cant-decode-byte