前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >内网环境如何配置运行环境

内网环境如何配置运行环境

作者头像
Kindear
发布2023-09-26 08:38:46
5440
发布2023-09-26 08:38:46
举报
文章被收录于专栏:算法与数据结构

内网环境如何配置运行环境

目前很多国企或者单位对保密性有要求,不允许宿主机环境连接外部网络,也不提供跳板机搭建代理访问,所以很多环境都需要自己手动编译安装调试,现在将自己的完整的环境部署流程记录下来,以做后续参考,本文操作时的操作系统如下。

系统环境

CentOS 7.9.2009

1. 准备工作

下载MobaXtermSSH连接软件

确定系统版本

代码语言:javascript
复制
 # 适用于红帽系列 / centos
 cat /etc/redhat-release
 # 适用于 Ubuntu / debian
 lsb_release -a

本系统获取信息如下

代码语言:javascript
复制
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

了解部分linux相关命令

虽然无法连接外网,但是系统中本身具有部分yum缓存可以安装例如vim,无法使用 yum安装的,采用上传编译

预安装

代码语言:javascript
复制
yum install vim

2. Linux命令

Linux命令众多,可以参考下方地址查阅所需命令

https://www.runoob.com/w3cnote/linux-common-command.html

防火墙

  • 查看已经放行的端口
代码语言:javascript
复制
sudo firewall-cmd --list-ports
  • 放行TCP端口
代码语言:javascript
复制
sudo firewall-cmd --zone=public --add-port=端口号/tcp --permanent
sudo firewall-cmd --reload
  • 放行UDP端口
代码语言:javascript
复制
sudo firewall-cmd --zone=public --add-port=端口号/udp --permanent
sudo firewall-cmd --reload

文件

  • 解压gz文件
代码语言:javascript
复制
tar -zxvf xxx.gz
  • 解压xz文件
代码语言:javascript
复制
tar -xJf xxx.xz 

端口

  • 查看端口占用
代码语言:javascript
复制
lsof -i:8080
  • 解除端口占用
代码语言:javascript
复制
kill -9 PID

3. 开启root登录权限

如果不以 root 账户登录,使用 ssh 工具客户端进行文件上传可能会导致权限不足问题

连接服务,键入命令修改root用户密码

代码语言:javascript
复制
sudo passwd root

修改配置项

代码语言:javascript
复制
vi /etc/ssh/sshd_config

配置

代码语言:javascript
复制
PermitRootLogin yes

重启服务

代码语言:javascript
复制
service sshd restart

MobaXterm上使用root账户登录

4. Java 环境安装

yum缓存有 jdk11

代码语言:javascript
复制
yum install java

成功安装

5. Python 3.9.18 环境安装

下载地址
代码语言:javascript
复制
链接: https://caiyun.139.com/m/i?105CqKL86WHer  提取码:aSjt
解压安装

构建存储地址

代码语言:javascript
复制
mkdir /opt/python3

将压缩包上传至该目录下并解压

代码语言:javascript
复制
tar -xJf Python-3.9.18.tar.xz 

在解压后的Python 3.9文件夹中,执行以下命令来安装Python 3.9

代码语言:javascript
复制
./configure
make && make install

遇到缺少依赖包错误,先尝试使用yum安装

验证
代码语言:javascript
复制
python3 --version

5. MySQL 8.0安装

下载地址
代码语言:javascript
复制
链接: https://caiyun.139.com/m/i?105CpgTuMNOp6  提取码:gqEF
解压安装

原系统中可能存在mariadb,需要先清除该数据库

代码语言:javascript
复制
# 查询
rpm -qa|grep mariadb
# 清理
rpm -e --nodeps mariadb-libs

构建应用存放目录

代码语言:javascript
复制
mkdir /opt/mysql

将压缩包上传至该目录下并解压

代码语言:javascript
复制
tar -xvf mysql-8.0.34-1.el7.x86_64.rpm-bundle.tar -C mysql

解压该目录获得以下文件,依次使用rpm安装

