CentOS部署Web服务器(CentOS+flask+uWSGI+Nginx)

最近租了一台阿里云服务器,秉着不将它闲置的想法,从零基础学习开始搭建了一个Web服务,顺便在这里做个笔记。

文章目录

      • 1. 新用户操作
        • 1.1 创建新用户
        • 1.2 修改新用户权限
        • 1.3 禁止root用户远程登录(选做)
      • 2. 通过证书认证连接服务器
        • 2.1 本地密钥对
        • 2.2 上传服务器
        • 2.3 修改 jhm 用户对 .ssh 的权限
        • 2.4 本地登陆
      • 3. 基本配置
        • 3.1 配置 vim 编辑器
        • 3.2 设置 yum 自动更新
        • 3.3 修改端口配置(选做)
      • 4. 安装并配置 Python3
        • 4.1 下载安装 Python3
        • 4.2 创建虚拟环境 virtualenv
      • 5. 安装并配置 MySQL
        • 5.1 下载安装 MySQL
        • 5.2 配置 MySQL
        • 5.3 设置 MySQL 远程访问(选做)
      • 6. 搭建 Web 服务
        • 6.1 初始化一个简单的 Flask 应用
        • 6.2 配置 Nginx 和 uWSGI
        • 6.3 配置 Flsk 本地项目开发环境(VScode)
        • 6.4 防火墙基本操作
      • 7. 参考链接


1. 新用户操作

  • 一般不在 root 用户下操作,规避风险
1.1 创建新用户
  1. 创建名为 admin 的用户组 # groupadd admin

  2. 添加名为 jhm 的用户 # useradd jhm -g admin

  3. 给 jhm 用户设置密码 # passwd jhm

  4. 查看用户 # vim /etc/passwd

  5. 查看用户组 # vim /etc/group

  6. jhm 用户下次本地可以这样登陆 $ ssh jhm@IP地址

1.2 修改新用户权限
  1. 打开 sudoers 文件并做修改 # sudo vim /etc/sudoers
root    ALL=(ALL)       ALL
jhm     ALL=(ALL)       ALL
# 按 esc 退出编辑模式,按 shift+: 进入命令模式,输入 wq!强制保存并退出
1.3 禁止root用户远程登录(选做)
  1. 打开并修改 sshd_config 文件 # vim /etc/ssh/sshd_config
PermitRootLogin no
# 将井号删去并把 yes 改为 no
  1. 重启 ssh 服务 # systemctl restart sshd.service

2. 通过证书认证连接服务器

  • 方便登陆,不用每次登陆都输一大串(mac系统为例)
2.1 本地密钥对
  1. 在本地计算机找到 .ssh 文件 $ cd .ssh(如没有就 mkdir 一个)

  2. 生成密钥对 $ ssh-keygen -t rsa -C jhm -f jhmfile

  • 生成一个加密类型为 rsa、描述为 jhm、公、私钥名为 jhmfile 的密钥对,输入密码后一路回车;会在本地 .ssh 文件下新增 jhmfile(私钥) 和 jhmfile.pub(公钥) 两个文件
  1. 创建本地配置文件 $ vim .ssh/config
Host jhm
	HostName IP地址
	Port 22
	User jhm
	IdentityFile ~/.ssh/jhmfile
2.2 上传服务器
  1. 远程拷贝公钥 $ scp jhmfile.pub jhm@IP地址:.

  2. 登陆云服务器 jhm 账户,创建 .ssh 文件夹 $ mkdir .ssh

  3. 在 .ssh 文件夹中创建 authorized_keys 文件 $ touch authorized_keys

  4. 将公钥内容写入 authorized_keys 文件中 $ cat jhmfile.pub >> ~/.ssh/authorized_keys

2.3 修改 jhm 用户对 .ssh 的权限
  1. 目录结构解释
总用量 32
drwx------  3 jhm  admin 4096 2月  19 23:17 .
... ...
drwxr-xr-x  2 jhm  admin 4096 2月  19 23:21 .ssh
  • rwx表示可读可写可执行,三个一组;分别表示对 jhm、admin 组内其他用户、除前两者外的其他用户
  1. 修改 .ssh 文件只对 jhm 用户可读可写可执行 $ chmod 700 .ssh
