笔记 在Ubuntu云服务器上部署Python后端



云服务器系统版本为Ubuntu 18.04.1 LTS,对于其他Ubuntu版本或其他的类Unix系统,本文仅供参考!



主要内容如下:

  • 配置SSH
  • 安装和配置MySQL 8
  • 安装和配置Git
  • 创建低权限用户,用于Nginx配置
  • 使用Pyenv创建虚拟环境
  • 安装Docker
  • 安装和配置Redis
  • 安装和配置Nginx反向代理服务器
  • 用免费的SSL证书配置HTTPS和WSS



配置SSH

启用RSA Public Key认证,关掉root用户的密码登录方式。

# 编辑SSH服务配置
vim /etc/ssh/sshd_config
# 允许root登录,但是禁止root密码登录
PermitRootLogin prohibit-password

# 通过RSA认证
RSAAuthentication yes

# 允许pubKey(id_rsa.pub)登录
PubkeyAuthentication yes

# key信息列表所在位置
AuthorizedKeysFile      .ssh/authorized_keys

然后,将个人的SSH Key加入到 .ssh/authorized_keys文件中。
这个文件,一般在当前用户的主目录下,也就是~/.ssh/authorized_keys。

# 重启SSH服务
service ssh restart



安装和配置MySQL 8

首先,下载(APT Repository)[https://dev.mysql.com/downloads/repo/apt/]。

# 在用户主目录下,新建一个下载目录,然后进入到下载目录。

#使用wget指令下载APT Repository
wget https://dev.mysql.com/get/mysql-apt-config_0.8.10-1_all.deb

# 安装 APT Repository,安装完成后会弹出红色框,通过第一个选项选择MySQL 8,后面的两个选项都是工具包,可以根据个人的需要进行禁用。
sudo dpkg -i mysql-apt-config_0.8.10-1_all.deb

# 从MySQL APT repository更新包
sudo apt-get update

# 安装MySQL
sudo apt-get install mysql-server

# 查看MySQL服务的运行状态
sudo service mysql status

# 停止服务
#sudo service mysql stop

# 开始服务
#sudo service mysql start

至此,MySQL的安装就完成了。



接下来,开始配置MySQL,尤其是修改root用户的登录密码。

由于MySQL 8比较新,而且更改root用户密码的方式也有所变动,所以以往的教程可能无法成功更改root用户密码。
这里附上一篇比较值得参考的文章Centos7重置Mysql 8.0.1 root 密码。



配置完root用户的登录密码之后,登录root用户:

# 使用自行配置的密码登录root用户
> mysql -u root -p 

创建一个低权限用户:

# 使用 '%' 可以使该用户进行远程登录,如果写成localhost就只能在本机上登录
CREATE USER 'test_user'@'%' IDENTIFIED BY 'your_password';

创建数据库:

create database test_db character set utf8;

为用户分配数据库操作权限:

# 替换test_db、test_user为有效的数据库名称、用户名
grant all privileges on test_db.* to test_user@'%';
flush privileges; 

查看数据库是否已经成功创建,并选中数据库:

# 查看数据库列表
show databases; 

# 选中数据库
use test_db
# 退出MySQL
exit

至此,MySQL数据库的配置就算基本完成了。至于建表,就交给Python后端来完成吧!



安装和配置Git

使用git,可以很方便地将项目部署到服务器上。

# 安装git
apt install git

# 查看git版本,请保证版本高于2.0,否则就要考虑升级版本了
git --version



创建低权限用户,用于Nginx配置

# 创建用户名为www,主路径为:/home/www的用户,后端项目就部署在此用户的目录下
useradd -d /home/www -m www

# 设置www用户的密码
passwd www



使用Pyenv创建虚拟环境

首先,下载和安装:

# 在下载目录下载pyenv
wget https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer

# 安装
bash pyenv-installer

将以下内容添加到 ~/.bashrc 或者~/.profile里

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

重新加载一下配置,以保证pyenv立即可用

source ~/.bashrc
source ~/.profile

然后用git将项目拉到www用户的主目录下,进入项目根目录:

# 查看可用的python版本
pyenv install --list

# 笔者选择安装python 3.6.6,请根据个人需要进行选择
pyenv install 3.6.6

可能会出现的错误及解决方案:
1.zipimport.ZipImportError: can't decompress data; zlib not available
2.ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?
3.BUILD FAILED (Ubuntu 18.04 using python-build 20180424)

# 基于python 3.6.6,创建项目的虚拟环境venv,venv这个名字可以自定义
pyenv virtualenv 3.6.6 venv

# 将当前路径的python虚拟环境设置为venv
pyenv local venv

# 查看当前的虚拟环境列表,会发现venv已经被选中
pyenv versions



安装Docker (项目中采用了nameko微服务框架,需要用到RabbitMQ)

Ubuntu下Docker的安装教程:
docker学习笔记(一)—— ubuntu16.04下安装docker

在Docker中安装并启动RabbitMQ:

# 获取容器软件包
docker pull rabbitmq:3-management
# 创建一个容器服务
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 docker.io/rabbitmq:3-management
# 查看docker容器服务
docker ps -a
docker ps
# 启动rabitmq
docker start rabbitmq



安装和配置Redis

apt install redis-server

可能会遭遇的错误及解决方案:
1.dpkg: error processing package redis-server (--configure):

# 查看redis-server是否在运行
ps aux | grep redis

# 采用默认的redis配置启动redis-server
redis-server /etc/redis/redis.conf

如果无法启动redis-server,就去查看logfile里面的报错信息,根据logfile进行调试。
logfile的位置,在/etc/redis/redis.conf中有相关的配置项,即可查看logfile所在路径。


修改redis-server配置项时需要注意的事项:
  • 配置bind 127.0.0.1,拒绝外网访问能够避免很多威胁;
  • 修改port 6379,不使用默认的端口号,避免威胁;
  • 配置requirepass,设置一个高强度的密码;



安装和配置Nginx反向代理服务器

选择自己喜好的Nginx版本进行安装,推荐nginx-full,免得以后还要去增加模块

apt install nginx-core
apt install nginx-extras
apt install nginx-full
apt install nginx-light

# 查看Nginx版本,笔者安装的是v1.14.0
nginx -V

如果不小心选错了,想卸载重装,看这里:Ubuntu安装Nginx和正确卸载Nginx。



在域名提供商提供的控制台,配置域名指向服务器的公网IP。

笔记 在Ubuntu云服务器上部署Python后端_第1张图片
配置域名指向



然后配置Nginx.conf。

# 测试指令,可以输出nginx配置文件所在位置,以及该配置是否可用
nginx -t
# 路径根据个人情况可能有所不同,请注意看nginx -t 指令输出的位置

# 修改nginx.conf
vim /etc/nginx/nginx.conf

在http所在的花括号中增加一个日志配置项:

# 注意缩进格式
log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]'
        '$host "$request_uri" $request_method $status '
        '"$http_referer" "$http_user_agent"';

