当前位置: 首页 > 科技观察

带你走过部署服务器的坑?

时间:2023-03-17 11:16:28 科技观察

在开发环境完成Flask项目的开发后,需要将项目部署到服务器上。Werkzeug提供的开发服务器在开发过程中不能应用到实际项目中。在生产环境中,必须使用专门的服务器程序。web服务器程序有很多,本文服务器操作系统为Centos7,网站服务器使用uwsgi和nginx(反向代理),数据库为开发时使用的mysql8。一、基础环境关于uwsgi和nginx的相关知识,另写一篇介绍。这是部署Pythonweb项目的主流方式。性能和稳定性都很好,部署也很简单。现在很多小项目都使用云服务器,成本更低,操作更方便。用户只需要填写相应的选项就可以得到一台服务器,省去了安装和配置操作系统的复杂操作。拿到云服务商给我们的服务器后,我们就可以通过ssh远程登录进行操作了。完成基本环境的配置需要做如下操作:(下面命令前的#代表root用户登录,$代表普通用户)1.修改root密码这是Linux系统中最高权限的帐号系统,因此更改其密码的第一件事非常重要。#passwdroot然后输入足够复杂的密码(大写字母+小写字母+符号>8位数字)2.创建用户root帐号的权限过高。为了安全,部署服务器必须新建一个账号#adduserdeploy#passwddeploy,并输入足够复杂的密码密码(大写字母+小写字母+符号>=8位),但有时需要管理员权限,所以需要加上到sudoers,这样你就可以临时使用sudo命令来提升权限。#vi/etc/sudoers新增一行deployALL=(ALL)ALL3.安装基础软件,安装pip需要的openssl。$sudoyum-yinstallopenssl-devel安装EPEL扩展仓库。后面安装nginx的时候需要$sudoyum-yinstallel-release来安装wget。后面安装Python和MySQL时,需要$sudoyum-yinstallwget来安装zlib。稍后安装Python时,需要$sudoyum-yinstallzlib*4。配置防火墙配置。很多新手发现配置完成后还是无法访问,这是因为被防火墙挡住了。$sudofirewall-cmd--permanent--zone=public--add-service=http$sudofirewall-cmd--permanent--zone=public--add-service=https$sudofirewall-cmd--reload关闭SELinux,这是还有一个大坑,会导致nginx无法读取uwsgi创建的sock,即使对应用户配置了$sudovi/etc/selinux/configSELINUX=disabled然后重启服务器$sudoinit6服务器的基本配置做完了。2、安装PythonPython因为2和3的不兼容导致了很多问题,除了一些遗留系统,现在新开发的程序都使用Python3。Centos7自带Python2.7,所以需要自己安装Python3。本文以Python3.6.3为例:1.创建安装目录。Python的安装目录和库依赖也是一个陷阱。我们将Python3安装在一个目录中。如果您以后要卸载它,只需将其删除即可。$sudomkdir/usr/local/python3$cd/usr/local/python32.下载并解压。使用之前安装的wget下载Python源码包$sudowgethttps://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz使用tar命令解压包。该命令使用频率很高。您可以搜索具体的参数用法。$sudotar-xvfPython-3.6.3.tgz3。配置编译安装$cdPython-3.6.3/其中prefix是指定python的安装目录,--with-ssl是指定使用openssl,之前已经安装过openssl,如果不指定,会导致pip无法使用。$sudo./configure--prefix=/usr/local/python3--with-ssl$sudomake$sudomakeinstall4。链接可以看作是windows中的快捷方式。我们在linux中输入的命令来自于/usr/bin和/usr/sbin,如果我们的程序安装后仍然出现commandnotfound,我们就需要对/usr/bin做一个链接。$cd/usr/bin$sudoln-s/usr/local/python3/bin/python3/usr/bin/python3$sudoln-s/usr/local/python3/bin/pip3/usr/bin/pip35.支持安装通常pip的版本不够新,需要升级。可以使用以下两种方法:$sudopipinstall--upgradepip$sudopython3-mpipinstall--upgradepipvirtualenv是神器,用来隔离各种Python运行环境,避免差异。项目依赖的库版本不同导致的冲突。为什么$sudoyuinstallpython-virtualenv不用pip安装?因为在Centos中会作为一个模块安装,所以不能全局调用。简单的处理方法就是用yum安装,下面的uwsgi也是一样的。$sudoyuminstallluwsgiinstallnginx$sudoyuminstallnginx3、安装配置mysql8在Centos中直接用yum安装mysql会安装mariadb。对于数据库,我们需要精确的版本控制,所以我们需要其他的安装方式。1、安装mysql$cd~获取mysql仓库文件并安装$wgethttp://repo.mysql.com/mysql80-community-release-el7-1.noarch.rpm安装仓库$sudorpm-ivhmysql80-community-release-el7-1.noarch.rpmaddmysqltorepolist$sudoyumrepolisenabled|grep"mysql.*-community.*"查看列表状态,查看要安装的版本是否启用。$sudoyumrepolisall|grepmysql安装mysql$sudoyuminstallmysql-community-server2。启动mysql,在centos中使用systemctl命令控制服务的启动、重启、停止、设置开机启动和查看状态,后面我们会写一个服务从startuwsgistart$sudosystemctlstartmysqld。servicestop$sudosystemctlstopmysqld.servicerestart$sudosystemctlrestartmysqld.service查看状态$sudosystemctlstatusmysqld.servicesetbootstart$sudosystemctlenablemysqld.servicecancelbootstart$sudosystemctldisablemysqld.service3.mysql我们在安装过程中没有设置账号密码,但是mysql有一个defaultroot账户,在安装的时候为它设置了一个临时密码,我们首先要做的就是查看这个密码登录root账户并修改密码。查看root账户临时密码$sudogrep'temporarypassword'/var/log/mysqld.log登录root账户修改密码$mysql-uroot–p输入临时密码进入mysql操作界面>ALTERUSER'root'@'localhost'IDENTIFIEDBY'你的密码';和linux一样,我们也不能使用root账号操作数据库,需要新建一个账号连接对应的数据库。新用户>ALTERUSER'root'@'localhost'IDENTIFIEDBY'yourpassword';新建数据库>createdatebasewebappcharset=utf8mb4collat??e=utf8mb4_unicode_ci;数据库授权>grantallprivilegeson*.*to'flask'@'lcoalhost'withgrantoption;四、配置服务器现在一切就绪,我们只需要进行相应的配置就可以完成服务器的设置了。1、配置python虚拟环境并安装依赖首先将我们开发好的程序传输到服务器上,在开发电脑上使用scp命令:$scp–rlocal_folderuser@server_ip:/home/user/myapp输入密码服务器的user用户然后新建一个虚拟环境$cd/home/user/myapp$virtualenvvenv--python=python3进入虚拟环境$sourcevenv/bin/activate安装依赖requirements.txt是使用pipfreeze>requirements生成.txt开发完成后。(venv)$pipinstall-ihttps://pypi.douban.com/simple-rrequirements.txt-i参数是使用豆瓣源,速度快,-r表示一一安装requirements.txt。导入数据库表(venv)$python3manage.pydbinit(venv)$python3manage.pydbmigrate(venv)$python3manage.pydbupgrade退出虚拟环境(venv)$deactivate2。配置uwsgi在项目文件夹中新建一个uwsgi.py文件和uwsgi。ini文件,填写配置$cd/path/to/your/projectCreateanewuwsgi.py$viuwsgi.py从webapp导入创建应用的工厂函数importcreate_appapp=create_app("production)"Createanewuwsgi.ini$viuwsgi.ini输入以下内容:[uwsgi]module=uwsgi:appmaster=trueprocesses=5uid=usersocket=/run/uwsgi/myapp.sockchown-socket=user:nginxchmod-socket=660vacuum=truedie-on-term=true的上面配置文件中的user是你新建的linux用户名,第一句是告诉uwsgi我们的application是uwsgi文件中的app,master和processes是服务器是否启用主进程和进程数,uid是启动uwsgi的用户,scoket是指uwsgi生成的sock放在哪里,chown-socket是修改sock的owner,让nginx和uwsgi同时访问,chmod-socket是修改sock的权限,vacuum就是在程序退出的时候移除sock,因为后面我们会用systemd来控制uwsgi,因为控制信号有差异,所以使用die-on-term参数。使用systemd控制uwsgi新建uwsgi服务$sudovi/etc/systemd/system/uwsgi.service填写以下内容:[Unit]Description=uWSGIinstancetoservemyapp[Service]ExecStartPre=-/usr/bin/bash-c'mkdir-p/run/uwsgi;chownuser:nginx/run/uwsgi'ExecStart=/usr/bin/bash-c'cd/home/user/myapp;sourcemyappenv/bin/activate;uwsgi--inimyapp.ini'[安装]WantedBy=multi-user.target这样就完成了uwsgi的配置,我们可以像控制mysql一样控制uwsgi。$sudosystemctlstartuwsgi$systemctlstatusuwsgi$sudosystemctlenableuwsgi$sudosystemctlstopuwsgi3。配置nginxnginx的配置文件位于/etc/nginx/nginx.conf$sudovi/etc/nginx/nginx.conf我们只需要修改对应??的部分即可。更多关于nginx的细节会单独写。server{listen80;server_nameserver_domain_or_IP;location/{includeuwsgi_params;uwsgi_passunix:/run/uwsgi/myapp.sock;}location/static/{alias/home/user/myapp/static/;}这里我们添加了location/static/,它就是让jscss的静态文件直接被nginx接管,所以需要修改这些静态文件的访问权限。$cd/home/user/myapp/static/$chown-Ruser:nginxstatic$chmod-R660static***还有一个小坑,nginx开始加载的时候会报错。$sudomkdir/etc/systemd/system/nginx.service.d$cd/etc/systemd/system/nginx.service.d$sudovioverride.conf填写如下:[Service]ExecStartPost=/bin/sleep0.1保存并出口!现在配置完成,启动服务看看效果吧!测试nginx$sudonginx-t启动nginx$sudosystemctl启动nginx设置启动启动$sudosystemctlenablenginx