您的位置:首页 > 运维架构 > Nginx

Linux入门笔记7. ubuntu上部署Nginx+uWSGI+Django

2017-08-03 11:02 661 查看

Linux入门笔记7. ubuntu上部署Nginx+uWSGI+Django

我们的目标就是实现这样的架构

Nginx对外提供端口8080,用户发出的请求必须通过8080端口提交给Nginx。随后Nginx将用户请求通过端口8000转交给uWSGI。再此过程中,Nginx充当一个反向代理的角色。



Nginx作为反向代理,对用户屏蔽了服务器的细节。所有用户发送的请求都会经过Nginx处理,再发送给目标服务器。因为对于用户而言,他无需知道是哪台服务器响应了他的请求,只需要知道自己的请求被处理了即可。使用Nginx做反向代理的好处在于:

1、安全,由于外部请求必须经由Nginx,避免了恶意程序直接攻击服务器

2、负载均衡,Nginx能够根据负载情况,将请求分配给不同的服务器,保证服务器的性能,常见的负载策略有:轮询、加权轮询、Ip hash等。详情请见Nginx配置详解

3、提高IO性能,一些静态文件的读取,可直接通过Nginx进行处理

1、安装Nginx

(1) 在ubuntu 下使用命令安装Nginx

apt-get install nginx


* nginx的启动、停止、重启*

root@ubuntu:/# /etc/init.d/nginx start
root@ubuntu:/# /etc/init.d/nginx stop
root@ubuntu:/# /etc/init.d/nginx restart


或者使用service

root@ubuntu:/# sudo service nginx start
root@ubuntu:/# sudo service nginx stop
root@ubuntu:/# sudo service nginx restart


(2) 接下来修改Nginx的配置文件。在我的服务器上,Nginx配置文件在/etc/nginx/nginx.conf中,同时在配置文件中,引用了其他目录的文件,结构如下图所示:



首先看etc/nginx/nginx.conf文件,使用vim打开文件,命令如下:

root@ubuntu:/# vim /etc/nginx/nginx.conf


/etc/nginx/nginx.conf 文件内容如下(省略被注释的部分):

user www-data;
worker_processes 4;
pid /run/nginx.pid;

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;

##
# Logging Settings
##

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

##
# Gzip Settings ----------------------在此可以配置图片压缩
##

gzip on;
gzip_disable "msie6";
gzip_min_length 1k;

gzip_vary off;
# 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/x-javascript text/xml application/xml application/xml+rss text/javascript image/jpeg;

##
# Virtual Host Configs
##

###################################################
# -----------------注意下面这两行代码,引用了其他目录下的文件,
# 很多发行版为了方便管理,在nginx.conf底部加了一条include /etc/nginx/sites-enabled/*.conf
# /etc/nginx/conf.d/*.conf ,在我的服务器上,这个目录下为空
# /etc/nginx/sites-enabled/* 在我的服务器上,这个目录下有一个文件:default
###################################################
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}


/etc/nginx/sites-enabled/default 文件的内容如下(省略被注释的部分):

server {
listen 8080 default_server;  # -----------------------------监听8080端口
listen [::]:8080 default_server ipv6only=on;

#root /usr/share/nginx/html;
#index index.html index.htm;

# Make site accessible from http://localhost/ server_name 127.0.0.1; # ----------------------------------服务器的IP地址
charset utf-8;

# Django mdedia
location /media {
alias /home/workspace/GWS/media;
}

location /static {
alias /home/workspace/GWS/static; # ----------------django静态文件的位置
}

location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000; # ---------------------------配置uWSGI的端口
}
}


修改完Nginx的配置文件后,使用下面的命令检查配置文件是否有错误,出现以下提示说明配置文件没有问题

nginx -t




注:

在我的服务器上, 还存在一个目录/etc/nginx/sites-available,它和sites-enabled的区别在于:

available保存所有的配置,包括不启用的站点,启用时需要将.conf软连接到enabled(使用命令ln)。而enabled只保存启用的站点的配置。简单点讲:enabled可以看做available的一个子集, available同时包括enabled中启用的站点的配置和不启用的配置。

2、安装uWSGI

使用pip 安装uwsgi

pip install uwsgi


测试uwsgi安装是否成功,我们新建一个test.py文件,内容如下:

# 接收任意请求,并返回一个字符串"Hello world"
def application(env, start_response):
start_response('200 OK', [('Content-Type', 'test/html')])
return [b"Hello world"]


使用下面的命令运行该文件,然后访问127.0.0.1:8001。按照网上的资料,在浏览器上我们能看到Hello World。但是在我的实际测试中,访问127.0.0.1:8001会下载一个文件,文件内容正是Hello World。此处求大神指导。

uwsgi --http :8001 --wsgi-file test.py


————————————–以下是引用——————————————–

常用选项:

http : 协议类型和端口号

processes : 开启的进程数量

workers : 开启的进程数量,等同于processes(官网的说法是spawn the specified number ofworkers / processes)

chdir : 指定运行目录(chdir to specified directory before apps loading)

wsgi-file : 载入wsgi-file(load .wsgi file)

stats : 在指定的地址上,开启状态服务(enable the stats server on the specified address)

threads : 运行线程。由于GIL的存在,我觉得这个真心没啥用。(run each worker in prethreaded mode with the specified number of threads)

master : 允许主进程存在(enable master process)

daemonize : 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器(daemonize uWSGI)。实际上最常用的,还是把运行记录输出到一个本地文件上。

pidfile : 指定pid文件的位置,记录主进程的pid号。

vacuum : 当服务器退出的时候自动清理环境,删除unix socket文件和pid文件(try to remove all of the generated file/sockets)

此处参考:

http://www.cnblogs.com/fnng/p/5268633.html

http://www.jianshu.com/p/e6ff4a28ab5a

————————————–引用结束———————————————-

3、部署Django

首先来看一下Django项目的最终的结构:



GWS子目录下wsgi.py 是自动生成的,我们只需要新建一个GWS_uwsgi.ini配置文件就好。

touch GWS_uwsgi.ini


GWS_uwsgi.ini文件的内容如下:

# GWS_uwsgi.ini file
[uwsgi]

# Django-related settings

socket = :8000 # ------------------------指定8000端口

# the base directory (full path)
chdir = /home/workspace/GWS # ------------项目的目录

# Django s wsgi file
module = GWS.wsgi # ---------GWS子目录下wsgi.py 是自动生成的

# process-related settings
# master
master = true

# maximum number of worker processes
processes = 4

# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum  =  true


 这个配置,其实就相当于在上一小节中通过wsgi命令,后面跟一堆参数的方式,给文件化了。(参考自http://www.cnblogs.com/fnng/p/5268633.html

  接下来,切换到GWS项目目录下,通过uwsgi命令读取GWS_uwsgi.ini文件启动项目。

uwsgi --ini myweb_uwsgi.ini




由于我之前已经启动项目了,所以提示 (:8000)端口被占用

最后,重启Nginx,访问127.0.0.1:8080,看看效果吧。(注意URL栏,访问的是我们的8080端口~)



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: