带你迈过那些部署服务器时的坑?

栏目: Python · 发布时间: 6年前

内容简介:在开发环境完成了Flask项目的开发以后,就需要将项目部署到服务器上,开发时由Werkzeug提供的开发服务器是无法应用于实际项目的,在生产环境中必须使用专门的服务器程序,web服务器程序非常多,本文服务器操作系统为Centos7,网站服务器采用的是uwsgi和nginx(反向代理),数据库为开发时使用的mysql 8。关于uwsgi和nginx的相关知识另外写文章介绍,这是部署Python web项目主流方式,性能和稳定性都很好,部署也很简单。现在很多小型项目都会采用云服务器,这种方式成本更低,操作更方

在开发环境完成了Flask项目的开发以后,就需要将项目部署到服务器上,开发时由Werkzeug提供的开发服务器是无法应用于实际项目的,在生产环境中必须使用专门的服务器程序,web服务器程序非常多,本文服务器操作系统为Centos7,网站服务器采用的是uwsgi和nginx(反向代理),数据库为开发时使用的 mysql 8。

一、基础环境

关于uwsgi和nginx的相关知识另外写文章介绍,这是部署Python web项目主流方式,性能和稳定性都很好,部署也很简单。现在很多小型项目都会采用云服务器,这种方式成本更低,操作更方便,用户只需要填入相应的选项就可以得到一台服务器,省去了安装配置操作系统的复杂操作。

带你迈过那些部署服务器时的坑?

