ubuntu+nginx+uwsgi部署django项目,实现反向代理+负载均衡

windows远程连接Ubuntu

常用软件:secureCRT,ssh,crf,xshell等。
其中文件操作功能基本都需要root账户才能有上传权限。但是root账户默认不能远程登录,所以需要以下配置:

为root设置密码:

sudo passwd root
根据提示输入密码

修改ssh功能配置文件:

$ sudo vi /etc/ssh/sshd_config

#找到PermitRootLogin no一行,改为PermitRootLogin yes


重启 ssh 服务

service sshd restart

接下来远程登录root账户,开始安装依赖包

python安装

一般linux服务器目前都安装python2.x版本,最新的都会装3.x的。可以查看系统中是否安装了python
#输入python即可查看相关信息

python2 --version #查看python2的版本信息
pyton3 --version #查看python3的版本信息

#如需要安装,输入

sudo apt-get install python3.x   #安装python

Python3和Python2是互相不兼容,但也不能卸载python2,可以将Python指向Python3,这样就可以默认使用python3了。默认指向python2。

指向python3的命令

echo alias python=python3 >> ~/.bashrc
source ~/.bashrc  

安装pip3

linux中的pip默认是装的python2.x版本,
需要安装python3版本的pip:

apt install python3-pip   #主目录下,这可以可以全局使用pip3

安装包的时候根据提示升级了pip,再次使用pip 安装相关的python包的时候就出现以下错误再来直接使用就会报错:

ImportError: cannot import name main

解决方法:vim /usr/bin/pip3

from pip import main
if __name__ == '__main__':
    sys.exit(main())

换成下面即可:
from pip import __main__
if __name__ == '__main__':
    sys.exit(__main__._main())

安装虚拟环境

  • 我们可以为自己的项目搭建虚拟且独立的python运行环境, 使得单个项目的运行环境与其它项目独立起来,不与其他产生冲突,即安装在虚拟环境里的所有包,均不会对环境外的其他包产生影响,反之,在虚拟环境下运行时只能调用虚拟环境中安装的包,不会调用外部的包。相当于局部和全局之分;
  • 鉴于virtualenv不便于对虚拟环境集中管理,所以推荐直接使用virtualenvwrapper。 virtualenvwrapper提供了一系列命令使得和虚拟环境工作变得便利。
sudo  pip3 install virtualenv
sudo  pip3 install virtualenvwrapper

我们只需要使用到virtualenvwrapper提供的命令来操作virtualenv,使用之前,需要对其配置:

进入当前用户根目录编辑打开配置文件

cd ~ 
sudo  vim .bashrc 

把以下三行赋值到配置文件中,

export WORKON_HOME=$HOME/.virtualenvs 
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh

随后执行以下命令令修改立即生效

source ~/.bashrc

虚拟环境的操作

其实,我们可以不使用虚拟环境,那么运行pip命令所有的包将直接安装在系统中,如果服务器上打算只运行单个项目可以跳过虚拟环境的操作。如果将来有可能会有多个项目,需要运行在不同的环境内,我们可以通过为每个应用创建虚拟环境来实现。

#新建虚拟环境,通过"-p"指定python解释器的版本
#blogenv是自定义的虚拟环境名
mkvirtualenv -p /usr/bin/python3 blogenv

创建完虚拟环境,我们需要进入虚拟环境,

workon blogenv

进入以后,接下来的pip下载的包将保存在当前虚拟环境下,与其他虚拟环境不共享。
如果想要退出虚拟环境,执行以下命令

deactivate

删除虚拟环境的命令

rmvirtualenv blogenv

服务器上下载所需要的模块

我们最终需要在服务器上运行我们的django项目,项目中使用到大量的第三方库,如果挨个进行下载过于笨拙,我们可以批量执行。

导出文件.

在开发者的代码所在的pycharm中下收集并生成当前项目的第三方库。

# 在以前项目环境里导出环境
pip freeze > requirements.txt    #生成plist.txt

将文件上传到服务器某个目录

可以通过命令,或者xftp等ssh类型的客户端,也可以使用svn,git等将生成的环境文件上传到服务器。我这里使用的secureCRT客户端软件把plist.txt上传至服务器的src目录

