在开发过程中,项目从本地开发环境迁移到服务器是一个关键且常见的步骤,尤其是对初学者来说,过程中可能会遇到各种技术性挑战和复杂问题。这篇博客旨在提供一份详细的部署教程,帮助大家顺利完成项目在服务器上的部署。不仅适合刚刚起步的开发者,也为有经验的技术人员提供一些新的思路和操作技巧。此外,作为一种记录,将来也可以通过这篇博客,快速回顾并参考关键步骤。
本博客将涵盖从项目配置到服务器管理,以及域名绑定等核心内容,结构清晰且步骤详尽,确保读者能够快速掌握部署的各项要点。
1. 项目
1.1 项目简介
本文所使用的项目案例是基于 Python Django 框架开发的前后端不分离项目。虽然不对项目具体业务进行说明,但会详细讲解项目部署的每个步骤,确保读者能够按照教程完成类似项目的部署。
1.2 本地开发环境的配置
在我们能够在本地或 IDE(例如 PyCharm)中正常运行项目时,项目实际是依赖于多个库和软件包的。这些依赖确保了项目在当前环境中能够正确运行。
以 PyCharm 为例,如果我们想查看项目依赖的所有库和包,可以通过打开终端并执行以下命令来获取依赖列表:
pip freeze
此命令将列出当前 Python 环境中所有安装的依赖项。为了方便在不同环境下部署项目或确保项目依赖的一致性,我们可以将这些依赖项保存到一个文件中,方便后续安装。可以使用以下命令将依赖打包到一个
requirements.txt
文件中:
pip freeze > requirements.txt
执行该命令后,项目的目录中会生成一个名为
requirements.txt
的文件,文件内容包含所有的依赖包及其版本信息。在服务器或其他环境中,只需使用该文件来安装项目的所有依赖,确保环境一致性。
1.3 项目代码准备
在项目部署到服务器之前,确保本地项目已经做好版本控制,并且代码已经推送到远程代码仓库(如 GitHub、GitLab 或者自建 Git 仓库)。以下是项目代码准备的步骤:
1.3.1 git安装
在项目部署之前,我们首先需要在本地安装了 Git,这是一个常用的分布式版本控制系统,能够帮助我们更好地管理项目的代码版本。在不同的操作系统下,Git 的安装方式略有不同。以下是常见平台上的 Git 安装方法:
1.3.1.1 在 Windows 上安装 Git
1.访问Git并下载适用于 Windows 的最新版本。
2.下载完成后,运行安装程序,按照提示进行安装。
在安装过程中,可以保留默认设置。重要的是确保勾选 "Git Bash Here" 选项,这样可以直接在任意文件夹中通过右键菜单打开 Git Bash。3.安装完成后,右键点击桌面或任意文件夹,选择 Git Bash Here,打开一个命令行窗口,然后输入以下命令来验证安装:
git --version
如果显示 Git 的版本号,说明 Git 已成功安装。
1.3.1.2 在 macOS 上安装 Git
在 macOS 上,可以通过以下几种方式安装 Git:
1. 通过 Homebrew 安装:如果你已经安装了 Homebrew,直接在终端中运行以下命令即可安装 Git:
brew install git
2. 通过 Xcode 命令行工具安装:你可以打开终端并输入以下命令安装 Git:
xcode-select --install
3. 验证安装是否成功:
git --version
1.3.1.3 在 Linux 上安装 Git
Git 在大多数 Linux 发行版中已经有了官方的包管理工具,可以直接通过包管理器安装。以下是常见的 Linux 发行版安装 Git 的命令:
Debian/Ubuntu 系列:
sudo apt update sudo apt install git
CentOS/Fedora 系列:
sudo yum install git
验证安装是否成功:
git --version
1.3.1.4 配置 Git
安装 Git 之后,你需要对 Git 进行基本配置,主要是设置用户名和邮箱,以便每次提交时记录提交者的信息。使用以下命令进行配置:
git config --global user.name "Your Name" git config --global user.email "youremail@example.com"
这些配置完成后,你就可以使用 Git 来管理你的项目代码了。
1.3.2 配置本地git
在完成 Git 的安装后,我们需要将本地项目与 Git 连接,便于进行版本控制和后续的代码管理。这一部分将指导如何将本地项目初始化为 Git 仓库,并准备上传到远程仓库。
1.3.2.1 将项目初始化为Git仓库
要开始使用 Git 管理你的项目,首先需要将现有项目目录初始化为 Git 仓库。以下是具体步骤:
1. 进入项目目录:首先打开Pycharm终端或 Git Bash,并导航到你希望使用 Git 管理的项目目录。你可以使用cd命令进入你的项目文件夹。例如:
cd /path/to/your/project
以我的项目为例,打开Git Bash,输入以上命令:
2. 初始化 Git 仓库:在项目的根目录下,运行以下命令将当前项目目录初始化为一个 Git 仓库:
git init
执行这个命令后,会在项目目录下生成一个隐藏的
.git
文件夹,表示该目录已经被初始化为 Git 仓库。我们可以通过以下命令来查看:ls -a
3. 检查初始化结果:你可以运行以下命令检查 Git 仓库是否已经成功初始化:
git status
如果初始化成功,你会看到提示 “On branch master” 或 “On branch main”,并且提示没有文件被跟踪(untracked files)。
1.3.2.2 创建远程仓库(gitee)
首先我们浏览器搜索gitee,进入官网,如果没有注册账号可以先去注册账号,然后点击右上角的加号,选择新建仓库
点击完后,填入你的仓库名称,比如说我就习惯写项目名
创建完成之后,我们会看到仓库原始的界面,上面会有一些指令教我们如何部署
由于我们上面已经设置过了全局变量并且初始化了仓库,所以我们后续只需要将本地项目上传到Git上即可,但是在上传之前,我们需要在本地项目做一些配置
1.3.2.3 配置
在进行代码上传前,有必要对项目中可能包含的敏感数据进行筛选,以防止这些信息被误上传到远程仓库。为此,Git 提供了
.gitignore
文件的功能,允许开发者指定哪些文件或文件夹不应被 Git 追踪或提交。首先,确保在项目根目录下创建一个名为
.gitignore
的文件。在该文件中,您可以列出所有需要忽略的文件或文件夹,这些文件将不会被上传到 Git 仓库。常见的敏感文件包括:数据库配置文件、环境变量配置文件(如.env
)、日志文件、开发环境生成的临时文件(如.pyc
,.DS_Store
)
.gitignore
的规则相对灵活,开发者可以根据项目需要进行定制。标准的.gitignore
文件模板可以通过网络资源获取,或者根据项目的实际情况进行修改。
.gitignore:
# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover *.py,cover .hypothesis/ .pytest_cache/ cover/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 db.sqlite3-journal # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder .pybuilder/ target/ # Jupyter Notebook .ipynb_checkpoints # IPython profile_default/ ipython_config.py # pyenv # For a library or package, you might want to ignore these files since the code is # intended to run in multiple environments; otherwise, check them in: # .python-version # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. # However, in case of collaboration, if having platform-specific dependencies or dependencies # having no cross-platform support, pipenv may install dependencies that don't work, or not # install all needed dependencies. #Pipfile.lock # poetry # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. # This is especially recommended for binary packages to ensure reproducibility, and is more # commonly ignored for libraries. # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control #poetry.lock # pdm # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. #pdm.lock # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it # in version control. # https://pdm.fming.dev/latest/usage/project/#working-with-version-control .pdm.toml .pdm-python .pdm-build/ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm __pypackages__/ # Celery stuff celerybeat-schedule celerybeat.pid # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ .dmypy.json dmypy.json # Pyre type checker .pyre/ # pytype static type analyzer .pytype/ # Cython debug symbols cython_debug/ # PyCharm # JetBrains specific template is maintained in a separate JetBrains.gitignore that can # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. .idea/ .DS_Store */migrations/*.py !*/migrations/__init__.py
除了配置
.gitignore
文件之外,还需要对项目的配置文件进行适当修改。以 Django 项目为例,在settings.py
文件中,DEBUG=True
是用于本地开发和测试的设置,而在生产环境中,为了安全性和性能考虑,必须将其修改为DEBUG=False
。此外,为了更好地管理环境间的配置差异,我们建议在项目中引入
local_settings.py
文件,用于覆盖或补充settings.py
中的某些配置。比如,在local_settings.py
中,可以根据实际的部署环境来修改数据库(如 MySQL)、缓存系统(如 Redis)等的配置信息。通过这种方式,可以实现本地开发和生产环境的配置隔离,确保项目能够在不同环境下稳定运行。
local_settings.py:
ALLOWED_HOSTS = ["*"] # 允许访问的主机,*代表所有,也可以写指定的ip地址 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'day06', 'USER': 'root', 'PASSWORD': '123456', 'HOST': '127.0.0.1', 'PORT': '3306', } } # cache缓存 CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379/1", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "CONNECTION_POOL_KWARGS": {"max_connections": 100}, "PASSWORD": "123456", } } } DEBUG = False # 将测试环境修改为为False
当这些都做好了之后,我们就可以正式将代码上传到仓库啦。
1.3.3 Git 上传
当上述步骤全部做好后,我们可以选择用Pycharm终端或者Git Bash,进入到项目目录后,按以下步骤执行操作:
项目已经初始化为一个 Git 仓库。可以使用以下命令初始化 Git 仓库并设置远程仓库:
git init git remote add origin https://your-repository-url.git
origin后面的网址,是你远程仓库的地址,我们可以在gitee上面查看:
1. 添加所有更改到暂存区:
git add .
. 表示当前目录下的所有文件,也可以选择添加指定文件
git add your_file
2. 提交更改:
git commit -m "first commit"
-m后面是提交版本的描述信息
3. 推送代码到远程仓库:
git push -u origin master
当我们执行完以上命令后,用Git Bash进入我们的项目时,项目名后面会有一个(master)的提示,说明该项目正处于master。
当然,当我们进入gitee,这个时候发现刚创建时的界面以及指令都没有了。
后续如果想远程登录仓库的话,我们可以点击克隆/下载,可以选择https或ssh方式远程我们的仓库。
1.3.3.1 配置密码或密钥
但是每次登录时,都会遇到一个问题:在本地提交代码时,每次都需要输入密码;而在服务器上拉取代码时,同样需要输入密码。虽然可以通过设置固定的用户名和密码来解决这一问题,例如:
git remote remove origin git remote add origin https://用户名:密码@gitee.com/wupeiqi/xxxxx.git
然而,这种方法并不是最优雅的方式,尤其是在密码管理和安全性方面。相比之下,我更推荐使用 SSH 密钥来实现免密登录,它不仅更加安全,而且操作方便。那么如何通过 SSH 密钥实现免密登录呢?让我们继续往下看。
首先,我们可以在Git Bash中使用ssh-keygen命令,生成一对秘钥(公钥和私钥)
ssh-keygen -t rsa
输入指令后,一直按回车即可。
执行后,会在~/.ssh目录下生成两个文本,分别是id_rsa(密钥)和id_rsa.pub(公钥)
我们可以使用以下命令查看:
ls ~/.ssh/
此时,我们会在~/.ssh目录下看到该文本
我们要做的,就是将生成的公钥内容上传到gitee
执行以下命令
cat ~/.ssh/id_rsa.pub
将看到的内容复制,然后在gitee中点击头像,选择设置
点击SSH公钥,将复制的公钥内容粘贴进去,点击确定就好了
之后,我们在远程仓库或者拉仓库代码的时候,不再需要密码登录了。
2. 服务器
2.1 服务器购买与选择
在部署项目时,选择合适的服务器至关重要。市面上常见的云服务平台有阿里云、腾讯云等,这些平台提供了丰富的服务器配置选项,能够满足不同项目的需求。在购买服务器时,以下几个关键点需要重点考虑:
CPU:对于中小型项目,1~2 核的 CPU 基本够用。但如果项目有复杂的业务逻辑、数据处理需求或者有较多的用户请求,可以选择 4 核或更高的配置。
内存:内存影响服务器的并发处理能力。一般来说,2GB 内存可以满足普通网站项目的需求,4GB 或更高则适合数据库操作频繁或多任务处理的应用。
带宽:带宽直接影响到网站的访问速度和负载能力。如果是初期阶段的项目,1~3 Mbps 的带宽是足够的。如果项目的访问量较大,可以考虑更高的带宽以确保稳定性。
存储:普通项目可以选择 40GB 的硬盘空间,若项目涉及大量文件存储或数据库数据,可以选择更大的存储空间,甚至使用云盘服务以方便扩展。
在选择服务器时,还需要根据实际需求考虑地理位置、稳定性、售后服务等因素。这些都可以在购买过程中根据云平台的推荐配置进行调整。
以腾讯云为例,浏览器搜索腾讯云,然后点击产品,选择云服务器或者轻量级服务器,看个人选择
进入之后,点击选购,可以快速配置,也可以根据自身需求自定义配置,以快速配置为例,操作系统一般选Linux CentOS的版本,购买成功之后,我们可以进入控制台查看自己的服务器,点击右上角的控制台,选择自己购买的服务器类型,比如云服务器MVC或者轻量级服务器
点进去之后,我们能看到自己服务器的相关信息,包括服器IP地址等等。
2.2 系统环境与安全配置
在服务器购买后,下一步就是配置操作系统和进行基础的安全设置。选择适合的操作系统以及进行安全配置至关重要,它直接影响服务器的稳定性和安全性。
2.2.1 服务器登录
2.2.1.1 服务器密码登录
当我们服务器购买成功之后,如果想要登录服务器的话,由于购买服务器之后的账号密码都是初始值,所以我们得去站内信查看自己的账号和密码,账号一般都是root,密码则是一段长文。
以上就是我们登录服务器之后的样子啦。
当然,在登陆之前,我们也可以选择先重置密码,点击登录右边的三个点,选择重置密码
点击之后,填入新密码,点击确定即可
这个时候我们再登录,就可以用修改之后的密码啦。
2.2.1.2 服务器密钥登录
在许多情况下,我们并不经常使用腾讯云的控制台手动登录服务器,而是通过 SSH 进行远程连接。这种方式更加高效,特别是在需要频繁操作时。
在我们的Git Bash中,要通过 SSH 远程连接到服务器,我们可以使用以下命令:
ssh root@your_server_ip
其中,
root
是您的账户名,your_server_ip
是服务器的 IP 地址。输入命令后,系统会提示您输入服务器的密码,输入正确的密码后即可登录。回车填写服务器密码即可登录到服务器了。
这样就算登录成功了。但是我们会发现一个小小的问题,那就是,我们每次远程登录的时候,都需要输入密码,这样显得很麻烦,所以我们也想要和Git一样进行免密登录,那该怎么做呢?,接下来,我们需要在服务器端输入exit,退出到本地的环境当中。
服务器配置免密登录实质上和Git是一摸一样的,由于上述配置Git,已经生成了密钥,所以我们只需要将本地的公钥上传到服务器,即可进行免密登录了。我们只需要在本地执行以下命令即可
ssh-copy-id -i ~/.ssh/id_rsa.pub root@your_server_ip
那么以后再想要登录远程服务器,就不需要再输入账户和密码了,直接输入:
ssh root@your_server_ip
2.2.2 项目部署
在完成服务器的基础配置后,接下来便是将项目部署到服务器上。项目部署一般分为以下几个步骤:获取项目代码、安装运行环境、配置项目、数据库设置、启动应用等。这里以 Python 的 Django 框架为例,介绍如何进行项目部署。
2.2.2.1 获取项目代码
首先,我们需要登录到服务器,然后通过以下命令安装git
ssh root@your_server_ip yum install git -y
安装好git之后,我们可以创建一个文件夹,将项目放入文件夹内,方便管理。例如:
cd / mkdir data cd /data
进入data文件夹后,执行以下命令将仓库中的项目代码拉到服务器:
git clone https://your-repository-url.git
2.2.2.2 安装运行环境
首先需要在服务器上安装项目所需的依赖环境,例如 Python、数据库等。
1.安装MariaDB
首先,需要为 MariaDB 设置源文件,以确保安装最新版本。默认情况下,系统不会安装最新的 MariaDB,因此需要手动指定源文件。
首先在/etc/yum.repos.d/下创建mariadb.repo文件,文件内容如下:
# MariaDB 10.11 CentOS repository list - created 2024-02-26 08:25 UTC # https://mariadb.org/download/ [mariadb] name = MariaDB # rpm.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details. # baseurl = https://rpm.mariadb.org/10.11/centos/$releasever/$basearch baseurl = https://mirrors.neusoft.edu.cn/mariadb/yum/10.11/centos/$releasever/$basearch module_hotfixes = 1 # gpgkey = https://rpm.mariadb.org/RPM-GPG-KEY-MariaDB gpgkey = https://mirrors.neusoft.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB gpgcheck = 1
创建文件命令如下:
vim /etc/yum.repos.d/mariadb.repo
按 i 键进入编辑模式,按 Shift+Ins 粘贴进去,然后按ESC退出编辑模式,最后按 :wq 保存并退出。当配置好了源文件之后,就可以安装指定版本的mariadb了。
- 安装服务端
yum install mariadb-server -y
- 安装客户端
yum install mariadb -y
安装完成之后,我们需要启动mariadb,检查是否按安装成功
systemctl start mariadb systemctl stop mariadb
当然,每次启动都很麻烦,可以将mariadb设置成开机自启
systemctl enable mariadb
为了确保数据库的安全性,建议不使用默认的 root 用户,而是创建一个新的数据库用户并配置相应的权限,首先进入 root 用户。
mysql -u root -p
进入之后,不需要输入密码,一直按回车
之后,给root设置密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
其中,your_password是你要修改的密码。
刷新权限
FLUSH PRIVILEGES;
修改完密码之后,就该为该项目创建一个新用户了。
CREATE USER '新用户名'@'%' IDENTIFIED BY '新密码';
创建数据库:
CREATE DATABASE 数据库名 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
授予权限:
GRANT ALL PRIVILEGES ON 数据库名.* TO '新用户名'@'%';
刷新权限:
FLUSH PRIVILEGES;
完成以上步骤后,您可以使用新用户登录数据库,检查并创建相应的数据库。
登录用户数据库
mysql -u 用户名 -p
创建数据库
CREATE DATABASE 数据库名 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
配置django数据库连接:进入项目的settings.py和local-settings.py文件中,修改数据库配置部分:
vim /data/your_project/settings.py
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 如果使用 MySQL 'NAME': 'myproject', # 数据库名 'USER': 'myuser', # 用户名 'PASSWORD': 'mypassword', # 密码 'HOST': 'localhost', 'PORT': '3306', } }
最后,操作完成之后记得别忘了退出哟~
exit
以上步骤将确保您在服务器上成功安装并配置 MariaDB 数据库,为 Django 项目的运行提供必要的支持。
2. 安装Redis
在某些情况下,MySQL 可能无法满足项目对性能和高并发的要求。这时,我们可以选择使用 Redis,这是一种高效的内存数据库,适用于对数据访问速度有极高要求的场景。
Redis的优点:
1. 高性能:Redis 是一个基于内存的数据库,读写速度极快,通常可达到每秒数十万次请求。
2. 高并发:支持多种数据结构,如字符串、哈希、列表、集合等,适合处理高并发请求。
3. 持久化:虽然 Redis 是内存数据库,但它提供了持久化机制,可以将内存中的数据定期保存到 磁盘,保证数据安全。
4. 分布式:支持主从复制和分片,可以轻松扩展以处理更大的数据量和更高的负载。下载Redis
yum install redis -y
配置redis
进入redis.conf文档,设置redis的登录密码
vim vim /etc/redis.conf ?requirepass 找到requirepass该行,将注释去掉,然后再requirepass后加上redis的登录密码 # 例如 """ requirepass 123456 表明123456就是redis的登录密码 """
配置完成之后,即可启动并设置开机自启动
systemctl start redis systemctl enable redis
3. 安装Python
在完成 MySQL 和 Redis 的安装之后,接下来需要安装 Python,以确保项目能够顺利运行。以下是安装 Python 的详细步骤。
Python 的解释器是用 C 语言编写的,因此在安装 Python 源码之前,需要先安装 GCC 编译器:
yum install gcc -y
安装 Python 之前,需要确保安装一些必要的依赖库。这些库将支持 Python 的构建和运行。可以使用以下命令安装:
yum install zlib zlib-devel -y yum install bzip2 bzip2-devel -y yum install ncurses ncurses-devel -y yum install readline readline-devel -y yum install openssl openssl-devel -y yum install xz lzma xz-devel -y yum install sqlite sqlite-devel -y yum install gdbm gdbm-devel -y yum install tk tk-devel -y yum install mysql-devel -y yum install python-devel -y yum install libffi-devel -y
下载Python源码,以Python3.9.5为例
cd /data/ wget https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tgz
安装之后进行解压:
tar -xvf Python-3.9.5.tgz
进入目录并编译安装
cd Python-3.9.5 ./configure make all make install
安装完成之后,我们可以测试一下Python是否安装成功
python3 --version
4. 安装虚拟环境
在开发不同的项目时,常常需要依赖不同的库和版本。为了避免依赖冲突和混乱,我们可以使用虚拟环境来隔离这些依赖。以下是安装和配置虚拟环境的步骤。
首先,确保安装了
virtualenv
工具。如果未安装,可以使用以下命令进行安装:pip3.9 install virtualenv
为了方便管理虚拟环境,我们可以在服务器上创建一个专门的目录来存放所有的虚拟环境,在
/envs
目录下创建一个新的虚拟环境,指定使用的 Python 版本:mkdir /envs virtualenv /envs/your_project --python=python3.9
接下来,进入你的项目目录并根据
requirements.txt
文件安装所需的依赖包:source /envs/your_project/bin/activate # 激活虚拟环境 cd /data/your_project/ pip install -r requirements.txt
当你的最左边出现你的项目名时,说明虚拟环境激活成功
5. 配置
local_settings.py设置线上配置
import os from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent.parent DEBUG = False ALLOWED_HOSTS = ['*'] STATIC_ROOT = os.path.join(BASE_DIR,"allstatic") DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'database_name', # 数据库名字 'USER': user, # 用户名 'PASSWORD': password, # 密码 'HOST': '127.0.0.1', # ip 'PORT': 3306, } } CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "CONNECTION_POOL_KWARGS": {"max_connections": 100}, "PASSWORD": "qwe123456", } } }
为了后续方便配置web服务器,所以应该收集该项目的一些静态文件
python manage.py collectstatic
执行该命令之后,会在项目目录下生成一个collectstatic的文件夹,里面收集了项目的静态文件
2.2.2.3 配置web服务器
在生产环境中,通常不会直接使用 Django 自带的开发服务器。相反,通常会使用如 uwsgi、Nginx、Apache 这样的 Web 服务器来处理客户端请求,并将其反向代理到应用服务器。
1. uwsgi
首先,激活虚拟环境并安装 uWSGI,用于管理项目的运行
source /envs/your_project/bin/activate pip install uwsgi
基于uwsgi运行项目
你可以通过命令行直接启动 uWSGI 运行 Django 项目:
uwsgi --http :80 --chdir /data/project/your_project/ --wsgi-file your_project/wsgi.py --master --processes 4 --static-map /static=/data/project/allstatic
为简化启动操作,也可以创建
your_project_uwsgi.ini
配置文件,包含 uWSGI 的详细参数:[uwsgi] http = 0.0.0.0:80 chdir = /data/project/your_project/ wsgi-file = your_project/wsgi.py processes = 4 static-map = /static=/data/project/allstatic virtualenv = /envs/your_project/
使用以下命令执行配置文件:
uwsgi --ini your_project_uwsgi.ini
2. nginx
Nginx 是一个高性能的 Web 服务器,通常用于处理静态文件,并将动态请求转发给 uWSGI 等应用服务器。
安装 Nginx
yum install nginx -y
修改 Nginx 的主配置文件
nginx.conf
,添加反向代理的配置:user nginx; 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 4096; 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 127.0.0.1:8001; } server { listen 80; listen [::]:80; server_name _; # Load configuration files for the default server block. # include /etc/nginx/default.d/*.conf; location /static { alias /data/project/allstatic/; } location / { uwsgi_pass django; include uwsgi_params; } } }
修改uwsgi配置(day06_uwsgi):
[uwsgi] socket = 127.0.0.1:9000 chdir = /data/www/xxxxx/ wsgi-file = day06/wsgi.py processes = 4 virtualenv = /envs/video_killer/
接下来就需要启动uwsgi和nginx:
# 启动 systemctl start nginx # 开机启动 systemctl enable nginx uwsgi --ini day06_uwsgi.ini
为了简化每次手动启动 uWSGI 的步骤,你可以编写一个 Shell 脚本来自动化启动和停止操作.
在项目目录下创建一个shell文件夹并进入
mkdir /data/project/your_project/shell cd /data/project/your_project/shell
创建一个脚本reboot.sh和stop.sh
touch /data/project/your_project/shell/reboot.sh touch /data/project/your_project/shell/stop.sh
在项目的
shell
目录下创建reboot.sh
脚本,用于重启 uWSGI:#!/usr/bin/env bash echo -e "\033[34m--------------------wsgi process--------------------\033[0m" ps -ef|grep uwsgi_your_project.ini | grep -v grep sleep 0.5 echo -e '\n--------------------going to close--------------------' ps -ef |grep uwsgi_project.ini | grep -v grep | awk '{print $2}' | xargs kill -9 sleep 0.5 echo -e '\n----------check if the kill action is correct----------' /envs/project/bin/uwsgi --ini uwsgi_project.ini & >/dev/null echo -e '\n\033[42;1m----------------------started...----------------------\033[0m' sleep 1 ps -ef |grep uwsgi_project.ini | grep -v grep
更改权限
chmod 755 reboot.sh ./reboot.sh # 执行脚本
同样,在shell
目录下创建stop.sh
脚本用于停止 uWSGI:#!/usr/bin/env bash echo -e "\033[34m--------------------wsgi process--------------------\033[0m" ps -ef |grep uwsgi_your_project.ini | grep -v grep sleep 0.5 echo -e '\n--------------------going to close--------------------' ps -ef |grep uwsgi_your_project.ini | grep -v grep | awk '{print $2}' | xargs kill -9 sleep 0.5
再次更改uwsgi_your_project.ini:
[uwsgi] socket = 127.0.0.1:8001 chdir = /data/project/your_project/ wsgi-file = your_project/wsgi.py processes = 1 virtualenv = /envs/your_project/
至此,我们的服务器部署就完成啦,我们只需要执行reboot.sh文件,即可启动并在浏览器上访问项目了
此时,在浏览器输入服务器的ip,即可访问项目网站啦。
3.域名
当我们每次想在浏览器上访问自己的网站时,服务器ip太长,不好记,那咋办?这个时候,我们可以通过购买域名来进行访问。此时访问,只需要在浏览器地址栏通过输入所购买的域名即可访问。
3.1 域名购买与解析
3.1.1 域名购买(阿里云)
浏览器搜索阿里云域名,进入网站并登录后,可以选择自己想要或喜欢的域名.
购买成功后,我们进入右上角的控制台。点击列表项,选择域名。
进入域名列表之后,我们就可以看到自己所购买的域名啦。
3.1.2 域名解析
当我们购买域名之后,我们并不能直接通过域名进行访问,而是还要通过解析域名,才能够正确重定向到服务器。
进入域名列表之后,我们可以点击解析,进入此页面
因为我之前配置过,所以这里有记录,如果没有记录,也可以选择点击上面的添加记录。
点击确定之后,我们可以点击生效检测进行检查域名是否生效。注意,有的时候是没有那么快生效的,这都是正常的。
然而,过一段时间之后,发现自己的网站用域名登录不了,显示这样的画面。
这是正常的,不必担心,我们只需要在腾讯云备案就行了。备案得满足一些要求,例如,所租的服务器必须要满3个月及以上才可以备案。在阿里云购买服务器并实名认证之后,实名的认证信息是不会立即上传到工信部的后台,所以刚购买完域名之后,需要至少等3个工作日之后才可以备案(本人就是由于购买未满三天,所以暂时还访问不了哟)。
3.1.3 腾讯云备案
进入腾讯云,在搜索栏搜索ICP备案。
进入之后,点击开始备案,然后按照要求和提示备案即可。当备案申请发送成功后,后续会有工信部核验相关工作人员致电本人核对信息。
部分工信部核验手机号码:
0755-3289-93990755-3330-8919
0755-3330-8920
0755-3291-4518
注意,该号码不支持回电的哟,备案成功之后等待电话即可。
小结:
这篇博客旨在帮助开发者从零开始搭建一个完整的项目开发与上线流程,从本地环境配置到服务器部署以及域名解析的每一步都进行了详尽的指导。无论你是初学者还是有一定经验的开发者,都能通过这篇博客掌握如何高效管理项目代码、配置服务器环境、以及确保项目稳定运行的实践经验。