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

服务器
在开发环境完成了Flask项目的开发以后,就需要将项目部署到服务器上,开发时由Werkzeug提供的开发服务器是无法应用于实际项目的,在生产环境中必须使用专门的服务器程序。

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

一、基础环境

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

[[241543]]

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

1.修改root密码

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

# passwd root 
  • 1.

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

2.创建用户

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

# adduser deploy 
# passwd deploy 
  • 1.
  • 2.

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

# vi /etc/sudoers 
  • 1.

新增一行

deploy  ALL=(ALL)       ALL 
  • 1.

3.安装基础软件

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

$ sudo yum -y install openssl-devel 
  • 1.

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

$ sudo yum -y install epel-release 
  • 1.

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

$ sudo yum -y install wget 
  • 1.

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

$ sudo yum -y install zlib* 
  • 1.

4.配置

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

$ sudo firewall-cmd --permanent --zone=public --add-service=http 
$ sudo firewall-cmd --permanent --zone=public --add-service=https 
$ sudo firewall-cmd –reload 
  • 1.
  • 2.
  • 3.

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

$ sudo vi /etc/selinux/config 
SELINUX=disabled 
  • 1.
  • 2.

然后重启服务器

$ sudo init 6 
  • 1.

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

二、安装Python

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

1.创建安装目录

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

$ sudo mkdir /usr/local/python3 
$ cd /usr/local/python3 
  • 1.
  • 2.

2.下载及解压

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

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

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

$ sudo tar -xvf Python-3.6.3.tgz 
  • 1.

3.配置编译安装

$ cd Python-3.6.3/ 
  • 1.

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

$ sudo ./configure --prefix=/usr/local/python3 --with-ssl 
$ sudo make 
$ sudo make install 
  • 1.
  • 2.
  • 3.

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 
  • 1.
  • 2.
  • 3.

5.配套安装

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

$ sudo pip install --upgrade pip  
$ sudo python3 -m pip install --upgrade pip 
  • 1.
  • 2.

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

$ sudo yum install python-virtualenv 
  • 1.

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

$ sudo yum install uwsgi 
  • 1.

安装nginx

$ sudo yum install nginx 
  • 1.

三、安装配置mysql8

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

1.安装mysql

$ cd ~ 
  • 1.

获取mysql的仓库文件并安装

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

安装仓库

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

添加mysql到repolist

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

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

$ sudo yum repolist all | grep mysql 
  • 1.

安装mysql

$ sudo yum install mysql-community-server 
  • 1.

2.启动mysql

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

启动

$ sudo systemctl start mysqld.service 
  • 1.

停止

$ sudo systemctl stop mysqld.service 
  • 1.

重启

$ sudo systemctl restart mysqld.service 
  • 1.

查看状态

$ sudo systemctl status mysqld.service 
  • 1.

设置开机启动

$ sudo systemctl enable mysqld.service 
  • 1.

           取消开机启动

$ sudo systemctl disable mysqld.service 
  • 1.

3.mysql的操作

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

查看root账号临时密码

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

登录root账号并修改密码

$ mysql -u root –p 
  • 1.

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

>ALTER USER 'root'@'localhost' IDENTIFIED BY 'yourpassword'
  • 1.

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

新建用户

>ALTER USER 'root'@'localhost' IDENTIFIED BY 'yourpassword'
  • 1.

新建数据库

>create datebase webapp charset=utf8mb4 collate=utf8mb4_unicode_ci; 
  • 1.

数据库授权

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

四、配置服务器

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

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

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

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

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

然后新建虚拟环境

$ cd /home/user/myapp  
$ virtualenv venv --python=python3 
  • 1.
  • 2.

进入虚拟环境

$ source venv/bin/activate 
  • 1.

安装依赖

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

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

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

导入数据库表

(venv)$ python3 manage.py db init 
(venv)$ python3 manage.py db migrate 
(venv)$ python3 manage.py db upgrade 
  • 1.
  • 2.
  • 3.

退出虚拟环境

(venv)$ deactivate 
  • 1.

2.配置uwsgi

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

$ cd /path/to/your/project 
  • 1.

新建uwsgi.py

$ vi uwsgi.py 
  • 1.

导入创建应用的工厂函数

from webapp import create_app 
app = create_app("production)" 
  • 1.
  • 2.

新建uwsgi.ini

$ vi uwsgi.ini 
  • 1.

输入以下内容:

[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 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

上面的配置文件中的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 
  • 1.

填入如下内容:

[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 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

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

$ sudo systemctl start uwsgi 
$ systemctl status uwsgi 
$ sudo systemctl enable uwsgi 
$ sudo systemctl stop uwsgi 
  • 1.
  • 2.
  • 3.
  • 4.

3.配置nginx

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

$ sudo vi /etc/nginx/nginx.conf 
  • 1.

我们只需要修改相应部分就可以了,关于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/; 
 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

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

$ cd /home/user/myapp/static
$ chown -R user:nginx static 
$ chmod -R 660 static 
  • 1.
  • 2.
  • 3.

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

$ sudo mkdir /etc/systemd/system/nginx.service.d  
$ cd /etc/systemd/system/nginx.service.d 
$ sudo vi override.conf 
  • 1.
  • 2.
  • 3.

填入如下内容:

[Service]  
ExecStartPost=/bin/sleep 0.1 
  • 1.
  • 2.

保存退出!

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

测试nginx

$ sudo nginx -t 
  • 1.

启动nginx

$ sudo systemctl start nginx 
  • 1.

设置开机启动

$ sudo systemctl enable nginx 
  • 1.

 

责任编辑:武晓燕 来源: 程序猿与吉他狗
相关推荐

2022-06-06 15:49:24

容器无服务器docker

2018-08-31 09:51:37

2012-02-09 09:52:39

服务器节能

2017-11-08 11:13:14

大数据Spark数据倾斜

2010-09-27 14:25:39

DHCP服务器

2017-03-31 10:27:08

推送服务移动

2012-09-19 10:46:13

服务器IBM大数据

2015-07-23 13:10:38

服务器虚拟化

2017-11-20 09:00:34

Linux服务器时间同步

2009-09-17 11:59:29

WSUS服务器

2009-02-10 17:28:00

服务器租用服务器托管服务器

2009-04-01 13:11:01

Nehalem四核Intel

2018-02-07 10:08:02

应用服务器网络数据库

2009-01-16 18:26:40

服务器虚拟化VMware

2009-09-16 17:02:40

WSUS服务器

2023-07-27 07:19:24

2013-12-30 11:09:16

服务器HPC去IOE

2018-07-12 15:52:25

数字化CIO误区

2015-10-26 14:29:54

服务器开发应届生

2019-04-26 10:57:26

无服务器应用程序HTTP
点赞
收藏

51CTO技术栈公众号