部署uwsgi+nginx+django遇到的坑

Django Nginx+uwsgi 安装配置

在前面的章节中我们使用 python manage.py runserver 来运行服务器。这只适用测试环境中使用。

正式发布的服务,我们需要一个可以稳定而持续的服务器,比如apache, Nginx, lighttpd等,本文将以 Nginx 为例。


安装基础开发包

Centos 下安装步骤如下:

yum groupinstall "Development tools"
yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel

安装 Django

pip3 install django==2.1.4

测试 django 是否正常,运行:

django-admin.py startproject demosite
cd demosite
python3 manage.py runserver 0.0.0.0:8002

在浏览器内输入:http://127.0.0.1:8002,检查django是否运行正常。


 

Nginx 安装

系统平台:CentOS release 6.6 (Final) 64位。

一、安装编译工具及库文件

yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel

二、首先要安装 PCRE

PCRE 作用是让 Nginx 支持 Rewrite 功能。

1、先cd到/usr/local/src下面,再下载 PCRE 安装包,下载地址: http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz

 

wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz

 

2、解压安装包:

[root@bogon src]# tar zxvf pcre-8.35.tar.gz

3、进入安装包目录

[root@bogon src]# cd pcre-8.35

4、编译安装 

[root@bogon pcre-8.35]# ./configure
[root@bogon pcre-8.35]# make && make install

5、查看pcre版本

[root@bogon pcre-8.35]# pcre-config --version

安装 Nginx

注意:这里的目录一定要cd到/usr/local/src/下再下载!!!

1、下载 Nginx,下载地址:http://nginx.org/download/nginx-1.6.2.tar.gz

[root@bogon src]# wget http://nginx.org/download/nginx-1.6.2.tar.gz

2、解压安装包

[root@bogon src]# tar zxvf nginx-1.6.2.tar.gz

3、进入安装包目录

[root@bogon src]# cd nginx-1.6.2

4、编译安装

./configure --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.35
make
make install

5、查看nginx版本

/usr/local/webserver/nginx/sbin/nginx -v

到此,nginx安装完成。


Nginx 配置

创建 Nginx 运行使用的用户 www:

[root@bogon conf]# /usr/sbin/groupadd www 
[root@bogon conf]# /usr/sbin/useradd -g www www

配置nginx.conf ,将/usr/local/webserver/nginx/conf/nginx.conf替换为以下内容

 

[root@bogon conf]#  cat /usr/local/webserver/nginx/conf/nginx.conf

user www www;
worker_processes 2; #设置值和CPU核心数一致
error_log /usr/local/webserver/nginx/logs/nginx_error.log crit; #日志位置和日志级别
pid /usr/local/webserver/nginx/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535;
events
{
  use epoll;
  worker_connections 65535;
}
http
{
  include mime.types;
  default_type application/octet-stream;
  log_format main  '$remote_addr - $remote_user [$time_local] "$request" '
               '$status $body_bytes_sent "$http_referer" '
               '"$http_user_agent" $http_x_forwarded_for';
  
#charset gb2312;
     
  server_names_hash_bucket_size 128;
  client_header_buffer_size 32k;
  large_client_header_buffers 4 32k;
  client_max_body_size 8m;
     
  sendfile on;
  tcp_nopush on;
  keepalive_timeout 60;
  tcp_nodelay on;
  fastcgi_connect_timeout 300;
  fastcgi_send_timeout 300;
  fastcgi_read_timeout 300;
  fastcgi_buffer_size 64k;
  fastcgi_buffers 4 64k;
  fastcgi_busy_buffers_size 128k;
  fastcgi_temp_file_write_size 128k;
  gzip on; 
  gzip_min_length 1k;
  gzip_buffers 4 16k;
  gzip_http_version 1.0;
  gzip_comp_level 2;
  gzip_types text/plain application/x-javascript text/css application/xml;
  gzip_vary on;
 
  #limit_zone crawler $binary_remote_addr 10m;
 #下面是server虚拟主机的配置
 server
  {
    listen 80;#监听端口
    server_name localhost;#域名
    index index.html index.htm index.php;
    root /usr/local/webserver/nginx/html;#站点目录
      location ~ .*\.(php|php5)?$
    {
      #fastcgi_pass unix:/tmp/php-cgi.sock;
      fastcgi_pass 127.0.0.1:9000;
      fastcgi_index index.php;
      include fastcgi.conf;
    }
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$
    {
      expires 30d;
  # access_log off;
    }
    location ~ .*\.(js|css)?$
    {
      expires 15d;
   # access_log off;
    }
    access_log off;
  }

}

后面这一块server完全替换!!

检查配置文件nginx.conf的正确性命令:

[root@bogon conf]# /usr/local/webserver/nginx/sbin/nginx -t