总用量 32
drwx------  3 jhm  admin 4096 2月  19 23:17 .
... ...
drwx------  2 jhm  admin 4096 2月  19 23:21 .ssh
  1. 同理,修改 authorized_keys 权限 $ chmod 600 authorized_keys
总用量 12
drwx------ 2 jhm admin 4096 2月  19 23:21 .
drwx------ 3 jhm admin 4096 2月  19 23:17 ..
-rw-r--r-- 1 jhm admin  385 2月  19 23:24 authorized_keys
2.4 本地登陆
  1. 登出云服务器
  • 在终端输入 exit + 空格 退出服务器;可以将本地的公钥 rm 删除
  1. 登入云服务器
  • 以后想登录服务器就直接在本地输入 $ ssh jhm
  1. 异常现象
  • 如果遇到 Enter passphrase for key ‘xxxx’ ,在本地输入 ssh-add -K xxx 即可 参考链接

3. 基本配置

  • 对云服务器还要做一些基本配置工作
3.1 配置 vim 编辑器
  1. 进入vim的配置文件 # sudo vim /etc/vimrc,并按个人习惯添加或修改 参考链接
set nu	# 显示行号
syntax on	# 语法高亮
set tabstop=4	# tab退4格
3.2 设置 yum 自动更新
  1. 先对 yum 进行升级 $ sudo yum update

  2. 安装 yum 自动更新插件 $ sudo yum install -y cronie yum-cron

  3. 修改 yum 的配置文件 $ sudo vim /etc/yum/yum-cron.conf

apply_updates	yes
  1. 启动刚安装的两个服务 $ sudo systemctl start crond$ sudo systemctl start yum-cron
3.3 修改端口配置(选做)
  1. 安装防火墙 $ sudo yum install -y firewalld,启动防火墙 $ sudo systemctl start firewalld.service

  2. 修改端口配置(四个地方)

  • a) 修改服务器中 ssh 本身的配置 开放的默认端口是 22,为了安全起见需要对其进行修改。进入配置文件 ,将 Port 改为其他数字,比如 12580 $ sudo vim /etc/ssh/sshd_config

  • b) 修改防火墙中关于 ssh 的配置 先将其拷贝到当前防火墙的工作路径中,然后再对 xml 文件进行修改,将 port 改为 12580 $ sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/$ sudo vim /etc/firewalld/services/ssh.xml

  • c) 修改阿里云控制台实例中的安全组 新建添加 12580 端口。需要使用网页版控制台终端(在本地进行重启服务会导致断开链接)进行远程登录,重启远程服务,重启防火墙服务 $ sudo systemctl restart sshd.service$ sudo systemctl restart firewalld.service

  • d) 修改本地计算机上的 .ssh 文件 对其下的 config 文件进行编辑,将 Port 改为 12580

Host jhm
	HostName IP地址
	Port 12580
	User jhm
	IdentityFile ~/.ssh/jhmfile

4. 安装并配置 Python3

  • CentOS 默认只安装了 Python2 ,需要手动安装 Python3
4.1 下载安装 Python3
  1. 安装 Python3 环境依赖 $ sudo yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel gcc libffi-devel nginx

  2. 下载 Python3 安装包(两种方法)

  • a) 在线下载 在 Python网站 上选择合适的 python 版本的 tgz 安装包下载地址 $ wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz(以 3.6.8 为例)

  • b) 远程拷贝 因为在线下载网速会很慢,可以先在本地下载好 tgz 安装包,通过 scp 的方式上传至服务器

  1. 解压缩 $ tar -zxvf Python-3.6.8.tgz

  2. 安装 Python3

  • a) 创建文件 cd 到 /usr/local/ 创建文件 $ sudo mkdir python3

  • b) 指定安装路径 cd 到 Python-3.6.8 文件夹,指定安装路径 $ ./configure --prefix=/usr/local/python3

  • c) 编译和安装 在 Python-3.6.8 文件夹下,输入 make && make install

  1. 制作软链
  • a) Python3 软链 $ sudo ln -s /usr/local/python3/bin/python3 /usr/bin/python3

  • b) pip3 软链 $ sudo ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3

