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

服务器搭建过程记录 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: POODLE
      ssl_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.d
    
    sudo cp mysql.cnf  mysql.cnf.bak
    
    sudo 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/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容