代码语言:javascript
复制
mysql-community-libs-8.0.34-1.el7.x86_64.rpm
mysql-community-embedded-compat-8.0.34-1.el7.x86_64.rpm
mysql-community-devel-8.0.34-1.el7.x86_64.rpm
mysql-community-server-8.0.34-1.el7.x86_64.rpm
mysql-community-libs-compat-8.0.34-1.el7.x86_64.rpm
mysql-community-client-8.0.34-1.el7.x86_64.rpm
mysql-community-common-8.0.34-1.el7.x86_64.rpm
mysql-community-test-8.0.34-1.el7.x86_64.rpm

按照如下顺序安装

代码语言:javascript
复制
rpm -ivh mysql-community-common-8.0.34-1.el7.x86_64.rpm

rpm -ivh mysql-community-client-plugins-8.0.34-1.el7.x86_64.rpm

rpm -ivh mysql-community-libs-8.0.34-1.el7.x86_64.rpm

rpm -ivh mysql-community-client-8.0.34-1.el7.x86_64.rpm

rpm -ivh mysql-community-icu-data-files-8.0.34-1.el7.x86_64.rpm

rpm -ivh mysql-community-server-8.0.34-1.el7.x86_64.rpm
错误1
代码语言:javascript
复制
warning: mysql-community-devel-8.0.34-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
error: Failed dependencies:
    pkgconfig(openssl) is needed by mysql-community-devel-8.0.16-2.el7.x86_64

解决方案 yum缓存中应该有这些包,没有就手动编译

代码语言:javascript
复制
yum install openssl-devel.x86_64 openssl openssl.x86_64 -y

再次执行报错命令

错误2
代码语言:javascript
复制
warning: mysql-community-test8.0.34-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
error: Failed dependencies:
    perl(Data::Dumper) is needed by mysql-community-test-8.0.34-1.el7.x86_64
    perl(JSON) is needed by mysql-community-test-8.0.34-1.el7.x86_64

解决方案

代码语言:javascript
复制
yum install perl.x86_64 perl-devel.x86_64 -y

yum install perl-JSON.noarch -y

yum -y install autoconf

再次执行报错命令

初始化配置
  1. 执行命令查看mysql运行情况
代码语言:javascript
复制
systemctl status mysqld
  1. 停止服务
代码语言:javascript
复制
service mysqld stop
  1. 初始化数据库
代码语言:javascript
复制
mysqld --initialize --console
  1. 目录授权
代码语言:javascript
复制
chown -R mysql:mysql /var/lib/mysql/
  1. 启动mysql
代码语言:javascript
复制
systemctl start mysqld
  1. 获取临时密码
代码语言:javascript
复制
cat /var/log/mysqld.log

如下,获取到的临时密码就是 0d.Kds3fs:3W

代码语言:javascript
复制
2023-09-23T11:50:08.568177Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: 0d.Kds3fs:3W
  1. 登入数据库
代码语言:javascript
复制
[root@localhost /]# mysql -uroot -p
Enter password:

然后输入临时密码(输入时不会显示出来,输入完直接回车)

  1. 修改临时密码
代码语言:javascript
复制
alter USER 'root'@'localhost' IDENTIFIED BY '你的密码';
alter USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';
flush privileges;
  1. 授权远程连接
代码语言:javascript
复制
use mysql;

update user set host = "%" where user='root';

flush privileges;

select host, user, authentication_string, plugin from user;
  1. 放行 3306 端口,远程连接数据库,放行命令参考 2

5. Redis 7.0 安装

下载地址
代码语言:javascript
复制
链接: https://caiyun.139.com/m/i?105CpMTVxjCZ5  提取码:0qyO
解压安装

构建应用存放目录

代码语言:javascript
复制
mkdir /opt/redis

将文件上传至该目录下并解压

代码语言:javascript
复制
tar -zxvf redis-7.0.13.tar.gz

编译安装

代码语言:javascript
复制
make && make install
初始化配置
  1. 配置项迁移

进入/opt/redis/redis-7.0.13目录将 redis解压目录下redis.conf复制一份到 /etc/redis.conf

代码语言:javascript
复制
cp redis.conf /etc/redis.conf
  1. 修改配置文件
代码语言:javascript
复制
vim /etc/redis.conf

配置允许后台启动

代码语言:javascript
复制
daemonize yes

配置允许远程连接

代码语言:javascript
复制
bind 0.0.0.0

配置远程访问连接密码

代码语言:javascript
复制
requirepass 你的密码
  1. 放行 6379 端口
服务守护

/etc/systemd/system下新建redis.service,编辑录入以下内容