执行环境文件

服务器中cd到环境文件上传到的目录下执行以下代码:

pip install -r plist.txt 

注意:如果这里报错,请先完成下面的mysql的安装之后再回来重新执行这个命令

mysql

安装 Mysql :

sudo apt-get install mysql-server
apt install libmysqlclient-dev

安装成功后可以通过下面的命令测试是否安装成功

netstat -tap | grep mysql

mysql允许远程访问

1设置mysql允许远程访问,首先编辑mysql配置文件。

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

注释掉bind-address = 127.0.0.1: #允许远程连接

2在阿里云服务器的安全组设置中开放3306端口

3修改root密码
如果使用root进行远程连接,需要重新修改root的远程权限和密码。

#进入mysql后执行
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;

4 service mysql restart重启生效

5 mysql配置成功之后,要在mysql中新建数据库,命令是:

create database FruitDay default charset utf8 collate utf8_general_ci;

注意:也可以在Navicat中远程连接服务器上的mysql,再新建mysql数据库,要注意指定库的编码为utf-8,这样可以避免中文乱码问题。

Django项目普通部署

将我们编写好的整个项目的上传到服务器的某个路径下(我选择的目录/src/www),这个目录以后会使用到。
代码上传之前我们最好提前修改好settings.py文件:

  • 数据库相关配置,保证密码正确,保证数据库在mysql中已经存在
  • ALLOWED_HOSTS = ["*"]或者ALLOWED_HOSTS = [“公网ip”]

服务器中cd到保存的项目,与manage.py文件同级执行:

#在服务器上生成表和管理员账号
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
#在服务器上执行,启动服务器,并绑定到8000端口
python manage.py runserver 0:8000   #0是0.0.0.0的缩写

端口可以自定义,注意不要与其他冲突,并且注意云服务器是否有安全组的考虑而关闭了端口的访问。

接下来客户端就可以通过浏览器打开"公网ip:8000"来在线访问我们的项目

uwsgi

按照以上的配置虽然我们已经可以将项目部署到公网上,但是刚才是使用django内置的一个小型服务器,这个服务器的性能只能用于测试,实际开发我们并不会这样使用,而是使用uwsgi。

WSGI和uWSGI:

  • WSGI
    Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述web server如何与web application通信的规范。
  • uWSGI:是一个web服务器,实现了WSGI协议、uwsgi协议、http协议等。

在服务器上安装需要依赖的包

apt install python3-dev 
apt install gcc
安装uwsgi
pip3 install uwsgi         #在虚拟环境里面,具体看实际

退出刚才内置服务器的django项目,然后使用uWSGI运行我们的项目:

#进入cd django项目中

uwsgi --http  :8000 --module  项目.wsgi 
#举例 uwsgi --http  :8000 --module  bookshop.wsgi 
这里应该可以再向下深入一层,直接运行wsgi

Nginx

我们使用uwsgi已经算得上是一个性能比较不错的服务器了,可以运行django项目,处理用户请求了。但是在用户量很大的场景下还不够,我们需要配置Nginx+uwsgi。

主要使用到Nginx的功能:

  • 反向代理
  • 负载均衡

安装nginx(在虚拟环境外执行)

apt install nginx  

启动nginx

  /etc/init.d/nginx start(stop、restart)  

测试nginx,

在客户端浏览器输入启动Nginx的公网ip地址,显示nginx的首页说明测试成功。

nginx + uwsgi + django

原理图:
ubuntu+nginx+uwsgi部署django项目,实现反向代理+负载均衡_第1张图片

接下来我们会操作一些配置文件用于他们三个之间配合工作:

  • 新建uwsgi.ini文件,用于配置uwsgi,可以放在任意自己习惯操作的位置
  • nginx.conf,默认路径在/etc/nginx/nginx.conf,用于nginx的配置
  • 可选的uwsgi_params文件,一般可以省略。

uwsgi.ini模板

