服务器部署Django项目
我这里的服务器是阿里云centerOS 8.0
1. 环境配置
更新环境
# 如果不是root用户在命令前面加sudo
yum update
yum upgrade
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel xz-devel
安装git
yum install git
2. 安装python
安装pyenv
是用来python版本的工具
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >>~/.bash_profile
echo 'eval "$(pyenv init -)"' >>~/.bash_profile
exec $SHELL -l #即是启动语句,重启系统执行这条语句
安装python 下面以python 3.7.4为例
pyenv install --list # 查看可以安装的版本
安装指定版本
pyenv install 3.7.4 # pyenv install 指定版本
1.png如果pyenv install 没有反应 请去官网下载您需要的版本
在/root/.pyenv/ 下面新建cache文件夹
把下载的资源上传到cache目录下面
pyenv install -v 3.7.4
出现这个错误ModuleNotFoundError: No module named '_ctypes'
yum install libffi-devel
继续安装
pyenv rehash # 刷新数据库
pyenv version #查看现在的python版本
pyenv global 3.7.4 #设置系统默认python版本
pyenv version # 显示 3.7.4 设置成功
3. 安装MySQL
我这里安装是默认最新的MySQL 现在是8.0.17
yum install -y mysql-server # 下载安装MySQL
service mysqld start # 启动MySQL
登录MySQL
注意一开始MySQL密码是空的
mysql -u root -p #启动了说明MySQL安装成功
2.png使用Navicat
使用ssh登录
3.png 4.png点击上方用户
点击root用户修改他的密码
5.png编辑您的链接
输入完成就可以登录了
4.安装虚拟环境
我这里虚拟环境是pipenv
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple pipenv
pipenv shell # 你要在你需要目录中启动虚拟环境
exit # 退出虚拟环境
5.上传Django项目
通过pycharm sftp上传项目
在本地对应项目文件夹(把需要库生成txt)、这里把文件放在manage.py同级
pip freeze > requirements.txt
在服务器中的虚拟环境项目目录里面 、会自动安装你Django里面的库
pip install -r requirements.txt
在你的虚拟环境中的项目目录里面
python manage.py runserver 0.0.0.0:8000 # 这个目录在关闭ssh就不能访问了
nohup python manage.py runserver 0.0.0.0:8000 #这样关闭了ssh还可以运行
6.安装uwsgi
安装uwsgi 不要在虚拟环境中安装uWSGI
pip install uwsgi
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi #软连接
测试是否安装成功
# 随便新建一个目录新建 test.py 写入如下内容
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]
# 在你新建的目录的下面 注意http :8000是你服务器需要开放的端口、不然服务器是无法访问的
uwsgi uwsgi --http :8000 --wsgi-file test.py
1.png打开浏览器ip:8000 是否可以访问(8000是你Django运行端口)
这里我遇到一个坑,我本地测试可以,但是服务器无法访问,阿里云安全组没有开放对应端口
测试成功了
在pycharm和manage.py平级目录新建uwsgi.ini
;# uwsgi.ini
;[uwsgi]
;#django 端口号
;#http= ip:port
;socket= 127.0.0.1:8000
;master = true //主进程
;#vhost = true //多站模式
;#no-site = true //多站模式时不设置入口模块和文件
;#workers = 2 //子进程数
;reload-mercy = 10
;vacuum = true //退出、重启时清理文件
;max-requests = 1000
;limit-as = 512
;buffer-size = 30000
;
;#django 目录
;chdir=/data/mxonline_django2
;
;#Django 项目下 wsgi.py 文件路径
;wsgi-file=mxonline_django2/wsgi.py
;
;#进程数
;processes=2
;#服务器进程开启的县成熟
;threads=4
;
;pidfile=uwsgi.pid
# 这句代码必须加上
[uwsgi]
#配置和nginx连接的socket连接
socket=127.0.0.1:9000
#直接做web服务器使用
http=0.0.0.0:8000
#配置项目路径,项目的所在目录
chdir=您的项目路径
#配置wsgi接口模块文件路径
wsgi-file=您的项目路径/项目名字/wsgi.py
#配置启动的进程数
processes=4
#配置每个进程的线程数
threads=2
#配置启动管理主进程
master=True
stats = 您的项目静态文件
#配置存放主进程的进程号文件
pidfile=您的项目路径/项目名字/wsgi.py/uwsgi.pid
#配置dump日志记录
daemonize=您的项目路径/项目名字/uwsgi.log
你的项目的目录 是和manage.py平级目录 启动uwsgi
uwsgi --ini uwsgi.ini
打开浏览器ip:8000 访问(8000是你Django运行端口)
如果静态资源没有加载
说一下遇到的坑
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, '/static/')
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
直接写static就可以了、不用写项目的静态文件的路径
重新启动uwsgi
uwsgi --reload uwsgi.pid
打开浏览器ip:8000 访问
8.安装Nignx
sudo yum install -y nginx
systemctl start nginx.service # 启动Nginx
ginx的配置文件一般放在/usr/local/nginx/conf,/etc/nginx或 /usr/local/etc/nginx中,默认文件名为nginx.conf。
我这里的目录是在/etc/nginx
先测试一下nignx
vim /etc/nginx/nginx.conf
编辑配置文件
新建/home/my、在里面写一个index.html、和随便放点资源
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user root; # 使用着修改成为root 不然等一下测试访问资源的时候会403
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
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 /var/log/nginx/access.log main;
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;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _; #你的域名
root /home/my; #我这里在/home/新建的目录 根目录
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
location /media/ {
alias /home/my/media/; #视频文件的目录
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2 default_server;
# listen [::]:443 ssl http2 default_server;
# server_name _;
# root /usr/share/nginx/html;
#
# ssl_certificate "/etc/pki/nginx/server.crt";
# ssl_certificate_key "/etc/pki/nginx/private/server.key";
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers PROFILE=SYSTEM;
# ssl_prefer_server_ciphers on;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# location / {
# }
#
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }
}
重启nignx
systemctl restart nginx.service
输入IP地址访问
可以访问、配置成功
下面是uwsgi和nignx配置
vim /etc/nginx/nginx.conf
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user root;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
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 /var/log/nginx/access.log main;
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;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
#upstream django {
# # server unix:///path/to/your/mysite/mysite.sock; # for a file socket
# server 127.0.0.1:8000; # for a web port socket (we'll use this first)
#}
server {
listen 80 default_server; # 监听80端口
server_name localhost; #域名 IP地址
charset utf-8;
include /etc/nginx/default.d/*.conf;
#client_max_body_size 75M;
location / {
proxy_pass http://127.0.0.1:8000; # uwsgi和nignx是http方式连接、要和uwsgi.ini里面的端口一样
include /etc/nginx/uwsgi_params;
#uwsgi_pass 127.0.0.1:9000; # uwsgi和nignx是scoket方式连接、要和uwsgi.ini里面的端口一样
}
location /static/ {
alias /static/; # 静态文件 和Django里面的一样
}
#location /media/ {
# alias /data/mxonline/media;
#}
#error_page 404 /404.html;
# location = /40x.html {
#}
#error_page 500 502 503 504 /50x.html;
# location = /50x.html {
#}
}
# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2 default_server;
# listen [::]:443 ssl http2 default_server;
# server_name _;
# root /usr/share/nginx/html;
#
# ssl_certificate "/etc/pki/nginx/server.crt";
# ssl_certificate_key "/etc/pki/nginx/private/server.key";
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers PROFILE=SYSTEM;
# ssl_prefer_server_ciphers on;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# location / {
# }
#
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }
}
重启nignx
systemctl restart nginx.service
输入IP地址访问
可以访问、配置成功