代码语言:javascript
复制
[Unit]
Description=Redis
After=network.target
 
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /etc/redis.conf
ExecReload=/usr/local/bin/redis-server -s reload
ExecStop=/usr/local/bin/redis-server -s stop
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target

执行服务重载,redis 后台运行并且开启自启

代码语言:javascript
复制
# 重载配置
systemctl daemon-reload
# 重启redis
systemctl restart redis

6. Docker 安装

系统可能默认自带 docker,可以输入命令查

代码语言:javascript
复制
docker -v

如果没有可以 yum install docker

镜像导出

更多docker相关命令,请去查询文档

在无网络服务器中无法从网络直接下载镜像,但是我们可以本地上传并加载,下面是从已安装镜像服务器导出镜像的命令

代码语言:javascript
复制
docker save -o 导出文件名.tar 导出镜像名
# 例
docker save -o nginx.tar nginx:latest
镜像导入

将镜像上传至服务器,运行如下命令,导入镜像文件

代码语言:javascript
复制
docker load -i xxxx.tar
导入错误1

导入可能会出现依赖错误问题

代码语言:javascript
复制
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: unable to retrieve OCI runtime error (open /var/run/docker/containerd/daemon/io.containerd.runtime.v2.task/moby/99524ed55992ee515e4a47f54023826133a66d3aa573386675a2b5ad48d6b23d/log.json: no such file or directory): runc did not terminate successfully: exit status 127: runc: error while loading shared libraries: libseccomp.so.2: cannot open shared object file: No such file or directory
: unknown.

执行如下命令修复

代码语言:javascript
复制
yum install libseccomp

再次执行镜像导入命令

容器构建

以构建onlyoffice服务为例

代码语言:javascript
复制
docker run -i -t -d -p 9004:80 --restart=always onlyoffice/documentserver

将宿主机端口 9004 映射到 容器 80 端口,并设置自动重启, 指定容器使用的镜像名称为 onlyoffice/docmentserver

onlyoffice镜像下载地址

代码语言:javascript
复制
链接: https://caiyun.139.com/m/i?105CfN2XO4gzx  提取码:WGGJ
服务守护

/etc/systemd/system下新建docker.service,编辑录入以下内容

代码语言:javascript
复制
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd --selinux-enabled=false -H unix://
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process

Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target

执行服务重载

代码语言:javascript
复制
# 重载配置
systemctl daemon-reload
# 重启redis
systemctl restart docker

7. Nginx 安装

下载地址
代码语言:javascript
复制
链接: https://caiyun.139.com/m/i?105CpMRR2Qu8p  提取码:Xgqt  复制内容打开中国移动云盘手机APP,操作更方便哦
解压安装
  1. 构建安装目录
代码语言:javascript
复制
mkdir /opt/nginx
  1. 将压缩包上传至该目录下并解压
代码语言:javascript
复制
tar -zxvf nginx-1.20.2.tar.gz
  1. 下载编译工具库(yum缓存中有)
代码语言:javascript
复制
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
  1. 进入解压后的目录执行命令
代码语言:javascript
复制
./configure --prefix=/usr/local/nginx --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-http_stub_status_module
  1. 执行安装
代码语言:javascript
复制
make && make install
服务守护

/etc/systemd/system下新建nginx.service,编辑录入以下内容

代码语言:javascript
复制
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target

执行服务重载

代码语言:javascript
复制
# 重载配置
systemctl daemon-reload
# 重启redis
systemctl restart nginx
项目部署
  1. 构建项目存储地址
代码语言:javascript
复制
mkdir /www/vue
  1. 在本地将 Vue项目打包并将dist上传至该目录下
  2. 修改配置文件
代码语言:javascript
复制
vim /usr/local/nginx/conf/nginx.conf

修改后如下所示

代码语言:javascript
复制
#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   /www/vue/dist;
            try_files $uri $uri/ /index.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;
    #    }
    #}

}
  1. 重启nginx
代码语言:javascript
复制
systemctl restart nginx
  1. 正常访问 80端口如果没放行需要放行

8. node 安装

推荐安装 v16版本,降至该版本后,未出现参考[3]中所提到的问题

官方下载地址 :https://nodejs.org/dist/

阿里云镜像地址:https://mirrors.aliyun.com/nodejs-release/

