2-Linux-应用-部署icwp-Linux虚拟机【Django+Vue+Nginx+uwsgi+Linux】

news2024/9/29 17:33:47

本文概述

  • 本文章讲述基于Linux CentOS 7系统(虚拟机),部署Django+Vue开发的前后端分离项目。

    • 项目源码不开放,但是操作步骤可以借鉴。

    • 该文章将项目部署在Linux虚拟机上,暂不使用Docker

  • 相关指令尽量展示执行路径,方便直观理解

最后有流程总结,捋不清的时候,可以到最后看看

后续部署系列:

  • 基于Docker的Django+Vue项目部署:https://blog.csdn.net/qq_45445505/article/details/135563811

部署前准备

本机软件准备

软件用途
VMware Workstation部署Linux虚拟机(提前准备好软件,并部署好虚拟机)
MobaXterm远程连接软件,在本地(Windows系统)远程连接虚拟机的Linux系统

文章中常用的命令

防火墙有关命令

开启防火墙端口

firewall-cmd --zone=public --add-port=端口号/tcp --permanent

重载防火墙:该命令用在任何对防火墙更改的命令后,立刻使更改生效!!!!

firewall-cmd --reload

查看防火墙状态

systemctl status firewalld.service

查看以开放的端口

firewall-cmd --list-ports

安装Git

安装方式1:一键安装

yum install git  -y

一键安装的版本可能过低,有时候clone仓库的时候有问题

安装方式2:安装指定版本git【建议】

移除已有的git

[root@localhost ~]# yum remove git

下载编译源代码的工具

[root@localhost ~]# yum -y groupinstall "Development tools"

下载相关依赖包

[root@localhost ~]# yum -y install zlib-devel perl-ExtUtils-MakeMaker asciidoc xmlto openssl-devel

下载git

  • git官网:https://mirrors.edge.kernel.org/pub/software/scm/git/
  • 注意事项:不要下载带有-rc的,因为它代表了一个候选发布版本
[root@localhost ~]# wget https://www.kernel.org/pub/software/scm/git/git-2.32.6.tar.gz

解压到指定文件夹下

  • 指定文件夹必须存在!
  • 将git解压缩的位置和git安装的位置放在一起,删除的时候好删除
[root@localhost ~]# tar -zxvf git-2.32.6.tar.gz -C /usr/local/git

进入解压缩后的目录

[root@localhost ~]# cd /usr/local/git/git-2.32.6
[root@localhost git-2.32.6]#

配置编译和安装的地址

[root@localhost git-2.32.6]# ./configure --prefix=/usr/local/git

编译和安装

[root@localhost git-2.32.6]# make && make install

配置环境变量

  • 打开配置文件
[root@localhost git-2.32.6]# vim /etc/profile
  • 文件末尾添加一行
export PATH=/usr/local/git/bin:$PATH
  • 退出文件,执行以下命令使更改生效
[root@localhost git-2.32.6]# source /etc/profile

查看git版本

[root@localhost git-2.32.6]# git version

拉取项目文件

创建存放代码的目录

[root@localhost git-2.32.6]# mkdir /icwp/code

进入该目录

[root@localhost git-2.32.6]# cd /icwp/code
[root@localhost code]# 

拉取仓库

  • 拉取公开仓库
git clone 仓库地址
  • 拉取私有仓库
git clone git clone https://user:需要自己生成仓库的Token@ghproxy.com/仓库地址
  • 拉取自己的私有仓库:ssh,自行百度

安装MySQL

卸载已有的Mysql

若需要卸载已有的Mysql,可以按照如下步骤

1、查询是否安装了MySQL

[root@localhost ~]# rpm -qa | grep mysql
mysql-community-client-5.7.44-1.el7.x86_64
mysql57-community-release-el7-10.noarch
mysql-community-libs-5.7.44-1.el7.x86_64
mysql-community-server-5.7.44-1.el7.x86_64
mysql-community-common-5.7.44-1.el7.x86_64

查询到相关安装

2、查看MySQL服务是否已开启,若开启则需要关闭

[root@localhost ~]# systemctl status mysqld
[root@localhost ~]# systemctl stop mysqld

3、查询含有MySQL的目录并删除

查询目录。对于我这台电脑的结果:

  • /var/lib/docker目录下是docker配置的有关mysql的挂载信息,不用管
  • /root目录下是自建的文件夹,也不用删

Linux默认安装MySQL,且要删除的文件夹一般都是在:

  • /var/lib/目录下
  • /usr/目录下