在http所在花括号的最底部会有include指令,如:include /etc/nginx/conf.d/*.conf;
你可以到/etc/nginx/conf.d/目录下创建你所需要的配置,并命名为xxx.conf;



比如,笔者创建了rest.domain.net.conf、ws.domain.net.conf。
前一个用于rest请求,后一个用于websocket请求。

rest.domain.net.conf配置如下,仅供参考:
server
{
        # project_dir请替换为项目根路径
        access_log /home/www/project_dir/nginx_access_log.log combined_realip;
        listen 80;
        server_name rest.domain.net;

        ## 访问根
        location = / {
            proxy_pass http://0.0.0.0:10000;
        }

        # 其他所有请求
        location / {
            try_files $uri $uri/ @proxy;
        }

        # Proxy connections to the application servers
        # app_servers
        location @proxy {
            proxy_pass         http://0.0.0.0:10000;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;

        }
}
ws.domain.net.conf配置如下,仅供参考:
server
{
        # project_dir请替换为项目根路径
        access_log /home/www/project_dir/nginx_access_log.log combined_realip;
        listen 80;
        server_name ws.domain.net;

        ## 访问根
        location = / {
            proxy_pass http://0.0.0.0:10001/ws; #:$arg_port;
            # WebScoket Support
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";

            proxy_set_header Origin dev.xybw.net;
            #proxy_set_header X-NginX-Proxy true;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
        }
}

关于Nginx的location配置,可以参考这篇文章进行理解nginx的location配置详解

# 测试配置,每次配置完成时,都可以使用这个指令测试配置是否可用
nginx -t

# 如果nginx提示配置ok,软重启nginx即可
nginx -s reload


启动Python后端项目

启动Python后端项目,通过配置的域名从外部来该服务器,即可验证部署是否成功。



用免费的SSL证书配置HTTPS和WSS

安装certbot

sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-nginx 

自动配置Nginx的SSL相关参数:

certbot --nginx

编辑定时任务:

crontab -e

插入本行内容,并保存退出,定时任务即可生效

# 分  时  某月中的几号  几月  星期几  *代表任何时候 ,分隔多个相同类型的参数
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew

如果系统默认打开的编辑器不是vim,可以修改环境变量
在~/.profile中加入以下内容,并保存退出

vim ~/.profile
export EDITOR="/usr/bin/vim";

加载更新的EDITOR配置:

source ~/.profile

然后再重新使用crontab -e添加定时任务。



现在,尝试使用HTTPS和WSS来进行连接吧!





Ficow Shen原创文章,转载请 注明出处。

你可能感兴趣的:(笔记 在Ubuntu云服务器上部署Python后端)