Ubuntu 部署Django

Ubuntu 部署Django


谢田波
阿里波波 发布于 2025-07-10 / 1 阅读 / 0 评论 /

环境设置

设置 root 密码

sudo passwd root

新增用户

adduser  [用户名]

环境变量设置

.profile/.bash_profile 通用设置

set -o vi
PS1="用户:\$PWD> "; export PS1

# 激活python虚拟环境
source $HOME/env/bin/activate

python环境设置

安装python pip3

sudo apt install python3-pip
sudo apt-get update
sudo apt install python3-pip
pip3 –V

安装python3-venv

# 1. 安装python3-venv
sudo apt-get install python3-venv

# 2. 创建虚拟环境
python3 -m venv env

# 3.激活环境
cd ~/env
source env/bin/activate

# 4.激活成功
# 显示 (env) xxxx

# 5.退出环境
# 退出虚拟环境
deactivate

pip源切换

  • 豆瓣:http://pypi.douban.com/simple/

  • 中科大:https://pypi.mirrors.ustc.edu.cn/simple/

  • 清华:https://pypi.tuna.tsinghua.edu.cn/simple/

一次性使用

可以在使用pip的时候加参数

pip3 install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple

永久修改

Linux & MacOS

linux下,修改 ~/.pip/pip.conf(没有就创建一个), 修改 index-url 为国内镜像地址,内容如下

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

软件安装

ssh服务器安装

Ubuntu默认没有安装ssh的server,需要安装

apt-get install openssh-server

启用 root 用户直接登录(可选但不推荐)

sudo nano /etc/ssh/sshd_config
-----------------------------------------------
#PermitRootLogin prohibit-password
PermitRootLogin yes # 取消注释并改为yes
-----------------------------------------------
sudo systemctl restart sshd

默认启动ssh

修改服务为enable

sudo systemctl enable ssh

mysql安装

安装mysql服务器

sudo apt-get update
sudo apt-get install mysql-server

免密登录

sudo mysql -uroot

更新密码

alter user 'root'@'localhost' identified with mysql_native_password by 'kdadmin2016@';

授权root访问

update user set host='%' where user='root';
grant all on *.* to 'root'@'%';
flush privileges;

# ----------------------------------------------------
/etc/mysql/mysql.conf.d/mysqld.cnf 
# bing-address = 127.0.0.1 屏蔽绑定 

# ----------------------------------------------------
重启mysql:
service mysql restart 

查看端口:netstat -an|grep 3306

# nginx 安装

检查 Nginx 是否安装

可以使用`dpkg -l | grep nginx`命令来查看。这个命令是在系统已安装软件包的列表中查找包含 “nginx” 字样的软件包。

安装nginx服务

apt-get install nginx

查看 Nginx 服务状态

在 Ubuntu 系统中,可以使用命令。

systemctl status nginx

配置Nginx

root:/home> nginx -t 
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok 
nginx: configuration file /etc/nginx/nginx.conf test is successful 


# 配置nginx文件,先对原始配置文件做个备份 sudo 
cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak

关键配置

server {
        listen 8889;
        server_name 14.22.83.104;

        server_name_in_redirect off;
        access_log /root/jh_data_plt/XtbPlatform/logs/nginx.access.log;
        error_log /root/jh_data_plt/XtbPlatform/logs/nginx.error.log;
        client_max_body_size 5m;


       # 跨域的处理
        add_header Access-Control-Allow-Credentials true;
        add_header Access-Control-Allow-Origin $http_origin;

        location /file {
                if ($request_method = 'OPTIONS') {
                add_header Access-Control-Allow-Origin $http_origin;
                add_header Access-Control-Allow-Methods $http_access_control_request_method;
                add_header Access-Control-Allow-Credentials true;
                add_header Access-Control-Allow-Headers $http_access_control_request_headers;
                add_header Access-Control-Max-Age 1728000;
                return 204;
             }
        }

        location /{
                proxy_pass http://127.0.0.1:8000;
                add_header Cross-Origin-Opener-Policy "same-origin";
                proxy_redirect     off;
                proxy_set_header   Host             $host;
                proxy_set_header   X-Real-IP        $remote_addr;
                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
                proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
                proxy_max_temp_file_size 0;
                proxy_connect_timeout      90;
                proxy_send_timeout         90;
                proxy_read_timeout         90;
                proxy_buffer_size          4k;
                proxy_buffers              4 32k;
                proxy_busy_buffers_size    64k;
                proxy_temp_file_write_size 64k;
        }

        location /static {
                root /root/jh_data_plt/XtbPlatform/staticfile;
        }

        location /media {
                alias /root/jh_data_plt/XtbPlatform/static/media;
        }
}