启动 Nginx

Nginx 启动命令如下:

[root@bogon conf]# /usr/local/webserver/nginx/sbin/nginx

访问站点

从浏览器访问我们配置的站点ip:

部署uwsgi+nginx+django遇到的坑_第1张图片


Nginx 其他命令

以下包含了 Nginx 常用的几个命令:

/usr/local/webserver/nginx/sbin/nginx -s reload            # 重新载入配置文件
/usr/local/webserver/nginx/sbin/nginx -s reopen            # 重启 Nginx
/usr/local/webserver/nginx/sbin/nginx -s stop              # 停止 Nginx

 


uwsgi 配置

uwsgi支持ini、xml等多种配置方式,本文以 ini 为例, 在/etc/目录下新建uwsgi8001.ini,添加如下配置:

[uwsgi]
#pythonpath = /usr/local/lib/python2.7/site-packages //因为python重新安装过的,所以目录要指定到这个
pythonpath = /usr/local/lib/python3.6/site-packages
socket = 127.0.0.1:8001
master = true         //主进程
vhost = true          //多站模式
no-site = true        //多站模式时不设置入口模块和文件
workers = 2           //子进程数
reload-mercy = 10     
vacuum = true         //退出、重启时清理文件
max-requests = 1000   
limit-as = 512
buffer-size = 30000
pidfile = /var/run/uwsgi8001.pid    //pid文件,用于下面的脚本启动、停止该进程
daemonize = /website/uwsgi8001.log//因为python重新安装过的,所以目录要指定到这个

另外要新建一个/website目录,否则也会报错!!


Nginx 配置

找到nginx的安装目录(如:/usr/local/nginx/),打开conf/nginx.conf文件,修改server配置:

server {
        listen       80;
        server_name  localhost;
        
        location / {            
            include  uwsgi_params;
            uwsgi_pass  127.0.0.1:9090;              //必须和uwsgi中的设置一致
            uwsgi_param UWSGI_SCRIPT demosite.wsgi;  //入口文件,即wsgi.py相对于项目根目录的位置,“.”相当于一层目录
            uwsgi_param UWSGI_CHDIR /root/Penn/demosite/;       //项目根目录!!!
            index  index.html index.htm;
            client_max_body_size 35m;
        }
    }

你可以阅读 Nginx 安装配置 了解更多内容。

设置完成后,在终端运行:

uwsgi --ini /etc/uwsgi8001.ini &
/usr/local/webserver/nginx/sbin/nginx
 

在浏览器输入:http://网址(如果要用域名,则要在settings.py中配置允许域名列表),你就可以看到 django 的 "It work" 了。

 

原来以为这样就好了,其实还有一个坑,静态资源没有配置,导致admin界面进去之后都是丢失了css样式的

解决步骤:

在/website目录下新建目录static

修改项目目录下settings.py,增加下面这行:

STATIC_ROOT = '/website/static/'

再在nginx里给这个目录取一个别名

 

location /static {
    alias /website/static/;
}

意思就是外部访问我的 域名/static  时候就可以访问到/website/static这个目录

再在项目目录下,使用python manage.py collectstatic,将项目需要的静态资源搜集到指定的STATIC_ROOT对应的目录下。也即是这个nginx刚刚取了别名的目录/website/static/。

杀掉进程里的uwsgi和nginx,重新启动

才成功!

还有一个坑,图片的上传

需要在admin的models下有个能上传图片的表,在models.py中定义表结构如下

class Shop(models.Model):
    name = models.CharField(max_length=200)
    lat = models.FloatField(default=0)
    lng = models.FloatField(default=0)
    addr = models.CharField(max_length=500)
    phone = models.CharField(max_length=20)
    imgUrl = models.ImageField(u'图片',upload_to='uploadImages')
    status = models.IntegerField(default=0)
    notes = models.CharField(max_length=500)
    addDate = models.DateTimeField(u'添加时间', auto_now_add=True, editable=True)
    updateTime = models.DateTimeField(u'更新时间', auto_now=True, null=True)

在settings.py中设置一下media的路径

MEDIA_ROOT = '/website/media'
MEDIA_URL = '/media/'

在admin.py下新加一条注册模型的语句

admin.site.register([Test,Shop])

 

 

 

同时在website目录下新建media目录

在nginx的配置文件中同样的新建一个media对应的别名

 

location /media{
    alias /website/media/;
}

在项目根目录下执行以下指令,来重新生成数据库

python3 manage.py makemigrations WxModel  # 让 Django 知道我们在我们的模型有一些变更
python3 manage.py migrate WxModel   # 创建表结构

另外还缺少一个Pillow的库,是要使用ImageField类型的字段需要的一个图形库,使用pip安装

pip3 install Pillow

 

重启nginx和uwsgi后成功

 

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