云服务器系统版本为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。
然后配置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原创文章,转载请 注明出处。