重启Nginx

sudo service nginx restart 或 sudo /etc/init.d/nginx restart

Django 设置

安装基本库

pip3 install django;
pip3 install gunicorn;
pip3 install xlwt;
pip3 install xlwings;
pip3 install XlsxWriter;
pip3 install requests;
pip3 install openpyxl; 
pip3 install pandas;
pip3 install PyMySQL;
pip3 install django-cors-headers;
pip3 install django-import-export;
pip3 install django-simpleui;
pip3 install Pillow;
pip3 install concurrent-log-handler;

pip3 install mysqlclient;

pip3 install mysqlclient 报错处理

apt-get install default-libmysqlclient-dev pkg-config
pip3 install mysqlclient -i https://pypi.doubanio.com/simple/ 

项目迁移

开发环境应用到Ubntun服务器应用用户

settings.py关键设置

# 1、生产环境设置为 False
DEBUG = False

# 2、设置运行访问IP
ALLOWED_HOSTS = ['14.22.83.104', 'localhost', '127.0.0.1']


# 数据库设置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'jihe_db',
        'USER': 'root',
        'PASSWORD': 'kdadmin2016@',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

# 语言时区设置
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_TZ = True


# Static files
STATIC_URL = 'static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
]
# STATIC_ROOT = os.path.join(BASE_DIR, "staticfile")


# Default primary key field type
EMAIL_HOST = 'smtp.qq.com'                  # 发送者邮箱服务器
EMAIL_PORT = 25                             # 端口
EMAIL_HOST_USER = 'xietianb@qq.com'         # 发送者用户名(邮箱地址)
EMAIL_HOST_PASSWORD = 'wnqcmckpibcpbjic'    # 发送者密码
EMAIL_USE_SSL = True
DEFAULT_FROM_EMAIL = 'xietianb@qq.com'


# 3、日志设置
BASE_LOG_DIR = os.path.join(BASE_DIR, "logs")
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '{asctime} {module}.{funcName} {lineno:3} {levelname:7} => {message}',
            'style': '{',
        },
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'formatter': 'verbose',
        },
        'file': {
            'class': 'concurrent_log_handler.ConcurrentRotatingFileHandler',
            'formatter': 'verbose',
            'filename': os.path.join(BASE_LOG_DIR, "info.log"),
            'maxBytes': 4194304,  # 4 MB
            'backupCount': 10,
            'level': 'DEBUG',
        },
    },
    'loggers': {
        '': {
            'handlers': ['console', 'file'],
            'level': 'INFO',
        },
        'django': {
            'handlers': ['console', 'file'],
            'level': 'INFO',
            'propagate': False,
        },
    },
}

# 4、跨域访问
# 添加Cors配置
# 1.设置白名单
CORS_ORIGIN_WHITELIST = ('http://14.22.83.104:8889', 'http://192.168.164:8080')
# 2.设置Cors的cookies
CORS_ALLOW_CREDENTIALS = True   # 允许带cookies
CORS_ORIGIN_ALLOW_ALL = True    # 运行所有资源访问

CSRF_TRUSTED_ORIGINS = [
    "http://11.22.83.104:8889",
]

CSRF_COOKIE_SECURE = False  # HTTP 时设为 False
CSRF_COOKIE_HTTPONLY = False
SESSION_COOKIE_SECURE = False  # HTTP 时设为 False
CSRF_TRUSTED_ORIGINS = ['http://14.22.83.104:8889']  # 允许屏蔽SCRF

# 5、SimpleUI配置
SIMPLEUI_HOME_INFO = False  # 隐藏右侧SimpleUI广告链接
SIMPLEUI_ANALYSIS = False   # 隐藏使用分析
SIMPLEUI_HOME_QUICK = True


