使用ngnix通过uwsgi app容器部署django项目

nginx再linux下可以自己编译,我采用的编译选项为:

--prefix=/home/hzh/soft/softy/nginx-1.18.0 
--with-threads 
--with-file-aio 
--with-http_ssl_module 
--with-http_v2_module 
--with-http_realip_module 
--with-http_addition_module 
--with-http_xslt_module 
--with-http_image_filter_module 
--with-http_geoip_module 
--with-http_sub_module 
--with-http_dav_module 
--with-http_flv_module 
--with-http_mp4_module 
--with-http_gunzip_module 
--with-http_gzip_static_module 
--with-http_auth_request_module 
--with-http_random_index_module 
--with-http_secure_link_module 
--with-http_degradation_module 
--with-http_slice_module 
--with-http_stub_status_module 
--with-http_perl_module 
--with-mail 
--with-mail_ssl_module 
--with-stream 
--with-stream_ssl_module 
--with-stream_realip_module 
--with-stream_geoip_module 
--with-stream_ssl_preread_module 
--with-cpp_test_module 
--with-compat 
--with-pcre 
--with-pcre-jit 
--with-libatomic 
--with-debug 
--with-perl_modules_path=/home/hzh/soft/softy/nginx-1.18.0/perl_modules

其中 --with-perl_modules_path 是 make install 时存放 nginx.pm 的路径,最好放到安装目录里面,不然挪动这个文件路径之后,nginx就运行不成功,路径似乎是配置后硬编译进可执行文件里去了。

并且安装make install 好后,你就不能移动(包括重命名)该安装目录,一旦移动之后,就不能运行,会提示 Can't locate nginx.pm in @INC 或 could not open error log file 等错误。如果真的要移动到别的地方,只能通过目录软链接。

uwsgi 采用 pip 来安装:

$  vf activate env3.8.2
$  pip install uwsgi

nginx和uwsgi部署django项目的文档大致有如下参考:

https://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html

https://docs.djangoproject.com/en/3.1/howto/deployment/wsgi/uwsgi/

https://uwsgi-docs.readthedocs.io/en/latest/Management.html

我的部署示例:

我的django项目位于:   /home/hzh/develop/u-chuang/webs/device_register

项目目录结构:

device_register
├── db.sqlite3
├── device_register
│   ├── asgi.py
│   ├── __init__.py
│   ├── __pycache__
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
├── register
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   ├── 0002_auto_20201127_0317.py
│   │   ├── 0003_auto_20201127_0512.py
│   │   ├── 0004_auto_20201127_0515.py
│   │   ├── 0005_auto_20201127_0630.py
│   │   ├── 0006_auto_20201128_1122.py
│   │   ├── 0007_auto_20201128_1403.py
│   │   ├── __init__.py
│   │   └── __pycache__
│   ├── models.py
│   ├── __pycache__
│   ├── static
│   │   └── register
│   │       └── style.css
│   ├── templates
│   │   └── register
│   │       └── waiting_lists.html
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── static
│   ├── admin
│   ├── grappelli
│   └── register
│       └── style.css
└── templates
    └── admin-hzh
        ├── actions.html
        ├── app_list.html
        ├── base_site.html
        ├── change_list_results.html
        └── index.html

其中 device_register/static 目录是静态目录,里面包含了app register的目录及 grappelli(一个admin美化模块) 目录。

部署配置文件结构:

nginx-uwsgi-config
├── nginx-config
│   ├── mime.types
│   ├── my-nginx.conf
│   ├── nginx.conf
│   └── uwsgi_params
└── uwsgi-config
    └── uwsgi.ini

其中的 mime.types 和 uwsgi_params 是nginx自带的,没有任何改变; nginx.conf 大部分是nginx自带的,有点改变,全文如下:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

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"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    include /tmp/hzh/nginx-uwsgi-config/nginx-config/my-nginx.conf;

    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
}

其中 my-nginx.conf 是与自己项目相关的配置:

# the upstream component nginx needs to connect to
upstream django {
    server unix:///tmp/hzh/device_register-uwgsi-nginx.sock;    # for a file socket
    # server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}

# configuration of the server
server {
    # the port your site will be served on
    listen      8000;
    # the domain name it will serve for
    server_name example.com; # substitute your machine's IP address or FQDN
    charset     utf-8;

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

    # Django media
    location /media  {
        alias /path/to/your/mysite/media;  # your Django project's media files - amend as required
    }

    location /static {
        alias /home/hzh/develop/u-chuang/webs/device_register/static; # your Django project's static files - amend as required
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  django;
        include     /tmp/hzh/nginx-uwsgi-config/nginx-config/uwsgi_params; # the uwsgi_params file you installed
    }
}

其中 uwsgi.ini 是uwsgi的配置文件:

[uwsgi]

# Django-related settings
# the base directory (full path)
chdir           = /home/hzh/develop/u-chuang/webs/device_register
# Django's wsgi file
module          = device_register.wsgi:application
# the virtualenv (full path)
home            = /home/hzh/.virtualenvs/env3.8.2
env             = DJANGO_SETTINGS_MODULE=device_register.settings

# process-related settings
# master
master          = true
# maximum number of worker processes
processes       = 10
# the socket (use the full path to be safe
socket          = /tmp/hzh/device_register-uwgsi-nginx.sock
# ... with appropriate permissions - may be needed
chmod-socket    = 664
pidfile         = /tmp/hzh/device_register-uwsgi.pid
# clear environment on exit
vacuum          = true

重要,建议nginx与uwsgi通信使用 file socket,而不是使用 port socket,因为 port socket 相当于暴露了 uwsgi 给外部,安全级别不好。

这些配置文件准备好后,就可以运行uwsgi和nginx了:

$  uwsgi --ini uwsgi.ini
$  /home/hzh/soft/nginx/sbin/nginx -c /tmp/hzh/nginx-uwsgi-config/nginx-config/nginx.conf
原文地址:https://www.cnblogs.com/welhzh/p/14079210.html