************************ 部署和运维 ************************ uwsgi VS Gunicorn =========================================== 两个服务器的区别是: `uwsgi `_ 用C写,Gunicorn是纯Python实现,性能上比uwsgi慢,但安装和使用比uwsgi简单。 因为Docker能解决uwsgi的安装问题,所以选用uwsgi,gunicorn作为第二选择。 .. tip:: 重启命令: ``uwsgi --reload /tmp/project-master.pid`` docker + docker-compose + uwsgi + jenkins ======================================================= 使用jenkins自动构建项目, 一个服务部署一个容器, docker-compose编排多个服务 为了减小django项目镜像体积,使用多阶段构建方案 .. literalinclude:: /../../Dockerfile :language: docker :linenos: bullseye是大而全的环境, 不适合发布到生产环境(1G+的体积), 主要是为了成功安装uwsgi。 alpine是最小的环境, 而uwsgi在运行时仍然需要调用一些动态链接文件, alpine是缺失很多这种文件的, 所以最终选定在体积在中间位置的slim-bullseye作为发布到生产环境的基础镜像。 多阶段构建镜像的瘦身效果是从1G+的体积大小减少至500多M。 两个容器用的同一份项目代码,因此使用同一个镜像(pyblog)。 docker + supervisor + fabric + gunicorn ========================================= https://docs.docker.com/config/containers/multi-service_container/ 只需要写一个Dockerfile, git下载代码和supervisor启动都在容器中完成。使用fabric将Dockerfile上传至服务器和自动构建。 在docker容器使用supervisor管理多个服务进程。 一个容器部署一个服务利于项目维护和功能拓展, 但提高部署复杂度。而使用supervisor将所有服务放在一个容器的好处是简单便捷和工作量更少, 如果项目不大或者想省时省力,可以采用这个方案。 .. seealso:: * 我的私人项目myproject * `core `_ (在容器中使用git下载项目代码) * Docker实践(第2版) 734页 **Example** Dockerfile .. literalinclude:: /_static/deployment/Dockerfile :language: docker :linenos: supervisor .. literalinclude:: /_static/deployment/Supervisor/supervisord.d/app.ini :language: guess :linenos: :emphasize-lines: 56 托管Redis时需要注意一点: Redis自带daemon功能,跟supervisor产生冲突,因此command命令增加参数 ``--daemonize no`` 。托管Nginx同理。 部署python程序到离线环境下 =================================== 比如想在离线环境安装requests库 在线环境执行: .. code-block:: text pip download requests 生成出3个whl文件 * requests-2.28.1-py3-none-any.whl * urllib3-1.26.12-py2.py3-none-any.whl * certifi-2022.9.24-py3-none-any.whl * idna-3.4-py3-none-any.whl * charset_normalizer-2.1.1-py3-none-any.whl 拷贝到离线环境, 执行 .. code-block:: text pip install requests-2.28.1-py3-none-any.whl urllib3-1.26.12-py2.py3-none-any.whl certifi-2022.9.24-py3-none-any.whl certifi-2022.9.24-py3-none-any.whl idna-3.4-py3-none-any.whl charset_normalizer-2.1.1-py3-none-any.whl 部署docker应用到离线环境下 =================================== 在线linux环境制作好镜像, 执行 .. code-block:: text docker save {image-id} > image.tar .. warning:: 不推荐在win环境导出镜像, 非常慢 拷贝到装有docker的离线环境机器 .. code-block:: text docker load -i image.tar