[root@localhost ~]# find / -name mysql
find: ‘/run/user/1000/gvfs’: Permission denied
/etc/logrotate.d/mysql							# 删除
/etc/selinux/targeted/active/modules/100/mysql	# 删除
/etc/selinux/targeted/tmp/modules/100/mysql		# 删除
/root/.virtualenvs/icwp/lib/python3.8/site-packages/django/contrib/gis/db/backends/mysql
/root/.virtualenvs/icwp/lib/python3.8/site-packages/django/db/backends/mysql
/root/mysql
/root/mysql/data/mysql
/var/lib/docker/volumes/f0ece572bc8f6fb3b7448210bb4ead64e622062f7d41e225d17b99659e945b6a/_data/mysql
/var/lib/docker/volumes/58aaeb5cb98e01083d9624bd1981ed4cdf65436d7019b77b471e6bd0cefa9e3b/_data/mysql
/var/lib/docker/overlay2/4f71b050ff227dd296891c0ebd6210744dda330e0a03ec3ed2616c537809ea98/diff/etc/mysql
/var/lib/docker/overlay2/4f71b050ff227dd296891c0ebd6210744dda330e0a03ec3ed2616c537809ea98/diff/usr/bin/mysql
/var/lib/docker/overlay2/4f71b050ff227dd296891c0ebd6210744dda330e0a03ec3ed2616c537809ea98/diff/usr/lib/mysql
/var/lib/docker/overlay2/4f71b050ff227dd296891c0ebd6210744dda330e0a03ec3ed2616c537809ea98/diff/var/lib/mysql
/var/lib/docker/overlay2/71fdf5f5044d7f7a1a6a31b44c1c201abe5ac8d681ee09bf66120a77225d2f66/diff/etc/mysql
/var/lib/mysql				# 删除
/var/lib/mysql/mysql		# 删除
/usr/bin/mysql				# 删除
/usr/lib64/mysql			# 删除
/usr/share/mysql			# 删除
/usr/local/mysql			# 删除
/opt/gitlab/embedded/lib/ruby/gems/3.1.0/gems/activerecord-7.0.8/lib/active_record/connection_adapters/mysql

一个一个删除上述要删除的目录

rm -rf /var/lib/mysql /var/lib/mysql/mysql /usr/bin/mysql /usr/lib64/mysql /usr/share/mysql /usr/local/mysql
rm -rf /etc/logrotate.d/mysql /etc/selinux/targeted/active/modules/100/mysql /etc/selinux/targeted/tmp/modules/100/mysql

!!有个目录要注意额外删除

# mysql配置信息所在的目录
rm -rf /etc/my.cnf

4、查询MySQL安装的组件服务,并删除

[root@localhost ~]# rpm -qa|grep -i mysql
mysql-community-server-5.7.44-1.el7.x86_64
mysql-community-common-5.7.44-1.el7.x86_64
mysql-community-client-5.7.44-1.el7.x86_64
mysql57-community-release-el7-10.noarch
mysql-community-libs-5.7.44-1.el7.x86_64

[root@localhost ~]# rpm -ev mysql-community-server-5.7.44-1.el7.x86_64
[root@localhost ~]# rpm -ev mysql-community-common-5.7.44-1.el7.x86_64
[root@localhost ~]# rpm -ev mysql-community-client-5.7.44-1.el7.x86_64
[root@localhost ~]# rpm -ev mysql57-community-release-el7-10.noarch
[root@localhost ~]# rpm -ev mysql-community-libs-5.7.44-1.el7.x86_64
# 若删除不了,改用如下命令
[root@localhost ~]# rpm -ev --nodeps mysql-community-server-5.7.44-1.el7.x86_64
[root@localhost ~]# rpm -ev --nodeps mysql-community-common-5.7.44-1.el7.x86_64
[root@localhost ~]# rpm -ev --nodeps mysql-community-client-5.7.44-1.el7.x86_64
[root@localhost ~]# rpm -ev --nodeps mysql57-community-release-el7-10.noarch
[root@localhost ~]# rpm -ev --nodeps mysql-community-libs-5.7.44-1.el7.x86_64

5、检查是否卸载干净

[root@localhost ~]# rpm -qa | grep -i mysql		# 无相关安装
[root@localhost ~]# systemctl start mysql
Failed to start mysql.service: Unit not found.	# 证明已卸载干净

下载安装MySQL

安装开发工具

[root@localhost ~]# yum -y groupinstall "Development tools"

安装相关依赖

[root@localhost ~]# yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel

下载MySQL

  • 官网:https://dev.mysql.com/downloads/repo/yum/
  • 默认安装位置:/Var/lib/mysql
[root@localhost ~]# wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm

安装MySQL

[root@localhost ~]# yum -y install mysql57-community-release-el7-10.noarch.rpm

安装MySQL服务器

[root@localhost ~]# yum install mysql-community-server --nogpgcheck

启动MySQL

[root@localhost ~]# systemctl start mysqld.service

查看MySQL状态

[root@localhost ~]# systemctl status mysqld.service
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2024-01-12 14:54:31 CST; 46min ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
 Main PID: 1772 (mysqld)
    Tasks: 28
   Memory: 1.0M
   CGroup: /system.slice/mysqld.service
           └─1772 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid

Jan 12 14:54:29 localhost.localdomain systemd[1]: Starting MySQL Server...
Jan 12 14:54:31 localhost.localdomain systemd[1]: Started MySQL Server.
[root@localhost ~]#

创建Django项目需要的数据库

查看默认密码

  • 默认密码:Ga>tCgH,q2vm
[root@localhost ~]# grep "password" /var/log/mysqld.log
2024-01-12T01:14:06.410100Z 1 [Note] A temporary password is generated for root@localhost: Ga>tCgH,q2vm

登录并更改默认密码

一共输入两个命令:

  • mysql -u root -pmysql -u root -p
  • ALTER USER 'root'@'localhost' IDENTIFIED BY '修改为自己的密码';
[root@localhost ~]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.44 MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '修改为自己的密码';
Query OK, 0 rows affected (0.02 sec)

mysql>

创建Django项目需要的数据库,并设置访问权限,退出

  • django_icwp_v3:数据库名称,修改为自己项目对应的
  • root:Django项目settings中,数据库连接配置中的username
  • 修改后的密码:自己刚才更改后的密码
mysql> create database django_icwp_v3 default charset=utf8;
mysql> grant all privileges on django_icwp_v3.* to 'root'@'%' identified by '修改后的密码';
mysql> grant all privileges on django_icwp_v3.* to 'root'@'localhost' identified by '修改后的密码';
mysql> flush privileges;
mysql> quit;
Bye
[root@localhost ~]#

测试连接,成功

image-20240112094634549

部署Django项目

环境准备

Python源码安装

安装版本:Python 3.8

安装相关依赖

[root@localhost ~]# yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel zlib* libffi-devel  -y

根目录下,下载安装包

[root@localhost ~]# cd ~
[root@localhost ~]# wget https://registry.npmmirror.com/-/binary/python/3.8.6/Python-3.8.6.tgz

解压缩,并进入解压后的目录

[root@localhost ~]# tar -xf Python-3.8.6.tgz
[root@localhost ~]# cd Python-3.8.6

配置编译和安装的路径,并进行编译和安装

[root@localhost ~]# ./configure --prefix=/usr/local/python38
[root@localhost ~]# make &&  make install

配置环境变量:建立软连接

[root@localhost ~]# ln -s /usr/local/python38/bin/python3 /usr/bin/python3.8
[root@localhost ~]# ln -s /usr/local/python38/bin/pip3 /usr/bin/pip3.8

云服务器各版本Python对应的命令

python版本pip命令解释
pythonpip2.7版本的命令
python3pip33.6版本的命令
python3.8pip3.83.8版本的命令

安装虚拟环境

virtualenv + virtualenvwrapper

更新pip

[root@localhost ~]# python3.8 -m pip install --upgrade pip
[root@localhost ~]# python3.8 -m pip install --upgrade setuptools
[root@localhost ~]# pip3.8 install pbr

安装虚拟环境

[root@localhost ~]# pip3.8 install virtualenv
[root@localhost ~]# pip3.8 install virtualenvwrapper

配置系统变量

[root@localhost ~]# ln -s /usr/local/python38/bin/virtualenv /usr/bin/virtualenv

配置虚拟环境

  • 进入文件
[root@localhost ~]# vim ~/.bash_profile
  • 文件末尾填入如下内容
VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3.8
source /usr/local/python38/bin/virtualenvwrapper.sh
  • 更新配置文件,使配置立刻生效
source ~/.bash_profile

为项目创建虚拟环境并安装相关库

创建虚拟环境:icwp

[root@localhost ~]# mkvirtualenv -p python3.8 icwp
......
(icwp) [root@localhost ~]# 

切换目录到项目requirement.txt所在目录下

(icwp) [root@localhost ~]#  cd /icwp/code/Django-ICWP/Django_ICWP_v3
(icwp) [root@localhost Django_ICWP_v3]# 

安装第三方库

(icwp) [root@localhost Django_ICWP_v3]# pip install -r ./requirements.txt

数据库迁移

执行步骤

保持上述目录、python环境不变

(icwp) [root@localhost Django_ICWP_v3]# python manage.py makemigrations
(icwp) [root@localhost Django_ICWP_v3]# python manage.py migrate

若有报错!!!

若提示报错:版本不匹配