4.2 创建虚拟环境 virtualenv
  1. 下载虚拟环境 $ sudo pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualenv

  2. 创建虚拟环境软链接 $ sudo ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv

  3. 新建项目文件夹 $ sudo mkdir myproject

  4. 创建虚拟环境 $ virtualenv venv(虚拟环境名称)

  5. 进入/退出虚拟环境 $ source venv/bin/activate$ deactivate


5. 安装并配置 MySQL

  • 根据个人项目需要安装数据库
5.1 下载安装 MySQL
  1. 下载 MySQL $ sudo wget https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm

  2. 安装 repo 文件 $ sudo rpm -ivh mysql57-community-release-el7-9.noarch.rpm

  • 执行完成后会在 /etc/yum.repos.d/ 目录下生成 mysql-community.repo 和 mysql-community-source.repo 两个repo文件
  1. 安装插件,先进入到 /etc/yum.repos.d/ 目录后执行 $ sudo yum install mysql-server
5.2 配置 MySQL
  1. 启动 MySQL 服务 $ sudo systemctl start mysqld

  2. 获取临时密码 $ sudo grep 'temporary password' /var/log/mysqld.log

2020-02-25T07:12:09.795178Z 1 [Note] A temporary password is generated for root@localhost: DeC/pka2qk
  • 如果临时密码获取失败,删除原来安装过的 MySQL 残留数据 $ sudo rm -rf /var/lib/mysql,重启 MySQL 服务 $ sudo systemctl restart mysqld,再去获取临时密码
  1. 修改密码,先用临时密码登录 $ mysql -u root -p,修改密码 $ set password="密码"

  2. 设置开机自启动 $ systemctl enable mysqld

  3. 配置默认编码为 utf8,编辑 $ sudo vim /etc/my.cnf

character_set_server=utf8 init_connect='SET NAMES utf8'
  1. 安装与 python 相关的中间件 pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple flask_sqlalchemy PyMySQL flask-script flask-migrate
5.3 设置 MySQL 远程访问(选做)
  1. 改表 参考链接
  • a) 进入 mysql 数据库 use mysql;

  • b) 查看 user 表的 host 值 select host,user from user;(即可进行连接访问的主机/IP名称)

  • c) 修改 host 值 update user set host='%' where host='localhost';(以通配符%的内容增加主机/IP地址,也可以直接增加IP地址)

  • d) 刷新 MySQL 的系统权限相关表 flush privileges;

  1. 开放防火墙的 3306 端口 $ sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent,重启防火墙 $ sudo firewall-cmd --reload(记得还要去阿里云控制台安全组中新添一个 3306 的规则)参考链接

6. 搭建 Web 服务

  • 终于到正餐了…
6.1 初始化一个简单的 Flask 应用
  1. 进入虚拟环境,安装 Flask pip3 install flask

  2. 创建 flask 文件 sudo vim myproject/flask_test.py

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello ~"


if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5000, debug=True)
  1. 打开 5000 端口 sudo firewall-cmd --permanent --add-port=5000/tcp,操作完必须重启 sudo firewall-cmd --reload(记得还要去阿里云控制台安全组中新添一个 5000 的规则) 参考链接

  2. 启动 flask 测试服务 python3 flask_test.py,在浏览器访问 http://IP地址:5000

6.2 配置 Nginx 和 uWSGI
  1. 在虚拟环境中,使用 pip3 安装 uWSGI $ sudo pip3 install uwsgi

  2. 创建 uWSGI 软链 $ sudo ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi

  3. 使用 yum 安装 Nginx $ sudo yum -y install nginx

  4. 编辑 uWSGI 的配置文件 sudo vim myproject/uwsgi.ini

[uwsgi]

#uwsgi启动时所使用的地址与端口
socket = 127.0.0.1:5000

