Linux部署Django

Linux部署Django

好久没部署了,这次采用简单一点的Gunicorn

记录一下Linux配置Django的过程。现在不用uwsgi了,用gunicorn比较方便一些。

01 安装Gunicorn

在虚拟机里使用Python项目要弄好虚拟环境,如果没有的话还要先安装python3-venv。这里就省略了。

01 安装Gunicorn

激活虚拟环境,例如虚拟机里我为了使用FMS的虚拟环境放在/home/minko/FMS下,之后用pip直接安装即可:

source /home/minko/FMS/bin/activate
pip install gunicorn

02 修改Django配置

之前的项目因为要在Windows下边跑,直接用Django提供服务,所以设置了邪修的方法,静态文件在Debug=False的情况下强制让服务器提供。现在要部署到Linux上,就采用正式的方法了。

# 这行在Debug=False的时候才需要有
# 这个路径是收集各个APP里的静态文件的路径,也是运行collectstatic之后存放所有静态文件的路径,也是将来Nginx要配置提供静态文件的路径
# 但是已经存放在之前的static目录里的东西不会因为collectstatic复制过来
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

我这里还是指向项目里原本就存放静态文件的地方,然后执行python3 manage.py collectstatic之后,像admin应用的样式就会被收集过来。

03 配置Gunicorn

由于Nginx是反向代理,我们先要启动Gunicorn来提供web服务。由于是服务,所以编辑一个gunicorn.service文件放在/etc/systemd/system/gunicorn.service的位置,文件详情如下:

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=root
Group=www-data
WorkingDirectory=/home/minko/FMS_HIGHLY
ExecStart=/home/minko/FMS/bin/gunicorn --access-logfile - --workers 3 --bind 127.0.0.1:8000 FMS_HIGHLY.wsgi

[Install]
WantedBy=multi-user.target

这里用户用root用户启动。WorkdingDirectory是Django项目的目录。

最关键的下边启动,要使用前边配置的虚拟环境中的gunicorn来启动。注意要给执行文件提供wsgi的入口。由于现在已经在项目目录下,按照Django项目的结构,项目录下与项目同名的目录下的wsgi.py文件就是入口,但是要写成目录.wsgi的形式。

创建了服务文件之后,就是老套的启动服务,注册服务了:

sudo systemctl start gunicorn
sudo systemctl enable gunicorn

之后正常的话,应该可以在指定的端口访问服务了,但静态文件是缺失的。接下来就靠Nginx提供静态文件服务了。

04 配置Nginx

Nginx的默认配置文件在/etc/nginx/nginx.conf

由于服务器的数量不多,就直接更改这个配置文件即可。
在http的配置内部加上:

server {
		listen 80;
		server_name fms.local;
		
		location /static {
			alias /home/minko/FMS_HIGHLY/static/;  # 静态文件路径
		}

		location / {
			proxy_pass http://127.0.0.1:8000;
			proxy_set_header Host $host;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		}
}

这里端口设置了80,然后设置了一个域名(其实没用,只有本机解析用,在hosts里设置其为127.0.0.1)。下边的/static配置是最关键的部分,要指向刚才Django里的static_root设置,也就是收集了所有静态文件的地方。

下边是的location / 设置是服务器的路径入口,反向代理的地址就是Gunicorn启动服务器的绑定地址。

这时候settings.py中的ALLOWED_HOSTS配置就有点用了,写成虚拟机的地址加上自己设置的域名。重新启动Nginx服务就可以了。

LICENSED UNDER CC BY-NC-SA 4.0
Comment