......
  File "/root/.virtualenvs/icwp/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "/root/.virtualenvs/icwp/lib/python3.8/site-packages/django/db/backends/base/base.py", line 272, in connect
    self.init_connection_state()
  File "/root/.virtualenvs/icwp/lib/python3.8/site-packages/django/db/backends/mysql/base.py", line 257, in init_connection_state
    super().init_connection_state()
  File "/root/.virtualenvs/icwp/lib/python3.8/site-packages/django/db/backends/base/base.py", line 239, in init_connection_state
    self.check_database_version_supported()
  File "/root/.virtualenvs/icwp/lib/python3.8/site-packages/django/db/backends/base/base.py", line 214, in check_database_version_supported
    raise NotSupportedError(
django.db.utils.NotSupportedError: MySQL 8 or later is required (found 5.7.44).

解决方法1:重新安装mysql

解决方法2:Django源码中,禁止掉该检查代码

# 找到django的安装目录
[root@localhost Django_ICWP_v3]# workon icwp
(icwp) [root@localhost Django_ICWP_v3]# python
Python 3.8.6 (default, Jan 11 2024, 09:43:42)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> django
<module 'django' from '/root/.virtualenvs/icwp/lib/python3.8/site-packages/django/__init__.py'>
>>>

# 找寻文件:/root/.virtualenvs/icwp/lib/python3.8/site-packages/django/db/backends/base/base.py
# 注释掉:self.check_database_version_supported()这一行代码

image-20240112104110310

运行项目并测试访问

执行步骤

执行项目

(icwp) [root@localhost Django_ICWP_v3]# python manage.py runserver 0.0.0.0:8000

复制当前远程连接窗口,然后在新的窗口进行访问测试

 [root@localhost ~]# curl 192.168.93.128:8000
{"states": 0, "message": "INFO", "warning": "", "data": "请先完成用户登录,再访问其他页面"}  # 证明虚拟机访问正常

image-20240112104820394

# 本机浏览器访问:192.168.93.128:8000

image-20240112104936249

正常

上述方式是阻塞式运行,可以以后台运行的方式执行

(icwp) [root@localhost Django_ICWP_v3]# nohup python3 manage.py runserver 0.0.0.0:8000 &
[1] 31183
(icwp) [root@localhost Django_ICWP_v3]# nohup: ignoring input and appending output to ‘nohup.out’

关闭Django项目的运行

# 查找有关进程
ps -ef | grep manage.py

# 根据进程ID,删除:kill -9 进程ID

若有报错!!!

若无法访问,无外乎如下情况:

  • 虚拟机端口没有开放
  • Django项目settings.py仅允许本地访问了,没有放开权限

python虚拟环境退出、进入方式

(icwp) [root@localhost Django_ICWP_v3]# deactivate
[root@localhost Django_ICWP_v3]# workon icwp
(icwp) [root@localhost Django_ICWP_v3]#

通过uwsgi方式启动项目

安装uwsgi

项目虚拟环境中安装

[root@localhost ~]# workon icwp
(icwp) [root@localhost ~]# pip3 install uwsgi

默认环境安装与否暂时不管

# 在默认环境下安装uwsgi
pip3 install uwsgi

# 配置环境变量
ln -s /usr/local/python38/bin/uwsgi /usr/bin/uwsgi

配置方式1:配置uwsgi.ini启动项目

进入项目目录:manage.py所在的位置

(icwp) [root@localhost ~]# cd /icwp/code/Django-ICWP/Django_ICWP_v3/

创建配置文件uwsgi.ini

(icwp) [root@localhost Django_ICWP_v3]# vim ./uwsgi.ini

写入如下内容

  • 不要留注释,有可能会导致错误
[uwsgi]
socket=127.0.0.1:9999
chdir=/icwp/code/Django-ICWP/Django_ICWP_v3/
static-map=/static/=/icwp/code/Django-ICWP/Django_ICWP_v3/static
module=Django_ICWP_v3.wsgi
uid=root
gid=root
master=true
pidfile=uwsgi.pid
processes=8
threads=2
vacuum=true
daemonize=./icwp.log
thunder-lock=true
enable-threads=true
  • 各配置解释
key意义
socket与nginx交互时,设置socket传输方式的地址+端口;自定义,后续要与nginx中的配置一致
chdir项目目录:manage.py所在的目录
static-map=/static/静态资源所在位置:项目目录/static
module项目名.wsgi(即wsgi.py所在的文件夹的名字)
uidroot账户管理进程
gid
masterwsgi服务器的角色
pidfile存放uwsgi进程pid的文件
processes进程数
threads每个进程对应的线程数
vacuum当服务器退出的时候自动删除unix socket文件和pid文件
daemonize进程后台运行时,日志所打印的位置
thunder-lock
enable-threads

uwsgi启动项目

!!!!必须在虚拟环境下启动项目,或者说必须在拥有项目所需第三方库的环境+uwsgi环境下启动项目

!!!!若有任何的启动问题,查看日志即可,上述忠告,就是运行启动命令后无法访问,通过查阅日志解决的!!!

  • 启动命令
    • --ini 用于指定启动文件
    • --http 用于指定项目运行后,访问的地址,该参数可以放在.ini文件中配置
(icwp) [root@localhost Django_ICWP_v3]# uwsgi --http :8000 --ini uwsgi.ini
[uWSGI] getting INI configuration from uwsgi.ini
[uwsgi-static] added mapping for /static/ => /icwp/code/Django-ICWP/Django_ICWP_v3/static
  • 查看uwsgi状态
(icwp) [root@localhost Django_ICWP_v3]# ps aux |grep uwsgi
root       7495  1.7  1.0 435512 41576 ?        Sl   16:53   0:00 uwsgi --http :8000 --ini uwsgi.ini
root       7499  0.0  0.9 435512 36852 ?        Sl   16:53   0:00 uwsgi --http :8000 --ini uwsgi.ini
root       7500  0.0  0.9 435512 36856 ?        Sl   16:53   0:00 uwsgi --http :8000 --ini uwsgi.ini
root       7503  0.0  0.9 435512 36856 ?        Sl   16:53   0:00 uwsgi --http :8000 --ini uwsgi.ini
root       7505  0.0  0.9 435512 36856 ?        Sl   16:53   0:00 uwsgi --http :8000 --ini uwsgi.ini
root       7506  0.0  0.9 435512 36856 ?        Sl   16:53   0:00 uwsgi --http :8000 --ini uwsgi.ini
root       7508  0.0  0.9 435512 36856 ?        Sl   16:53   0:00 uwsgi --http :8000 --ini uwsgi.ini
root       7511  0.0  0.9 435512 36856 ?        Sl   16:53   0:00 uwsgi --http :8000 --ini uwsgi.ini
root       7513  0.0  0.9 435512 36856 ?        Sl   16:53   0:00 uwsgi --http :8000 --ini uwsgi.ini
root       7515  0.0  0.9 435512 36216 ?        S    16:53   0:00 uwsgi --http :8000 --ini uwsgi.ini
root       7522  0.0  0.0 112812   972 pts/0    S+   16:54   0:00 grep --color=auto uwsgi
  • 测试连接是否成功:虚拟机
(icwp) [root@localhost Django_ICWP_v3]# curl 192.168.93.128:8000
{"states": 0, "message": "INFO", "warning": "", "data": "请先完成用户登录,再访问其他页面"}
  • 测试连接是否成功:本机
浏览器输入:192.168.93.128:8000

有响应:{"states": 0, "message": "INFO", "warning": "", "data": "请先完成用户登录,再访问其他页面"}

响应是项目给出的,不同的项目响应不同

关闭uwsgi

看下一节

配置方式2:配置uwsgi.xml启动项目

后边再说

关闭uwsgi

查看uwsgi状态

(icwp) [root@localhost Django_ICWP_v3]# ps aux |grep uwsgi

关闭uwsgi:根据pid关闭

  • 命令1:关闭
  • 命令2:查看状态,没了
  • 命令3:访问项目,失败
(icwp) [root@localhost Django_ICWP_v3]# uwsgi --stop uwsgi.pid
(icwp) [root@localhost Django_ICWP_v3]# ps aux |grep uwsgi
root       7677  0.0  0.0 112812   972 pts/0    S+   16:59   0:00 grep --color=auto uwsgi
(icwp) [root@localhost Django_ICWP_v3]# curl 192.168.93.128:9000
curl: (7) Failed connect to 192.168.93.128:9000; Connection refused

关闭uwsgi:强制关闭

(icwp) [root@localhost Django_ICWP_v3]# killall -s INT uwsgi
  • 简单的kill -9 进程号,不会停止uwsgi,只会导致重启

部署Vue项目

安装nginx(源码安装)

安装

进入自建目录

[root@localhost ~]# mkdir /usr/local/nginx/
[root@localhost nginx]# cd /usr/local/nginx/

下载压缩包

[root@localhost nginx]# wget http://nginx.org/download/nginx-1.13.7.tar.gz

解压缩并进入解压缩后的目录

[root@localhost nginx]# tar -xf nginx-1.13.7.tar.gz
[root@localhost nginx]# cd nginx-1.13.7

指定安装路径,编译并安装

[root@localhost nginx-1.13.7]# ./configure --prefix=/usr/local/nginx
[root@localhost nginx-1.13.7]# make && make install

运行测试

启动

[root@localhost nginx-1.13.7]# nginx

查看状态

[root@localhost nginx-1.13.7]# netstat -nlp | grep nginx

测试连接

  • 虚拟机内部
[root@localhost nginx-1.13.7]# curl 192.168.93.128:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
  • 本机浏览器
浏览器输入内容,成功访问默认内容

关闭nginx

nginx -s stop

结合uwsgi编写nginx.conf配置文件

进入nginx.conf所在目录

[root@localhost ~]# cd /usr/local/nginx/conf

备份原配置文件

cp nginx.conf nginx.conf.bak

在原配置文件中,新增如下内容

[root@localhost nginx-1.13.7]# vim nginx.conf
server{
	listen 9000;
	server_name 192.168.93.128
	access_log /var/log/nginx/access.log main;
	charset utf-8;
	gzip on;
	gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json text/json image/jpeg image/gif image/png application/octet-stream;
	error_page 500 502 503 504  /50x.html;
	location /{
		include uwsgi_params;
		uwsgi_connect_timeout 30;
		uwsgi_pass 0.0.0.0:9999;
	}
}

即:访问虚拟机的9000端口,会将请求转发给uwsgi,由uwsgi提交给后端Django项目

部署Vue

编译Vue项目

1、修改前端向后端发送ajax请求的地址:从向本地发送,改为向服务器发送

baseURL = 192.168.93.128:9000

!!注意

前端工程中端口设置为9000,即前端向9000端口发送ajax请求,希望获取服务器响应,则9000端口需要与后端匹配。

即,在结合uwsgi配置nginx.conf文件的时候,listen设置为9000。即发到9000端口的请求,由uwsgi发送给后端

2、编译Vue项目

npm run build

3、上传文件到服务器并进行有关处理

  • 自建目录,存放vue的静态资源
[root@localhost ~]# mkdir /icwp/code/Vue-ICWP
[root@localhost ~]# cd /icwp/code/Vue-ICWP
  • 将dist文件夹放入上述目录,并将dist改名为html
[root@localhost ~]# mv dist html

配置nginx对Vue工程的代理

进入nginx.conf所在目录

[root@localhost ~]# cd /usr/local/nginx/conf

在原配置文件中,新增如下内容

[root@localhost nginx-1.13.7]# vim nginx.conf
server {
    listen 8081;
    server_name  192.168.93.128;
    charset utf-8;
    location / {
        root /icwp/code/Vue-ICWP/html/;
        index index.html;
        try_files $uri $uri/ /index.html;
    }
}

即:访问虚拟机的8081端口,会默认访问/icwp/code/Vue-ICWP/html/index.html,通过后缀的变化,访问该目录下的其他资源

最后:后端静态资源处理

静态文件收集

编辑Django工程的settings.py文件,对如下变量进行设置

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

静态文件收集

  • 建立静态文件放置的目录
[root@localhost ~]# mkdir /icwp/code/Django-ICWP/Django_ICWP_v3/static
  • 静态文件收集
[root@localhost ~]# cd /icwp/code/Django-ICWP/Django_ICWP_v3/
[root@localhost Django_ICWP_v3]# python manage.py collectstatic

修改nginx:增加静态资源映射

打开nginx配置文件

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

新增如下内容

location /static {
    alias /icwp/code/Django-ICWP/Django_ICWP_v3/static;
}

放置的位置:uwsgi有关配置的server里面

最终,uwsgi有关的完整配置如下:

server{
    	listen 9000;
    	server_name 192.168.93.128
    	access_log /var/log/nginx/access.log main;
    	charset utf-8;
    	gzip on;
    	gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json text/json image/jpeg image/gif image/png application/octet-stream;
    	error_page 500 502 503 504  /50x.html;
    	location /{
    		include uwsgi_params;
    		uwsgi_connect_timeout 30;
    		uwsgi_pass 0.0.0.0:9999;
    	}
    	location /static/{
    		alias /icwp/code/Django-ICWP/Django_ICWP_v3/static;
    	}
}

重启nginx

nginx -s reload

访问nginx代理Vue工程的地址,成功!

访问8081端口

192.168.93.128:8081

image-20240112231246251

输入注册好的账号密码,点击登录

成功登录,说明交互顺利,配置成功!

总结梳理

几个配置文件的最终内容

nginx.conf

位置:/usr/local/nginx/conf/nginx.conf

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
    server {
        listen 8081;
        server_name  192.168.93.128;
        charset utf-8;
        location / {
            root /icwp/code/Vue-ICWP/html/;
            index index.html;
            try_files $uri $uri/ /index.html;
        }
    }
    server{
    	listen 9000;
    	server_name 192.168.93.128
    	access_log /var/log/nginx/access.log main;
    	charset utf-8;
    	gzip on;
    	gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json text/json image/jpeg image/gif image/png application/octet-stream;
    	error_page 500 502 503 504  /50x.html;
    	location /{
    		include uwsgi_params;
    		uwsgi_connect_timeout 30;
    		uwsgi_pass 0.0.0.0:9999;
    	}
    	location /static/{
    		alias /icwp/code/Django-ICWP/Django_ICWP_v3/static;
    	}
    }
}