#虚拟环境目录 
home = /home/jhm/myproject/venv

#项目目录
pythonpath = /home/jhm/myproject

#指向网站根目录
chdir = /home/jhm/myproject

#python启动程序文件
wsgi-file = flask_test.py

#python程序内用于启动的application变量名
callable = app

#处理器数
processes = 4 

#线程数
threads = 2 

#状态监测地址
stats = 127.0.0.1:9191 
  1. 对 nginx 进行配置 $ sudo vim /etc/nginx/nginx.conf
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include for more information.

server {
	listen       80 default_server;
	server_name  IP地址;
	
	location / {
		include uwsgi_params;
		uwsgi_pass 127.0.0.1:5000;
		uwsgi_param UWSGI_PYHOME /home/jhm/myproject/venv;
		uwsgi_param UWSGI_CHDIR /home/jhm/myproject;
		uwsgi_param UWSGI_SCRIPT flask_test:app;
	}	
	error_page 404 /404.html;
		location = /40x.html {
	}
	error_page 500 502 503 504 /50x.html;
		location = /50x.html {
	}
}
  1. 启动 nginx 服务 $ sudo systemctl start nginx

  2. 重启 nginx 服务 $ sudo systemctl restart nginx.service

  3. 启动 uwsgi 服务器 $ uwsgi -d --ini uwsgi.ini

  4. 关闭 uwsgi 服务器 $ pkill -f uwsgi -9

6.3 配置 Flsk 本地项目开发环境(VScode)
  1. 在本地新建一个文件夹 flask-centos,使用 vscode 打开(需要中文界面,下载安装插件 Chinese)

  2. 下载安装插件 sftp,按快捷键 ⇧+⌘+p, 打开控制面板,搜索 sftp.config,会生成一个 .vscode 文件夹里面有一个 sftp.json 对其进行配置 参考链接

{
    "name": "flask-centos",
    "host": "IP地址",
    "protocol": "sftp/ftp",
    "port": 22,
    "username": "jhm",
    "password":"密码",
    "remotePath": "~/myproject",
    "uploadOnSave": true,
    "ignore": [".vscode", ".git", ".DS_Store", "__pycache__"],
	"syncOption": {"delete": true}
}
  1. 下载 按快捷键 ⇧+⌘+p, 打开控制面板,搜索 SFTP:Sync Remote -> Local

  2. 上传 按快捷键 ⇧+⌘+p, 打开控制面板,搜索 SFTP:Sync Local -> Remote

  3. 权限问题报错 如果修改了代码是无法是无法成功同步的,可能是因为权限问题。登陆服务器,$ cd myproject/,ls -al 查看

drwxr-xr-x  3 root root 4096 2月  22 13:22 myproject
  • 将 myprojects 文件夹的所有者都改为 jhm,$ sudo chown -R jhm myproject
drwxr-xr-x  3 jhm root 4096 2月  22 13:22 myproject
6.4 防火墙基本操作

参考链接

  • 启动防火墙 $ sudo systemctl start firewalld.service

  • 查看防火墙状态 $ sudo firewall-cmd --state

  • 允许http通信 $ sudo firewall-cmd --permanent --zone=public --add-service=http

  • 允许https通信 $ sudo firewall-cmd --permanent --zone=public --add-service=https

  • 打开某个端口 sudo firewall-cmd --permanent --zone=public --add-port=5000/tcp

  • 重启防火墙 $ sudo firewall-cmd --reload

  • 查看开启的所有端口 $ sudo firewall-cmd --zone=public --list-ports

  • 关闭某个端口 sudo firewall-cmd --permanent --zone=public --remove-port=5000/tcp

  • 停止防火墙 $ sudo systemctl stop firewalld.service

  • 禁止防火墙开机启动 $ sudo systemctl disable firewalld.service


7. 参考链接

CentOS相关
uWSGI+nginx1
uWSGI+nginx2
MySQL相关
防火墙相关1
防火墙相关2

你可能感兴趣的:(Linux,linux,centos,mysql)