# 首页设置, 指向新创建的控制面板
SIMPLEUI_HOME_PAGE = '/index/dashboard/'
SIMPLEUI_HOME_TITLE = '首页'
SIMPLEUI_HOME_ICON = 'fa-sharp fa-solid fa-house'

# logo设置
SIMPLEUI_LOGO = 'http://14.22.83.104:8889/static/images/fl_logo2.png'

# 导入导出设置
IMPORT_EXPORT_USE_TRANSACTIONS = True

# 自定义菜单设置
MENU_IP_ADDRESS = "http://14.22.83.104:8889/"

# 自定义菜单
SIMPLEUI_CONFIG = {
    'system_keep': True,
    'menu_display': ['聚水潭管理', '钉钉管理', '对账管理', '资料管理', '系统管理'],
    'menus': [
        # 聚水潭资料数据
        {
            'app': 'H',
            'name': '聚水潭管理',
            'icon': 'el-icon-s-ticket',
            'models': [
                {
                    'name': '销售出库同步',
                    'icon': 'el-icon-sort',
                    'url': MENU_IP_ADDRESS + 'xindi/xsck_order/'
                },
                {
                    'name': '售后数据同步',
                    'icon': 'el-icon-s-grid',
                    'url': MENU_IP_ADDRESS + 'xindi/xsth_order/'
                },
                {
                    'name': '采购订单同步',
                    'icon': 'el-icon-smoking',
                    'url': MENU_IP_ADDRESS + 'xindi/cgrk_order/'
                },
                {
                    'name': '采购退料同步',
                    'icon': 'el-icon-no-smoking',
                    'url': MENU_IP_ADDRESS + 'xindi/cgth_order/'
                },
                {
                    'name': '库存同步',
                    'icon': 'el-icon-shopping-cart-full',
                    'url': "xindi/qtkc/"
                },
            ]
        },

        # 钉钉数据
        {
            'app': 'xindi',
            'name': '钉钉管理',
            'icon': 'el-icon-s-promotion',
            'models': [
                {
                    'name': '采购付款',
                    'icon': 'el-icon-s-goods',
                    'url': MENU_IP_ADDRESS + "xindi/purchase_pay/"
                },
                {
                    'name': '费用报销',
                    'icon': 'el-icon-s-help',
                    'url': MENU_IP_ADDRESS + "xindi/exp_reimb/"
                },
                {
                    'name': '其他付款',
                    'icon': 'el-icon-suitcase',
                    'url': MENU_IP_ADDRESS + "xindi/other_pay/"
                },
                {
                    'name': '报销冲账',
                    'icon': 'el-icon-finished',
                    'url': MENU_IP_ADDRESS + "xindi/invoice_reversal/"
                },
                {
                    'name': '特批流程',
                    'icon': 'el-icon-mouse',
                    'url': MENU_IP_ADDRESS + "xindi/special_pay/"
                },
                {
                    'name': '资金调拨',
                    'icon': 'el-icon-guide',
                    'url': MENU_IP_ADDRESS + "xindi/pay_transfe/"
                },
            ]
        },
        # 对账管理
        {
            'app': 'xindi',
            'name': '对账管理',
            'icon': 'el-icon-document-copy',
            'models': [
                {
                    'name': '规则参数',
                    'icon': 'el-icon-document-checked',
                    'url': "xindi/wlmap/"
                },
                {
                    'name': '聚水潭订单',
                    'icon': 'el-icon-notebook-1',
                    'url': "xindi/saleorder/"
                },
                {
                    'name': '快递账单',
                    'icon': 'el-icon-notebook-2',
                    'url': "xindi/projectmap/"
                },
                {
                    'name': '对账报表明细',
                    'icon': 'el-icon-document',
                    'url': "xindi/projectmap/"
                },
                {
                    'name': '对账报表汇总',
                    'icon': 'el-icon-document-add',
                    'url': "xindi/projectmap/"
                }
            ]
        },
        # 资料
        {
            'app': 'xindi',
            'name': '资料管理',

            'icon': 'el-icon-setting',
            'models': [
                {
                    'name': '组织参数',
                    'icon': 'el-icon-s-claim',
                    'url': "xindi/orgmap/"
                },
                {
                    'name': '部门参数',
                    'icon': 'el-icon-s-finance',
                    'url': "xindi/deptmap/"
                },
                {
                    'name': '项目参数',
                    'icon': 'el-icon-s-finance',
                    'url': "xindi/projectmap/"
                },
                {
                    'name': '员工参数',
                    'icon': 'el-icon-s-finance',
                    'url': "xindi/empmap/"
                },
                {
                    'name': '供应商参数',
                    'icon': 'el-icon-s-check',
                    'url': "xindi/supplierpara/"
                },   
                {
                            'name': '商品数据',
                            'icon': 'el-icon-s-goods',
                            'url': "xindi/goodmap/"
                },
                {
                    'name': '店铺数据',
                    'icon': 'el-icon-s-shop',
                    'url': "xindi/shoppara/"
                },     
                {
                    'name': 'OA流程实例参数',
                    'icon': 'el-icon-finished',
                    'url': "xindi/processinstance/"
                }
            ]
        },
        # 系统管理
        {
            'app': 'auth',
            'name': '系统管理',
            'icon': 'el-icon-s-tools',
            'models': [
                {
                    'name': '用户权限',
                    'icon': 'fa fa-user',
                    'url': 'auth/user/'
                },
                {
                    'name': '用户权限组',
                    'icon': 'el-icon-menu',
                    'url': 'auth/group/'
                },
                {
                    'name': '接口鉴权管理',
                    'icon': 'el-icon-set-up',
                    'url': 'xindi/interfaceconfig/'
                },
                {
                    'name': '操作日志',
                    'icon': 'el-icon-chat-line-square',
                    'url': 'xindi/operloginfo/'
                },               
            ]
        },

    ]
}

