最近租了一台阿里云服务器,秉着不将它闲置的想法,从零基础学习开始搭建了一个Web服务,顺便在这里做个笔记。
1. 新用户操作
- 一般不在 root 用户下操作,规避风险
1.1 创建新用户
-
创建名为 admin 的用户组
# groupadd admin
-
添加名为 jhm 的用户
# useradd jhm -g admin
-
给 jhm 用户设置密码
# passwd jhm
-
查看用户
# vim /etc/passwd
-
查看用户组
# vim /etc/group
-
jhm 用户下次本地可以这样登陆
$ ssh jhm@IP地址
1.2 修改新用户权限
- 打开 sudoers 文件并做修改
# sudo vim /etc/sudoers
root ALL=(ALL) ALL
jhm ALL=(ALL) ALL
# 按 esc 退出编辑模式,按 shift+: 进入命令模式,输入 wq!强制保存并退出
1.3 禁止root用户远程登录(选做)
- 打开并修改 sshd_config 文件
# vim /etc/ssh/sshd_config
PermitRootLogin no
# 将井号删去并把 yes 改为 no
- 重启 ssh 服务
# systemctl restart sshd.service
2. 通过证书认证连接服务器
- 方便登陆,不用每次登陆都输一大串(mac系统为例)
2.1 本地密钥对
-
在本地计算机找到 .ssh 文件
$ cd .ssh
(如没有就 mkdir 一个) -
生成密钥对
$ ssh-keygen -t rsa -C jhm -f jhmfile
- 生成一个加密类型为 rsa、描述为 jhm、公、私钥名为 jhmfile 的密钥对,输入密码后一路回车;会在本地 .ssh 文件下新增 jhmfile(私钥) 和 jhmfile.pub(公钥) 两个文件
- 创建本地配置文件
$ vim .ssh/config
Host jhm
HostName IP地址
Port 22
User jhm
IdentityFile ~/.ssh/jhmfile
2.2 上传服务器
-
远程拷贝公钥
$ scp jhmfile.pub jhm@IP地址:.
-
登陆云服务器 jhm 账户,创建 .ssh 文件夹
$ mkdir .ssh
-
在 .ssh 文件夹中创建 authorized_keys 文件
$ touch authorized_keys
-
将公钥内容写入 authorized_keys 文件中
$ cat jhmfile.pub >> ~/.ssh/authorized_keys
2.3 修改 jhm 用户对 .ssh 的权限
- 目录结构解释
总用量 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 组内其他用户、除前两者外的其他用户
- 修改 .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
- 同理,修改 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 本地登陆
- 登出云服务器
- 在终端输入 exit + 空格 退出服务器;可以将本地的公钥 rm 删除
- 登入云服务器
- 以后想登录服务器就直接在本地输入
$ ssh jhm
- 异常现象
- 如果遇到 Enter passphrase for key ‘xxxx’ ,在本地输入 ssh-add -K xxx 即可 参考链接
3. 基本配置
- 对云服务器还要做一些基本配置工作
3.1 配置 vim 编辑器
- 进入vim的配置文件
# sudo vim /etc/vimrc
,并按个人习惯添加或修改 参考链接
set nu # 显示行号
syntax on # 语法高亮
set tabstop=4 # tab退4格
3.2 设置 yum 自动更新
-
先对 yum 进行升级
$ sudo yum update
-
安装 yum 自动更新插件
$ sudo yum install -y cronie yum-cron
-
修改 yum 的配置文件
$ sudo vim /etc/yum/yum-cron.conf
apply_updates yes
- 启动刚安装的两个服务
$ sudo systemctl start crond
,$ sudo systemctl start yum-cron
3.3 修改端口配置(选做)
-
安装防火墙
$ sudo yum install -y firewalld
,启动防火墙$ sudo systemctl start firewalld.service
-
修改端口配置(四个地方)
-
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
-
安装 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
-
下载 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 的方式上传至服务器
-
解压缩
$ tar -zxvf Python-3.6.8.tgz
-
安装 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
- 制作软链
-
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
-
下载虚拟环境
$ sudo pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualenv
-
创建虚拟环境软链接
$ sudo ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv
-
新建项目文件夹
$ sudo mkdir myproject
-
创建虚拟环境
$ virtualenv venv(虚拟环境名称)
-
进入/退出虚拟环境
$ source venv/bin/activate
,$ deactivate
5. 安装并配置 MySQL
- 根据个人项目需要安装数据库
5.1 下载安装 MySQL
-
下载 MySQL
$ sudo wget https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
-
安装 repo 文件
$ sudo rpm -ivh mysql57-community-release-el7-9.noarch.rpm
- 执行完成后会在 /etc/yum.repos.d/ 目录下生成 mysql-community.repo 和 mysql-community-source.repo 两个repo文件
- 安装插件,先进入到 /etc/yum.repos.d/ 目录后执行
$ sudo yum install mysql-server
5.2 配置 MySQL
-
启动 MySQL 服务
$ sudo systemctl start mysqld
-
获取临时密码
$ 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
,再去获取临时密码
-
修改密码,先用临时密码登录
$ mysql -u root -p
,修改密码$ set password="密码"
-
设置开机自启动
$ systemctl enable mysqld
-
配置默认编码为 utf8,编辑
$ sudo vim /etc/my.cnf
character_set_server=utf8 init_connect='SET NAMES utf8'
- 安装与 python 相关的中间件
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple flask_sqlalchemy PyMySQL flask-script flask-migrate
5.3 设置 MySQL 远程访问(选做)
- 改表 参考链接
-
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;
- 开放防火墙的 3306 端口
$ sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent
,重启防火墙$ sudo firewall-cmd --reload
(记得还要去阿里云控制台安全组中新添一个 3306 的规则)参考链接
6. 搭建 Web 服务
- 终于到正餐了…
6.1 初始化一个简单的 Flask 应用
-
进入虚拟环境,安装 Flask
pip3 install flask
-
创建 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)
-
打开 5000 端口
sudo firewall-cmd --permanent --add-port=5000/tcp
,操作完必须重启sudo firewall-cmd --reload
(记得还要去阿里云控制台安全组中新添一个 5000 的规则) 参考链接 -
启动 flask 测试服务
python3 flask_test.py
,在浏览器访问http://IP地址:5000
6.2 配置 Nginx 和 uWSGI
-
在虚拟环境中,使用 pip3 安装 uWSGI
$ sudo pip3 install uwsgi
-
创建 uWSGI 软链
$ sudo ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
-
使用 yum 安装 Nginx
$ sudo yum -y install nginx
-
编辑 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
- 对 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 {
}
}
-
启动 nginx 服务
$ sudo systemctl start nginx
-
重启 nginx 服务
$ sudo systemctl restart nginx.service
-
启动 uwsgi 服务器
$ uwsgi -d --ini uwsgi.ini
-
关闭 uwsgi 服务器
$ pkill -f uwsgi -9
6.3 配置 Flsk 本地项目开发环境(VScode)
-
在本地新建一个文件夹 flask-centos,使用 vscode 打开(需要中文界面,下载安装插件 Chinese)
-
下载安装插件 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}
}
-
下载 按快捷键 ⇧+⌘+p, 打开控制面板,搜索 SFTP:Sync Remote -> Local
-
上传 按快捷键 ⇧+⌘+p, 打开控制面板,搜索 SFTP:Sync Local -> Remote
-
权限问题报错 如果修改了代码是无法是无法成功同步的,可能是因为权限问题。登陆服务器,
$ 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