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端口~)