# # Session的失效日期为 秒级
SESSION_COOKIE_AGE = 18000

# # 是否每次请求都保存Session,默认修改之后才保存
# ESSION_SAVE_EVERY_REQUEST = True

# 是否关闭浏览器使得Session过期
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
USE_L10N = False
DATETIME_FORMAT = 'Y-m-d'
DATE_FORMAT = 'Y-m-d'

收集静态文件

python3 manage.py collectstatic  # 错误时在settings.py中设置:STATIC_ROOT = os.path.join(BASE_DIR, "staticfile")

使用 Django-crontab

​**适用场景**​:简单的定时任务(如每天清理日志、发送日报等)。

​**原理**​:基于 Linux 的 cron 服务,通过 Django 管理任务。

安装与配置

pip3 install Django-crontab

在 settings.py 中注册

INSTALLED_APPS = [
    ...
    'django_crontab',
]

定义定时任务​

在 settings.py 中添加:

CRONJOBS = [
    # 每 5 分钟执行一次(示例:清理临时文件)
    ('*/5 * * * *', 'myapp.cron.clean_temp_files'),

    # 每天凌晨 3 点执行(示例:发送日报)
    ('0 3 * * *', 'myapp.cron.send_daily_report'),
]

创建 cron.py 文件

在 myapp/cron.py 中编写任务逻辑:

```python
def clean_temp_files():
    print("清理临时文件...")
    # 你的代码...

def send_daily_report():
    print("发送日报...")
    # 你的代码...

启动 cron 服务

python manage.py crontab add   # 添加任务
python manage.py crontab show  # 查看任务
python manage.py crontab remove  # 移除任务

检查运行日志

tail -f /var/log/syslog | grep CRON

数据迁移

# 数据库创建
python3 manage.py makemigrations
python3 manage.py migrate

# 创建超级用户
python manage.py createsuperuser

设置gunicorn

import multiprocessing

bind = "127.0.0.1:8000"   #绑定的ip与端口
workers = 5               #核心数
errorlog = '/root/jh_data_plt/XtbPlatform/logs/gunicorn.error.log' #发生错误时log的路径
accesslog = '/root/jh_data_plt/XtbPlatform/logs/gunicorn.access.log' #正常时的log路径

# loglevel = 'debug'         #日志等级
proc_name = 'gunicorn_project'   #进程名

设置启动/停止脚本

killall -9 gunicorn
nohup gunicorn XtbPlatform.wsgi:application -c /root/jh_data_plt/XtbPlatform/gunicorn.conf.py&
ps -ef|grep gunicorn



是否对你有帮助?

评论