[uwsgi]
#使用nginx连接时:socket=127.0.0.1:端口,端口自定义  #这里不要填写公网ip
#单独使用uwsgi时为:  http=内网ip:端口,端口自定义
socket=xxx.xxx.xxx.xxx:12000   #单独启用uwsgi时这里一定用内网ip
#需要部署的项目的路径
chdir=/opt/src/www/bookshop
#需要部署的项目的wsgi文件
wsgi-file=bookshop/wsgi.py
#最大数量的工作进程数
processes=4
#最大数量的工作线程数量
threads=2
master=True
pidfile=uwsgi.pid
#生成的日志保存文件
daemonize=uwsgi.log
#指定使用的虚拟路径
home=/root/.virtualenvs/blogenv   #这里一定要精确到虚拟环境的名称

启动uwsgi服务:
进入uwsgi.ini目录下执行

# 最后的文件也可以是绝对路径

uwsgi --ini uwsgi.ini  #这是通过配置文件启动uwsgi的方式,好处在于服务器在后台运行,不影响我们的其他操作

关闭uwsgi服务:

sudo pkill -f uwsgi -9

nginx文件配置模板:
主要学些重要配置部分

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
	worker_connections 768;
	# multi_accept on;
}

http {

	##
	# Basic Settings
	##

	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 65;
	types_hash_max_size 2048;
	# server_tokens off;

	# server_names_hash_bucket_size 64;
	# server_name_in_redirect off;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	##
	# SSL Settings
	##

	ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
	ssl_prefer_server_ciphers on;

	##
	# Logging Settings
	##

	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;

	##
	# Gzip Settings
	##

	gzip on;

	# gzip_vary on;
	# gzip_proxied any;
	# gzip_comp_level 6;
	# gzip_buffers 16 8k;
	# gzip_http_version 1.1;
	# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

	##
	# Virtual Host Configs
	##

	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;

####################重要配置区域########################

	#配置文件内容:
# 转发给哪个服务器,可以通过upstream配置项让nginx实现负载均衡
upstream django {    
    server   127.0.0.1:12000; 
    #这里可以有多个server,那么就可以实现使用多个server之间默认轮询的方式处理请求
    
}

# 设定虚拟主机配置,一个http中可以有多个server。
server {
    # 启动的nginx的端口
    listen      80;
    server_name  111.231.239.236;
    charset     utf-8;

    # max upload size  
    client_max_body_size 75M;    # adjust to taste

    # location 配置请求静态文件多媒体文件。
    location /media  {
        alias  /opt/src/www/bookshop/media/;  
    }
    # 静态文件访问的url
    location /static {
        # 指定静态文件存放的目录
        alias /opt/src/www/bookshop/static/;
    }

#  将所有非媒体请求转到Django服务器上
    location / {
        # 包含uwsgi的请求参数,路径为qmblog_uwsgi_params绝对路径
        include  uwsgi_params; 
        # 转交请求给uwsgi
        # uwsgi_pass  127.0.0.1:8000; 
        uwsgi_pass  django;  #这个django对应开头出的,对于动态请求,转发到本机的端口,也就是uwsgi监听的端口,uwsgi运行的主机和ip,后面我们会在本机的该端口上运行uwsgi进程
       
    }
  
}
############################################
}


#mail {
#	# See sample authentication script at:
#	# http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
# 
#	# auth_http localhost/auth.php;
#	# pop3_capabilities "TOP" "USER";
#	# imap_capabilities "IMAP4rev1" "UIDPLUS";
# 
#	server {
#		listen     localhost:110;
#		protocol   pop3;
#		proxy      on;
#	}
# 
#	server {
#		listen     localhost:143;
#		protocol   imap;
#		proxy      on;
#	}
#}

uginx先启动。随后启动nginx。

 uwsgi --ini uwsgi.ini  #启动uwsgi
 sudo pkill -f uwsgi -9  #关闭uwsgi
 /etc/init.d/nginx start  #还有(restart、stop)命令    

测试:
客户端访问:

http://公网ip:nginx端口(不填端口或者80)/资源名称

可以实现请求先到达nginx,然后将请求分发给某个uwsgi服务器,uwsgi调用视图。

你可能感兴趣的:(技术)