CentOS7 Django项目服务器搭建(局域网内访问)
刚开始接触Django开发,这篇文章由个人经验总结以及借鉴互联网资料而成,若有错误欢迎指正
操作步骤(默认主机接入路由器并可上网,部分操作需要root权限):
- CentOS7系统
- wget&换源
- ifconfig
- vim
- 配置网络
- python&pip换源
- virtualenv&创建环境
- uwsgi
- (virtualenv)uwsgi
- (virtualenv)django
- (virtualenv)上传代码
- (virtualenv)配置uwsgi
- 安装配置nginx
- 启动项目&放行端口(防火墙)
步骤1:安装CentOS 7系统
下载镜像,制作启动U盘,安装
安装时可能遇到的问题:
问题1:报错“has invalid signature , you need to load the kernel first”解决办法:
- 进入主板BIOS
- 关闭SecureBoot
- 保存重启
- 安装系统
问题2:报错”starting dracut initqueue hook“
解决办法:- 在启动引导界面(Install CentOS 7...)按 e 编辑开机选项
- 查看U盘路径,将”linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 quiet“更改为”linuxefi /images/pxeboot/vmlinuz linux dd nomodeset quiet“,完成后按 ctrl + x ,得到U盘路径”scd4 vfat CentOS\x207\x20x86_64“
- 重启,在启动引导界面(Install CentOS 7...)按 e 编辑开机选项
- 修改安装位置,将”linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 quiet“更改为”linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:/dev/sdc4 quiet“,完成后按 ctrl + x 进入安装界面
- 安装系统
步骤2:安装wget并更换国内源
安装:yum install wget -y
换源:
- 切入CentOS-Base.repo所在目录,cd /etc/yum.repos.d
- 将CentOS-Base.repo改名成CentOS-Base.repo.bak,mv CentOS-Base.repo CentOS-Base.repo.bak
- 更换源文件(阿里云),使用 wget -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/Centos-7.repo 或 curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/Centos-7.repo(当无法使用yum下载wget及其他工具包时)
- 切入CentOS-Base.repo所在目录,cd /etc/yum.repos.d
- 清除缓存,yum clean all
- 重新生成缓存,yum makecache
- 更新最新源设置,yum update -y
步骤3:安装ifconfig(查看本机网络信息也可以使用 ip addr)
-
查看需要安装的软件包,yum search ifconfig
- 安装软件包,yum install net-tools.x86_64
-
步骤4:安装vim
安装:yum -y install vim*
配置:
- 打开配置文件,vim /etc/vimrc
- 在配置文件末尾增加
- set nu "显示行号
- set showmode "在命令行界面最下面显示当前模式等
- set ruler "在右下角显示光标所在的行数等信息
- set autoindent "每次单击Enter键后光标移动到下一行时与上一行的起始字符对齐
- syntax on "语法检测,编辑脚本时关键字会用特殊颜色显示
- 保存文件,按先按Esc,再输入 :wq ,回车
步骤5:配置网络(静态IP)
- 查看当前局域网信息,选择一个未使用的IP地址,避免IP地址冲突
- 打开网卡配置文件,vim /etc/sysconfig/network-scripts/ifcfg-ens33
- 编辑配置文件
-
BOOTPROTO=static #使用静态IP地址,默认为dhcp
-
ONBOOT=yes #设置网卡启动方式为开机启动
-
IPADDR=192.168.1.20 #设置的静态IP地址
-
NETMASK=255.255.255.0 #子网掩码
-
GATEWAY=192.168.1.1 #网关地址
-
DNS1=223.5.5.5 #DNS服务器(按需设置)
- DNS2=114.114.114.114 #DNS服务器(按需设置)
-
- 保存文件,按先按Esc,再输入 :wq ,回车
- 重启网络服务,service network restart
- 测试连接
步骤6:安装python并更换国内源(python版本以项目为准)
安装python:
- 更新系统软件包,yum update -y
- 安装软件管理包和可能使用的依赖
-
yum -y groupinstall "Development tools"
-
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel
-
- 下载Pyhton3到/usr/local 目录
-
cd /usr/local
-
wget https://www.python.org/ftp/python/3.9.6/Python-3.9.6.tgz(下载速度不稳定时快时慢,建议使用华为镜像: https://repo.huaweicloud.com/python/3.9.6/Python-3.9.6.tgz)
-
- 解压,tar -zxvf Python-3.9.6.tgz
- 进入Python-3.9.6路径,cd Python-3.9.6
- 编译安装到指定路径,./configure --prefix=/usr/local/python3
- 安装python3
- make
- make install
- 给python3建立软链接,ln -s /usr/local/python3/bin/python3.9 /usr/bin/python3
- 给pip3建立软链接,ln -s /usr/local/python3/bin/pip3.9 /usr/bin/pip3
- 查看python3和pip3安装情况
- python3
- pip3 -V
换源:pip3 config set global.index-url https://mirrors.aliyun.com/pypi/simple/
步骤7:安装virtualenv并创建虚拟环境
安装virtualenv:
- pip3 install virtualenv
- 建立软链接,ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv
创建虚拟环境:
- 创建安装目录,mkdir -p /data/env
- 切换到/data/env/下,创建指定版本的虚拟环境,virtualenv --python=/usr/bin/python3 pyweb
- 切换到/data/env/pyweb/bin下,启动虚拟环境,source activate
- 换源,pip3 config set global.index-url https://mirrors.aliyun.com/pypi/simple/
步骤8:在主机上安装uwsgi
安装uwsgi:
-
pip3 install uwsgi
- 给uwsgi建立软链接,ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
-
步骤9:在虚拟环境上安装uwsgi(同主机安装)
注意切换到虚拟环境
步骤10:在虚拟环境上安装django(django版本以项目为准)
注意切换到虚拟环境
安装django:pip3 install django(pip3 install django==4.2.5)
步骤11:在虚拟环境上传代码(将源码打包成压缩文件上传)
- 创建代码存放路径,mkdir -p /data/wwwroot
- 解压,unzip meslite.zip
- 切换到项目目录,cd /data/wwwroot/meslite
- 测试django运行,python3 manage.py runserver
项目运行时可能出现的问题:
问题:报错“django.db.utils.NotSupportedError: deterministic=True requires SQLite 3.8.3”
解决办法:使用第三方包运行SQLite,把sqlite3 更换为pysqlite3 和 pysqlite3-binary
- 安装pysqlite3,pip install pysqlite3
- 安装pysqlite3-binary,pip install pysqlite3-binary
- 打开文件/data/env/pyweb/lib/python3.9/site-packages/django/db/backends/sqlite3/base.py,注释“from sqlite3 import dbapi2 as Database”并在下面添加“from pysqlite3 import dbapi2 as Database”
- 保存文件,按先按Esc,再输入 :wq ,回车
步骤12:在虚拟环境配置uwsgi文件
在项目根目录下创建在项目根目录下创建meslite.xml文件,输入如下内容:(注意<module>里的meslite,为wsgi.py所在的目录名)
<uwsgi>
<socket>127.0.0.1:8997</socket> <!-- 内部端口,自定义 -->
<chdir>/data/wwwroot/meslite/</chdir> <!-- 项目路径 -->
<module>meslite.wsgi</module> <!-- meslite为wsgi.py所在目录名-->
<processes>4</processes> <!-- 进程数 -->
<daemonize>uwsgi.log</daemonize> <!-- 日志文件 -->
</uwsgi>
查看uwsgi状态:ps -ef| grep uwsgi
启动uwsgi:uwsgi -x meslite.xml
停止uwsgi:killall -9 uwsgi
步骤13:主机安装配置nginx
安装nginx:
- 进入home目录,cd /home
- 下载nginx,wget http://nginx.org/download/nginx-1.13.7.tar.gz
- 解压,tar -zxvf nginx-1.13.7.tar.gz
- 进入解压后的文件夹,cd nginx-1.13.7
- 执行安装命令
-
./configure
- make
- make install
-
配置nginx:
- 进入nginx配置文件夹,cd /usr/local/nginx/conf
- 先备份一下nginx.conf文件以防意外,cp nginx.conf nginx.conf.bak
- 写入配置文件
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
server {
listen 80;
server_name 127.0.0.1:80; #改为自己的域名,没域名修改为127.0.0.1:80
charset utf-8;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8997; #端口要和uwsgi里配置的一样
uwsgi_param UWSGI_SCRIPT meslite.wsgi; #wsgi.py所在的目录名+.wsgi
uwsgi_param UWSGI_CHDIR /data/wwwroot/meslite/; #项目路径
}
location /static/ {
alias /data/wwwroot/meslite/monitor/static/; #静态资源路径
}
}
}
检查nginx配置文件:进入/usr/local/nginx/sbin/,执行./nginx -t命令先检查配置文件是否有错
启动nginx:./nginx
查看nginx:ps -ef | grep nginx
关闭nginx :kill -9 进程号
停止 nginx : ./nginx -s stop
重启nginx:./nginx -s reload
步骤14:启动项目并放行端口(防火墙)
启动项目:
- 切换到虚拟环境路径,cd /data/env/pyweb/bin
- 进入虚拟环境,source activate
- 切换到项目路径,cd /data/wwwroot/meslite
- 启动uwsgi,uwsgi -x meslite.xml
- 切换到nginx路径,cd /usr/local/nginx/sbin
- 启动nginx,./nginx
放行端口:有些服务器外网默认是无法访问的,因为防火墙不允许,所以要开启防火墙,让其可以访问需要访问的端口号
看zone名称:firewall-cmd --get-active-zones
打开端口(以80端口为例):firewall-cmd --zone=public --add-port=80/tcp --permanent
查看端口(以80端口为例):firewall-cmd --query-port=80/tcp
重启防火墙:firewall-cmd --reload