uwsgi.ini

位置:

[uwsgi]
socket=127.0.0.1:9999
chdir=/icwp/code/Django-ICWP/Django_ICWP_v3/
static-map=/static/=/icwp/code/Django-ICWP/Django_ICWP_v3/static
module=Django_ICWP_v3.wsgi
uid=root
gid=root
master=true
pidfile=uwsgi.pid
processes=8
threads=2
vacuum=true
daemonize=./icwp.log
thunder-lock=true
enable-threads=true

Vue静态资源

位置:/icwp/code/Vue-ICWP/html/

image-20240112204707165

Django静态资源

位置:/icwp/code/Django-ICWP/Django_ICWP_v3/static

image-20240112204648245

通信流程梳理

image-20240112221543851

本机电脑和虚拟机之间,通过网络桥接,可以实现通信。这里虚拟机的地址为:192.168.93.128

当在本机电脑上,访问192.168.93.128:80端口,确认是访问静态资源,通过nginx的代理,指向nginx的静态欢迎页面

当在本机电脑上,访问192.168.93.128:8081端口,确认是访问静态资源,通过nginx的代理,指向Vue项目的静态页面

在Vue的静态资源里面,发送Ajax请求:

  • ajax请求发送到192.168.93.128:9000端口

  • 确认是动态资源,nginx转发给uwsgi,并发送给django处理

  • 处理的结果再层层返回,相应到客户的浏览器上

