当前位置: 代码迷 >> 综合 >> 服务器搭建过程记录 Nginx + uwsgi + Django
  详细解决方案

服务器搭建过程记录 Nginx + uwsgi + Django

热度:42   发布时间:2023-12-19 07:56:12.0

服务器搭建过程记录 Nginx + uwsgi + Django

本文进行的前提:

在本地已完成Django项目调试,然后向服务器迁移
花了一天时间踩坑完成,可以参考一下流程

第一步 Django已完成项目 设置修改

  • settings.py 文件的修改

    //settings.py
    DEBUG = False
    ALLOWED_HOSTS = ['*']# STATICFILES_DIRS 是在开发过程中 使用django自带服务器时  设置的静态文件路径
    # STATIC_ROOT 这个路径是 执行 ./manage.py collectstatic (将每个app中静态文件汇总)  后 那些静态文件放的路径  
    # 当放到nginx服务器上时 保留STATIC_ROOT路径  以方便以后修改STATIC_URL = '/static/'
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    # STATICFILES_DIRS = [
    #     os.path.join(BASE_DIR, 'static')
    # ]   
    
  • 在与manage.py同级目录下 创建project.conf 文件

  • 在配置前 先看下原理

    #首先客户端请求服务资源,
    #nginx作为直接对外的服务接口,接收到客户端发送过来的http请求,会解包、分析,
    #如果是静态文件请求就根据nginx配置的静态文件目录,返回请求的资源,
    #如果是动态的请求,nginx就通过配置文件,将请求传递给uWSGI;uWSGI 将接收到的包进行处理,并转发给  wsgi,
    #wsgi根据请求调用django工程的某个文件或函数,处理完后django将返回值交给wsgi,
    #wsgi将返回值进行打包,转发给uWSGI,
    #uWSGI接收后转发给nginx,nginx最终将返回值返回给客户端(如浏览器)。
    #*注:不同的组件之间传递信息涉及到数据格式和协议的转换
    
    # project.conf 
    user www-data;
    worker_processes auto;
    pid /run/nginx.pid;events {worker_connections 768;# multi_accept on;
    }http {sendfile on;tcp_nopush on;tcp_nodelay on;keepalive_timeout 65;types_hash_max_size 2048;include /etc/nginx/mime.types;default_type application/octet-stream;ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLEssl_prefer_server_ciphers on;access_log /var/log/nginx/access.log;error_log /var/log/nginx/error.log;gzip on;gzip_disable "msie6";include /etc/nginx/conf.d/*.conf;include /etc/nginx/sites-enabled/*;# 以下需配置server {listen         80;server_name    www.19950314nina.top;   # 你的服务器的域名地址charset UTF-8;access_log      /var/log/nginx/myweb_access.log; error_log       /var/log/nginx/myweb_error.log;client_max_body_size 75M;#如果是动态的请求,nginx将请求传递给uWSGI;uWSGI将接收到的包进行处理,并转发wsgi,location / {include uwsgi_params;uwsgi_pass 127.0.0.1:8000;    # 注意  这个8000端口需要和后面的 uwsgi.ini 端口一致uwsgi_read_timeout 10;    # 时间建议可以长一些  否则有时会返回504}#如果是静态文件请求 根据nginx配置的静态文件目录,返回请求的资源,location /static {expires 30d;autoindex on;add_header Cache-Control private;alias /home/mrg/PycharmProjects/myblog/static/; # 你的静态文件路径  即之前在setting.py 设置的 STATIC_ROOT 的路径}}
    }
    
  • 在与manage.py同级目录下 创建projectname_uwsgi.ini文件

    [uwsgi]
    socket = :8000   # 注意 需要和nginx的配置文件端口一致
    chdir=/home/mrg/PycharmProjects/myblog  # django项目目录绝对路径
    module= myblog.wsgi       # wsgi.py在项目中的相对路径 
    master = true         
    processes=2
    threads=2
    max-requests=2000
    chmod-socket=664
    vacuum=true
    daemonize = /home/mrg/PycharmProjects/myblog/uwsgi.log # uwsgi日志存储路径 可以不写  
    
    #简易版本
    [uwsgi]
    socket= :8000
    chdir = /home/mrg/PycharmProjects/myblog  #django项目目录绝对路径
    module = myblog.wsgi
    master = true
    processes = 4
    vacumm = true
    
  • 最后

    • 去nginx配置文件的根目录拷贝mime.types(/etc/nginx/mime.types),以及uwsgi_params复制到工程目录和project.conf放在一起

第二步 使用git

对我来说 使用git 比较方便

也可以选择其他方式上传文件到服务器

  • Github创建一个空仓库

  • 在项目目录下执行以下步骤

    git init   #初始化项目
    git remote add origin 远程仓库地址   # 链接远程仓库
    source ~/env/bin/activate    # 进入虚拟环境  这个是写django项目的环境
    pip freeze > requirements.txt   # 生成依赖文件
    git add .  # 添加代码文件
    git commit -m '初始版本'  #代码提交到本地库
    git push origin master   # 代码推送到仓库
    

    如果出现代码冲突情况

    #如果希望保留生产服务器上所做的改动,仅仅并入新配置项, 处理方法如下:
    git stash
    git pull
    git stash pop#如果希望用代码库中的文件完全覆盖本地工作版本. 方法如下:
    git reset --hard
    git pull
    
  • 使用ubuntu自带的ssh 工具登陆 服务器

    ssh username@10.31.125.165
    

    顺利连上之后 创建用户(如果已经有了就不需要重复了)

    # 在 root 用户下运行这条命令创建一个新用户,mrg 是用户名
    # 选择一个你喜欢的用户名,不一定非得和我的相同
    root@localhost:~# useradd -m -s /bin/bash mrg# 把新创建的用户加入超级权限组
    root@localhost:~# usermod -a -G sudo mrg# 为新用户设置密码
    # 注意在输密码的时候不会有字符显示,不要以为键盘坏了,正常输入即可
    root@localhost:~# passwd mrg# 切换到创建的新用户
    root@localhost:~# su  mrg# 切换成功,@符号前面已经是新用户名而不是 root 了
    mrg@localhost:~$
    

第三步 环境配置

  • 安装常见的库
- sudo apt-get update
- sudo apt-get upgrade
- sudo apt-get install man gcc  make sudo lsof ssh openssl tree vim dnsutils iputils-ping net-tools psmisc sysstat curl telnet traceroute wget libbz2-dev libpcre3 libpcre3-dev libreadline-dev libsqlite3-dev libssl-dev zlib1g-dev git mysql-server mysql-client zip  p7zip mycli
  • 创建虚拟环境

    - sudo apt-get python3-pip
    - sudo pip3 install virtualenv  
    - sudo virtualenv -p python3 env_name  创建虚拟环境
    - source ~/env_name/bin/active    开启虚拟环境
    - pip install uwsgi  安装uwsgi
    - deactivate  退出虚拟环境
    - sudo ufw allow 80   开启80端口
  • mysql数据库修改字符集

    修改mysql的配置文件cd /etc/mysql/mysql.conf.dsudo cp mysql.cnf  mysql.cnf.baksudo vim mysql.cnf在[mysqld]下增加一句:character_set_server = utf8保存并重启服务sudo systemctl restart mysql.service  #重启服务
    
  • 安装Nginx

    sudo apt-get install nginx  #安装
    sudo /etc/init.d/nginx start[or stop or restart]  #启动,关闭,重启
    
  • 从git仓库拉代码

git clone  仓库地址    # 将项目clone下来
# cd 到项目根目录
source ~/env/bin/activate    # 进入虚拟环境  这个就是之前创建的虚拟环境
pip install -r requirements.txt   # 安装依赖环境

第四步 一些设置的确认及修改

  • 数据库的一些操作

    # 创建用户
    grant all on *.* to 'django'@'%' identified by 'djangopwd';
    # 刷新使用户生效
    flush privileges;
    # 创建对应的表
    create database project
    
  • django数据库迁移,以及静态文件夹的生成

    #cd到项目目录下
    ./manage.py makemigrations  # 生成迁移文件
    ./manage.py migrate  # 迁移
    ./manage.py collectstatic  # 生成静态文件夹
    
  • 确认项目目录下配置文件中的路径是否和服务器上对应的路径一致

    • 主要为以下需要确认的配置文件

      1.settings.py 2.project.conf
      alias /home/mrg/PycharmProjects/myblog/static/; # 你的静态文件路径  即之前在setting.py 设置的 STATIC_ROOT 的路径3.projectname_uwsgi.ini
      chdir=/home/mrg/PycharmProjects/myblog  # django项目目录绝对路径主要是2,3 两个文件中的路径是否设置正确
      
  • 确认无误后

    # cd 到项目目录下
    uwsgi --ini project_uwsgi.ini   nginx -c /home/mrg/PycharmProjects/myblog/project.conf    # 注意该路径必须为绝对路径

到这里基本上已经配置完成了,你也可以在网页上打开你的页面了

-----------------------------------------------------------------------------------------------------------------------------

  1. 如果启动时就报错,查看终端信息,解决错误。
    如果终端没有报错,但是浏览时出现500、502等错误,就去项目目录查看nginx日志和uWSGI日志,解决错误。
  2. 在本文中,使用了virtualenv开发环境,但只是用单独的一个conf文件,在nginx上部署了一个工程,没有说明部署多个工程的问题,也没有说明使用supervisor来管理进程等。请根据个人爱好和需要去实践扩展。

后记

献给和我一样懵懂中不断汲取知识,进步的人们。


霓虹闪烁,但人们真正需要的,只是一个可以照亮前路的烛光

参考博客:

https://blog.csdn.net/c465869935/article/details/53242126

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

https://www.zmrenwu.com/post/20/