拿到云服务商给我们的服务器后,我们就可以ssh远程登录上去操作了,我们应该做以下几件事情完成基础环境的配置:(下文命令前面是#代表root用户登录,$代表普通用户)

1.修改root密码

这是 Linux 系统最高权限的账户,所以第一件事情修改它的密码非常重要。

# passwd root 

然后输入复杂度足够的密码(大写字母+小写字母+符号>8位)

2.创建用户

root账户的权限太高,为了安全,部署服务器必须新建一个账户

# adduser deploy 
# passwd deploy 

然后输入复杂度足够的密码(大写字母+小写字母+符号>=8位),但是有时候还是需要管理员权限,所以需要把它加入到sudoers中,这样就可以临时使用sudo命令来提权。

# vi /etc/sudoers 

新增一行

deploy  ALL=(ALL)       ALL 

3.安装基础软件

安装openssl,这个是pip需要依赖的。

$ sudo yum -y install openssl-devel 

安装EPEL扩展仓库,后面安装nginx时需要

$ sudo yum -y install epel-release 

安装wget,后面安装 Python 和MySQL时需要

$ sudo yum -y install wget 

安装zlib,后面安装Python时需要

$ sudo yum -y install zlib* 

4.配置

防火墙配置,很多初学者配置完成后发现仍然不能访问,原因是被防火墙挡住了。

$ sudo firewall-cmd --permanent --zone=public --add-service=http 
$ sudo firewall-cmd --permanent --zone=public --add-service=https 
$ sudo firewall-cmd –reload 

关闭SELinux,这也是一个大坑,它会导致nginx无法读取uwsgi创建的sock,即使配置了相应的用户也不行

$ sudo vi /etc/selinux/config 
SELINUX=disabled 

然后重启服务器

$ sudo init 6 

服务器的基础配置就完成了。

二、安装Python

Python因为2和3不兼容造成了很多问题,除了一些遗留系统,现在新开发的程序都是采用Python3,Centos7自带的是Python2.7,就需要自行安装Python3,本文以Python3.6.3为例:

1.创建安装目录

Python的安装目录和库依赖也是一个坑,我们将Python3安装在一个目录中,如果后续要卸载的话直接删除即可。

$ sudo mkdir /usr/local/python3 
$ cd /usr/local/python3 

2.下载及解压

使用前面安装的wget来下载Python源码包

$ sudo wget https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz 

使用tar命令来解压包,这个命令使用频率非常高,大家可以搜索具体的参数用法。

$ sudo tar -xvf Python-3.6.3.tgz 

3.配置编译安装

$ cd Python-3.6.3/ 

这里prefix是指定python的安装目录,--with-ssl是指定使用openssl,前面已经安装了openssl,如果不指定会导致pip无法使用。

$ sudo ./configure --prefix=/usr/local/python3 --with-ssl 
$ sudo make 
$ sudo make install 

4.链接

可以把链接看成windows中的快捷方式,Linux中我们敲的那些命令来自于/usr/bin和/usr/sbin,如果我们程序安装后,仍然出现command not found就需要做一个链接到/usr/bin中。

$ cd /usr/bin 
$ sudo ln -s /usr/local/python3/bin/python3 /usr/bin/python3 
$ sudo ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3 

5.配套安装

通常pip的版本都是不够新的,需要升级,下面两种方法都可以:

$ sudo pip install --upgrade pip  
$ sudo python3 -m pip install --upgrade pip 

virtualenv是一个神器,它用来隔离各种不同的Python运行环境,避免了不同项目依赖的库版本不同导致的冲突。

$ sudo yum install python-virtualenv 

为什么不使用pip来安装?因为在Centos中会安装成模块,无法全局调用,简单的处理方式就是使用yum来安装,后面的uwsgi同理。

$ sudo yum install uwsgi 

安装nginx

$ sudo yum install nginx 

三、安装配置mysql8

在Centos中直接用yum安装mysql会安装mariadb,对于数据库我们需要精确的控制版本,所以需要其他安装方式。

1.安装mysql

  1. $ cd ~ 

获取mysql的仓库文件并安装

$ wget http://repo.mysql.com/mysql80-community-release-el7-1.noarch.rpm 

安装仓库

$ sudo rpm -ivh mysql80-community-release-el7-1.noarch.rpm 

添加mysql到repolist

$ sudo yum repolist enabled | grep "mysql.*-community.*" 

查看列表状态,准备安装的版本是否为enable。

$ sudo yum repolist all | grep mysql 

安装mysql

$ sudo yum install mysql-community-server 

2.启动mysql

在centos中使用systemctl命令来控制服务启动、重启、停止、设置开机启动和查看状态,后面我们会编写一个服务来自启动uwsgi

启动

$ sudo systemctl start mysqld.service 

停止

$ sudo systemctl stop mysqld.service 

重启

$ sudo systemctl restart mysqld.service 

查看状态

$ sudo systemctl status mysqld.service 

设置开机启动

$ sudo systemctl enable mysqld.service 

取消开机启动

$ sudo systemctl disable mysqld.service 

3.mysql的操作

安装过程中我们并没有设置账号密码,但是mysql默认有一个root账号,安装时为它设置了临时密码,我们第一件事就是查看这个密码登录root账号,并修改密码。

查看root账号临时密码

$ sudo grep 'temporary password' /var/log/mysqld.log 

登录root账号并修改密码

$ mysql -u root –p 

输入临时密码后进入mysql的操作界面

>ALTER USER 'root'@'localhost' IDENTIFIED BY 'yourpassword'; 

和Linux一样,我们同样不能使用root账号来操作数据库,应该新建一个账号来连接相应的数据库。

新建用户

>ALTER USER 'root'@'localhost' IDENTIFIED BY 'yourpassword'; 

新建数据库

>create datebase webapp charset=utf8mb4 collate=utf8mb4_unicode_ci; 

数据库授权

>grant all privileges on *.* to 'flask'@'lcoalhost' with grant option; 

四、配置服务器

现在已经万事俱备了,我们只需要做相应的配置就可以完成服务器的搭建了。

1.配置python虚拟环境及安装依赖

首先将我们完成开发的程序传到服务器上,在开发计算机上使用scp命令:

$ scp –r local_folder user@server_ip:/home/user/myapp 

输入服务器的user用户的密码

然后新建虚拟环境

$ cd /home/user/myapp  
$ virtualenv venv --python=python3 

进入虚拟环境

$ source venv/bin/activate 

安装依赖

requirements.txt是我们在开发完成后使用pip freeze > requirements.txt生成的。

(venv)$ pip install -i https://pypi.douban.com/simple -r requirements.txt 

-i 参数是使用豆瓣源,速度嗖嗖快,-r是指安装requirements.txt逐个安装。

导入数据库表

(venv)$ python3 manage.py db init 
(venv)$ python3 manage.py db migrate 
(venv)$ python3 manage.py db upgrade 

退出虚拟环境

(venv)$ deactivate 

2.配置uwsgi

在项目文件夹中新建一个uwsgi.py的文件和uwsgi.ini的文件,并填入配置

$ cd /path/to/your/project 

新建uwsgi.py

$ vi uwsgi.py 

导入创建应用的工厂函数

from webapp import create_app 
app = create_app("production)" 

新建uwsgi.ini

$ vi uwsgi.ini 

输入以下内容:

[uwsgi] 
module = uwsgi:app 
master = true 
processes = 5 
uid = user 
socket = /run/uwsgi/myapp.sock 
chown-socket = user:nginx 
chmod-socket = 660 
vacuum = true 
die-on-term = true 

上面的配置文件中的user是你新建的Linux用户名,第一句是告诉uwsgi我们的应用是uwsgi文件中的app,master和processes是服务器是否启用主进程和进程数,uid是启动uwsgi的用户,scoket是指把uwsgi生成的sock放在什么地方,chown-socket是修改sock的所有者,这样nginx和uwsgi可以同时访问,chmod-socket是修改sock的权限,vacuum是在程序退出时移除sock,因为后面我们会使用systemd来控制uwsgi,因为其中控制信号存在差别,所以使用die-on-term参数。

使用systemd控制uwsgi

新建uwsgi服务

$ sudo vi /etc/systemd/system/uwsgi.service 

填入如下内容:

[Unit] 
Description=uWSGI instance to serve myapp 
[Service] 
ExecStartPre=-/usr/bin/bash -c 'mkdir -p /run/uwsgi; chown user:nginx /run/uwsgi' 
ExecStart=/usr/bin/bash -c 'cd /home/user/myapp; source myappenv/bin/activate; uwsgi --ini myapp.ini' 
[Install] 
WantedBy=multi-user.target 

这样就完成了uwsgi的配置,我们可以像控制mysql一样来控制uwsgi了。

$ sudo systemctl start uwsgi 
$ systemctl status uwsgi 
$ sudo systemctl enable uwsgi 
$ sudo systemctl stop uwsgi 

3.配置nginx

nginx的配置文件位于/etc/nginx/nginx.conf

$ sudo vi /etc/nginx/nginx.conf 

我们只需要修改相应部分就可以了,关于nginx更多的细节将单独再写。

server { 
 
    listen 80; 
 
    server_name server_domain_or_IP; 
 
    location / { 
 
        include uwsgi_params; 
 
        uwsgi_pass unix:/run/uwsgi/myapp.sock; 
 
    } 
 
           location /static/ { 
 
                     alias /home/user/myapp/static/; 
 
} 

这里我们添加了location /static/,这是为了让js css这些静态文件直接由nginx接管,所以要修改这些静态文件的访问权限。

$ cd /home/user/myapp/static/ 
$ chown -R user:nginx static 
$ chmod -R 660 static 

最后还有一个小坑,nginx在启动加载时会报错。

$ sudo mkdir /etc/systemd/system/nginx.service.d  
$ cd /etc/systemd/system/nginx.service.d 
$ sudo vi override.conf 

填入如下内容:

[Service]  
ExecStartPost=/bin/sleep 0.1 

保存退出!

到此配置就完成了,启动服务看看效果吧!

测试nginx

$ sudo nginx -t 

启动nginx

$ sudo systemctl start nginx 

设置开机启动

$ sudo systemctl enable nginx 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Mechanics of Web Handling

The Mechanics of Web Handling

David R. Roisum

This unique book covers many aspects of web handling for manufacturing, converting, and printing. The book is applicable to any web including paper, film, foil, nonwovens, and textiles. The Mech......一起来看看 《The Mechanics of Web Handling》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具