当在本机电脑上,访问192.168.93.128:8080端口

  • uwsgi在启动django的时候 ,通过--http :8080参数,可以指定一个端口,访问django项目
  • 当访问到8080端口的时候,也能将请求提交给Django,由Django处理,并将结果返回(不知道图示是否准确?????)
    • 应该是不再经过nginx

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1379025.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是网络数据抓取?有什么好用的数据抓取工具?

一、什么是网络数据抓取 网络数据抓取&#xff08;Web Scraping&#xff09;是指采用技术手段从大量网页中提取结构化和非结构化信息&#xff0c;按照一定规则和筛选标准进行数据处理&#xff0c;并保存到结构化数据库中的过程。目前网络数据抓取采用的技术主要是对垂直搜索引…

FineBI实战项目一(22):各省份订单个数及订单总额分析开发

点击新建组件&#xff0c;创建各省份订单个数及订单总额组件。 选择自定义图表&#xff0c;将province拖拽到横轴&#xff0c;将cnt和total拖拽到纵轴。 调节纵轴的为指标并列。 修改横轴和纵轴的标题。 修改柱状图样式&#xff1a; 将组件拖拽到仪表板。 结果如下&#xff1a;…

Casper Network (CSPR)2024 年愿景:通过投资促进增长

Casper Network (CSPR&#xff09;是行业领先的 Layer-1 区块链网络之一&#xff0c;通过推出了一系列值得关注的技术改进和倡议&#xff0c;已经为 2024 年做好了准备。 在过去的一年里&#xff0c;Casper Network (CSPR&#xff09;不断取得里程碑式的进展&#xff0c;例如推…

鸿蒙Harmony--LocalStorage--页面级UI状态存储详解

走的太急疼的是脚&#xff0c;逼的太紧累的是心&#xff0c;很多时候&#xff0c;慢一点也没关系&#xff0c;多给自己一些耐心和等待&#xff0c;保持热爱&#xff0c;当下即是未来&#xff0c;生活自有安排! 目录 一&#xff0c;定义 二&#xff0c;LocalStorageProp定义 三…

网络安全全栈培训笔记(52-WEB攻防-通用漏洞弱口令安全社工字典生成服务协议web应用)

第52天 WEB攻防-通用漏洞&弱口令安全&社工字典生成&服务协议&web应用 知识点&#xff1a; 1、弱口令安全&配置&初始化等 2、弱口令对象&Web&服务&应用等 3、弱口令字典&查询&列表&列表等 #前置知识&#xff1a; 弱口令(weak…

conda环境下cannot write keep file问题解决

1 问题描述 conda环境下执行如下命令报错&#xff1a; pip install githttps://github.com/wenet-e2e/wenet.git 错误信息如下&#xff1a; (pt) PS D:\code\ptcontainer> pip install githttps://github.com/wenet-e2e/wenet.git Looking in indexes: http://pypi.doub…

CDH 6.3启动失败,由于日志写入权限原因导致cloudera-scm-server.log未生成

CDH 6.3启动失败&#xff0c;CM之前都能正常启动&#xff0c;服务器重启后&#xff0c;启动出现异常&#xff0c;需要排查具体错误&#xff0c;查看日志&#xff0c;发现日志cloudera-scm-server.log也未生成&#xff0c;不好定位具体原因。于是查看cloudera-scm-server状态&am…

【深度学习目标检测】十四、基于深度学习的血细胞计数系统-含GUI(BCD数据集,yolov8)

血细胞计数是医学上一种重要的检测手段&#xff0c;用于评估患者的健康状况&#xff0c;诊断疾病&#xff0c;以及监测治疗效果。而目标检测是一种计算机视觉技术&#xff0c;用于在图像中识别和定位特定的目标。在血细胞计数中&#xff0c;目标检测技术可以发挥重要作用。 首先…

Zabbix6.0全套落地方案-基于RHEL9系列源码编译安装-Linux+Nginx+Mysql+Redis生产级模板及Agent2客户端一键部署

实践说明&#xff1a;基于RHEL9系列(CentOS9,AlmaLinux9,RockyLinux9等)&#xff0c;但适用场景不限于此&#xff0c;客户端一键部署安装包基于RHEL8和RHEL9。 文档形成时期&#xff1a;2023年 因系统或软件版本不同&#xff0c;构建部署可能略有差异&#xff0c;但本文未做细分…

XYplorer:双栏多标签文件资源管理器的高效选择

在文件管理的世界中&#xff0c;效率和便捷性是用户追求的关键。XYplorer作为一款专为Windows设计的文件资源管理器&#xff0c;以其独特的双栏多标签浏览、强大的文件搜索功能、以及高度可定制的界面&#xff0c;为用户提供了一种全新的文件管理体验。 XYplorer&#xff1a;速…

Android 12.0 系统开启和关闭黑白模式主题功能

1.概述 在12.0的rom系统开发定制化中,在系统SystemUI的下拉状态栏中,产品开发功能需求要求添加黑白模式功能开关的功能,就是打开黑白模式,系统颜色就会变成黑白颜色, 关闭黑白模式开关系统就会变成彩色模式,所以就需要了解下系统是怎么设置黑白模式和彩色模式的,然后添…

Spark Doris Connector 可以支持通过 Spark 读取 Doris 数据类型不兼容报错解决

1、版本介绍&#xff1a; doris版本&#xff1a; 1.2.8Spark Connector for Apache Doris 版本&#xff1a; spark-doris-connector-3.3_2.12-1.3.0.jar:1.3.0-SNAPSHOTspark版本&#xff1a;spark-3.3.1 2、Spark Doris Connector Spark Doris Connector - Apache Doris 目…

第11章 2 文件和io操作

很奇怪&#xff0c;只有先写了列表&#xff0c;在遍历file 才有打印 若文件原来就有内容&#xff0c;w open 完之后&#xff0c;文件内容就被清空了 open操作若不指定打开模式&#xff0c;默认打开模式是r 文本打开时&#xff0c;是按照字符串

旅游数据可视化大屏:一屏掌控,畅游数据之海

随着旅游业的蓬勃发展&#xff0c;如何有效地管理和分析旅游数据成为行业关注的焦点。旅游数据可视化大屏作为一种新兴的技术手段&#xff0c;为旅游业带来了前所未有的机遇和挑战。 旅游数据可视化大屏集成了丰富的数据资源&#xff0c;通过直观的图表、图像和交互界面&#x…

本地部署 gemini-openai-proxy,使用 Google Gemini 实现 Openai API

本地部署 gemini-openai-proxy&#xff0c;使用Google Gemini 实现 Openai API 0. 背景1. 申请 Google Gemini API key2. (Optional)Google Gemini 模型说明3. gemini-openai-proxy Github 地址4. 本地部署 gemini-openai-proxy5. 测试 0. 背景 使用 Google Gemini 实现 Opena…

zookeeper下载安装部署

zookeeper是一个为分布式应用提供一致性服务的软件&#xff0c;它是开源的Hadoop项目的一个子项目&#xff0c;并根据google发表的一篇论文来实现的。zookeeper为分布式系统提供了高效且易于使用的协同服务&#xff0c;它可以为分布式应用提供相当多的服务&#xff0c;诸如统一…

详细分析Java中的@Transactional注解

目录 前言1. 基本知识2. 常用属性3. Demo4. 总结 前言 Transactional 是 Spring 框架中用于管理事务的注解。 该注解来源于Spring&#xff0c;对于Spring的基础知识可看我之前的文章&#xff1a; Spring框架从入门到学精&#xff08;全&#xff09; 该注解也可用在xxl-job框架…

基于Hadoop的网上购物行为大数据分析及预测系统【flask+echarts+机器学习】前后端交互

有需要本项目或者部署的系统可以私信博主&#xff0c;提供远程部署和讲解 本研究基于淘宝用户行为的开源数据展开大数据分析研究&#xff0c;通过Hadoop大数据分析平台对阿里天池公开的开源数据集进行多维度的用户行为分析&#xff0c;为电商销售提供可行性决策。 首先我们将大…

完全卸载grafana

先停掉grafana sudo systemctl stop grafana-server 查看要卸载的包的名字 yum list installed yum remove grafana-enterprise.x86_64 成功 删除grafana的数据目录 sudo rm -rf /etc/grafana/sudo rm -rf /usr/share/grafana/sudo rm -rf /var/lib/grafana/

Webhook端口中的自定义签名身份认证

概述 如果需要通过 Webhook 端口从交易伙伴处接收数据&#xff0c;但该交易伙伴可能对于安全性有着较高的要求&#xff0c;而不仅仅是用于验证入站 Webhook 要求的基本身份验证用户名/密码&#xff0c;或者用户可能只想在入站 Webhook 消息上增加额外的安全层。 使用 Webhook…