选择自己要下载的版本,下载后上传至服务器 /usr/local

此下的命令不可以直接复制,需要对应自己下载的版本

代码语言:javascript
复制
#解压文件
tar -zxvf /usr/local/node-v16.x-linux-x64.tar.gz -C /usr/local

#重命名文件夹
mv /usr/local/node-v16.x-linux-x64 /usr/local/node-v16.x

#删除下载的压缩包
rm -rf /usr/local/node-v16.x-linux-x64.tar.gz

配置环境变量

代码语言:javascript
复制
echo 'export NODE_HOME=/usr/local/node-v16.X' >> /etc/profile
echo 'export PATH=$PATH:$NODE_HOME/bin' >> /etc/profile

刷新配置

代码语言:javascript
复制
source /etc/profile

检查

代码语言:javascript
复制
node -v

9. Docker 镜像

对于一些在没有网络环境下,配置比较繁琐的项目,可以采用 docker镜像构建上传至内网服务器装载的方式进行

Python

现在以构建FastAPI(Python)项目为例展示一下构建过程

项目结构如下

代码语言:javascript
复制
lco
	src // 代码目录
	main.py
	requirement.txt
	Dockerfile
	...
1. 导出 依赖文件
代码语言:javascript
复制
pip list --format=freeze > requirements.txt
2. 修改启动文件

加入main函数,使执行启动命令

代码语言:javascript
复制
if __name__ == '__main__':
    uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=False)
3. 构建 Dockerfile
代码语言:javascript
复制
# 设置基础镜像
FROM python:3.9
# 设置代码文件夹工作目录 /app
WORKDIR /app
# 复制当前代码文件到容器中 /app
ADD . /app
# 设置时间
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 更新 pip 源
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 安装所需的包,这里的requirements文件名需和项目生成的一致
RUN pip install -r requirements.txt
# 指定端口
EXPOSE 8000 80
# 执行入口文件
CMD ["python", "main.py"]
4. 构建 Docker images

进入项目目录下,执行如下命令

代码语言:javascript
复制
docker build -t 镜像名称 .

存在冲突依赖就清理修改requirement.txt文件

5. 运行测试

将镜像导出并上传到内网服务器,运行如下命令装载镜像

也可以先在本机完成对应测试

代码语言:javascript
复制
docker load -i 镜像名称.tar

查看镜像列表

代码语言:javascript
复制
docker images

构建执行容器,并将容器网络挂载到宿主机

代码语言:javascript
复制
docker run --name 容器名称 -d --network=host 镜像名称

防火墙放行对应端口,例如我的端口就是 8000

执行访问测试

参考

[1] Centos7离线安装mysql8. He_lh. CSDN [EB/OL]

[2] CentOS7.x编译安装nginx 1.20.2,实现HTTP2 . Dr.愽. 博客园 [EB/OL]

[3] CentOS安装NPM. 黄辉. 知乎 [EB/OL]

[4] 无网络环境,如何部署Docker镜像. 菜鸟厚非. CSDN [EB/OL]

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 内网环境如何配置运行环境
  • 1. 准备工作
  • 2. Linux命令
  • 3. 开启root登录权限
  • 4. Java 环境安装
  • 5. Python 3.9.18 环境安装
    • 下载地址
      • 解压安装
        • 验证
        • 5. MySQL 8.0安装
          • 下载地址
            • 解压安装
              • 错误1
                • 错误2
                  • 初始化配置
                  • 5. Redis 7.0 安装
                    • 下载地址
                      • 解压安装
                        • 初始化配置
                          • 服务守护
                          • 6. Docker 安装
                            • 镜像导出
                              • 镜像导入
                                • 导入错误1
                                  • 容器构建
                                    • 服务守护
                                    • 7. Nginx 安装
                                      • 下载地址
                                        • 解压安装
                                          • 服务守护
                                            • 项目部署
                                            • 8. node 安装
                                            • 9. Docker 镜像
                                              • Python
                                                • 1. 导出 依赖文件
                                                  • 2. 修改启动文件
                                                    • 3. 构建 Dockerfile
                                                      • 4. 构建 Docker images
                                                        • 5. 运行测试
                                                        • 参考
                                                        相关产品与服务
                                                        容器服务
                                                        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                                                        领券
                                                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档