从 Debian 安装到环境设置,一步一步来。
debian下载
https://mirrors.ustc.edu.cn 中科大镜像
直接安装install, 不用:graphic install
debian乱码
最简安装debian的时候由于没有中文字库,若选择看中文环境会出现菱形乱码。 先把zh.utf8换为us.utf8看着好顺眼些。 1、apt-get update 2、su 3、dpkg-reconfigure locales 4、space取消zh_cn选项 5、按空格键选择en_us.utf8选项 6、ok
debian 更换国内源
更换国内中科大源ustc https://mirrors.ustc.edu.cn/help/debian.html
基础命令
学习:https://cloud.tencent.com/developer/article/1359642?from=10680
#sudo(Superuser do) 很多操作都离不开这个,有时候忘了写也没事,系统会提示你用管理员操作。
sudo apt install man-db
#现在,要查看组件的手册,您可以键入:
man command
#例如,要查看top命令的手册,请键入:
man top
#安装
apt-get install nginx
apt install nginx
#更新
apt update
#查找
find / -name nginx
#编辑
nano nginx.conf
vi nginx.conf
#移动
mv src dest
# 修改用户密码:
sudo passwd root
#nginx 测试conf文件以及重新加载
/usr/sbin/nginx -t
/usr/sbin/nginx -s reload
下载工具wget
apt-get install wget
SSH服务
apt-get install openssh-server
安装完成后SSH 服务默认开启 手动启动:
systemctl start ssh.service
#修改配置:
nano /etc/ssh/sshd_config
PermitRootLogin yes
PasswordAuthentication yes
ifconfig 没有找到
debian 官方推荐: ip addr
sudo apt-get install net-tools
#然后找:
find / -name ifconfig
alias ifconfig='/sbin/ifconfig'
ifconfig
没有编译器 cc not found
apt-get install gcc
redis编译报致命错误:jemalloc/jemalloc.h:没有那个文件或目录 分配器allocator, 如果有MALLOC 这个 环境变量, 会有用这个环境变量的 去建立Redis。
而且libc 并不是默认的 分配器, 默认的是 jemalloc, 因为 jemalloc 被证明 有更少的 fragmentation problems 比libc。
但是如果你又没有jemalloc 而只有 libc 当然 make 出错。 所以加这么一个参数,运行如下命令:
make MALLOC=libc
docker ce 安装
社区版本 community edition
安装看这个: https://www.cnblogs.com/heyangyi/p/8613149.html
1.查看Linux系统信息 nuame -a
我的是Debian, amd64
2.查看Linux 系统发行版的名称 lsb_release -cs
大致意思就是:
1、先查看 本机 信息
2、找到匹配的docker ce 地址 (建议找国内镜像(清华、163、中科大等),中科大就用https://mirrors.ustc.edu.cn)
然后wget下来
然后dpkg -i dockername 安装docker ce
#docker服务自动重启设置
systemctl enable docker.service
#基础命令
#查找镜像
docker search imageName
#下载镜像到本地
docker pull imageName
docker images #列出所有镜像
docker images rm imagename #删除镜像
#容器操作
#创建并启动一个容器 -d后台运行 -p 映射到本地端口:容器运行端口 --name 容器名称
docker run --name containerName -d -p 3307:3306 -p 1256:223 --restart=always imageid #imageid 镜像编号/镜像名称
docker ps -a #列出所有容器
docker start containerid #启动容器 stop停止容器
docker rm containerid #删除容器
docker inspect containerid #查看容器详细信息
#在运行docker容器时可以加如下参数来保证每次docker服务重启后容器也自动重启:
docker run --restart=always
#如果已经启动了则可以使用如下命令:
docker update --restart=always <CONTAINER ID>
#进入正在运行的容器并执行bash命令
docker exec -it 容器Id bash
安装 MariaDb
https://www.cnblogs.com/WaterGe/p/11067387.html
mkdir -p /data/mariadb/data #建一个目录作为和容器的映射目录
docker run --name mariadb3307 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=1234 -v ~/data/mariadb/data:/var/lib/mysql -d mariadb
-
--name启动容器设置容器名称为mariadb
-
-p设置容器的3306端口映射到主机3306端口
-
-e MYSQL_ROOT_PASSWORD设置环境变量数据库root用户密码为输入数据库root用户的密码
-
-v设置容器目录/var/lib/mysql映射到本地目录/data/mariadb/data
-
-d后台运行容器mariadb并返回容器id
maridb 将容器内部配置文件映射到外部虚拟机中
docker run -p 3306:3306 -v /mariadb/data:/var/lib/mysql -v /mariadb/conf/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 --name mariadb -d --restart unless-stopped docker.io/mariadb:latest
docker ps -a #查看容器是否运行
docker container update --restart=always 容器id #修改容器为自启动
#进入容器
docker exec -it 容器Id bash
安装 rabbitmq
参考: https://blog.****.net/myNameIssls/column/info/23166
sudo mkdir -p ~/data/rabbitmq
# 查看镜像id
docker images
docker run --restart=always -d --name rabbitmq -p 5672:5672 -p 15672:15672 -v ~/data/rabbitmq:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_VHOST=/ -e RABBITMQ_DEFAULT_USER=mqadmin -e RABBITMQ_DEFAULT_PASS=1 rabbitmq:management
说明:
-d 后台运行容器;
--name 指定容器名;
-p 指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号);
-v 映射目录或文件;
--hostname 主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名);
-e 指定环境变量;(RABBITMQ_DEFAULT_VHOST:默认虚拟机名;RABBITMQ_DEFAULT_USER:默认的用户名;RABBITMQ_DEFAULT_PASS:默认用户名的密码)
安装 activmq
#查找
docker search activemq
#第一个一般为官方的
docker pull webcenter/activemq
#运行实例
docker run --restart=always --name activemq -d -p 61617:61616 -p 61614:61614 -p 8162:8161 -p 1883:1883 webcenter/activemq
docker run -d --name activemq -p 61617:61616 -p 8162:8161 webcenter/activemq
#查看运行实例
docker ps -a
#拷贝虚拟机内部文件到本地
docker cp activemq:/opt/activemq/conf/activemq.xml ~/data/activemq/conf/activemq.xml
docker cp ~/data/activemq/conf/activemq.xml activemq:/opt/activemq/conf/activemq.xml
Debian 10 安装 dotnet
安装 .NET 之前,需要:
- 注册 Microsoft 密钥
- 注册产品存储库
- 安装必需的依赖项
每台计算机只需要执行一次此操作。
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.asc.gpg
sudo mv microsoft.asc.gpg /etc/apt/trusted.gpg.d/
wget -q https://packages.microsoft.com/config/debian/10/prod.list
sudo mv prod.list /etc/apt/sources.list.d/microsoft-prod.list
sudo chown root:root /etc/apt/trusted.gpg.d/microsoft.asc.gpg
sudo chown root:root /etc/apt/sources.list.d/microsoft-prod.list
安装 ASP.NET Core 运行时
更新可供安装的产品,然后安装 ASP.NET 运行时。 在终端中,运行以下命令。
sudo apt-get update
sudo apt-get install apt-transport-https
sudo apt-get update
sudo apt-get install aspnetcore-runtime-3.1
安装 .NET Core 运行时
更新可供安装的产品,然后安装 .NET Core 运行时。 在终端中,运行以下命令。
sudo apt-get update
sudo apt-get install apt-transport-https
sudo apt-get update
sudo apt-get install dotnet-runtime-3.1
# sdk
sudo apt-get install dotnet-sdk-3.1
minio 分布式文件存储
docker pull minio/minio
mkdir -p /home/minio/data
mkdir -p /home/minio/conf
docker run -p 9000:9000 --name minio \
-d --restart=always \
-e "MINIO_ACCESS_KEY=admin" \
-e "MINIO_SECRET_KEY=admin123456" \
-v /home/minio/data:/home/shared \
-v /home/minio/conf:/root/.minio \
minio/minio server /home/shared
上一篇: 推荐的数据同步中间件 DBSyncer
下一篇: 详细解释 PHP 中接口的使用
推荐阅读
-
从 Debian 安装到环境设置,一步一步来。
-
【Netty】「萌新入门」(七)ByteBuf 的性能优化-堆内存的分配和释放都是由 Java 虚拟机自动管理的,这意味着它们可以快速地被分配和释放,但是也会产生一些开销。 直接内存需要手动分配和释放,因为它由操作系统管理,这使得分配和释放的速度更快,但是也需要更多的系统资源。 另外,直接内存可以映射到本地文件中,这对于需要频繁读写文件的应用程序非常有用。 此外,直接内存还可以避免在使用 NIO 进行网络传输时发生数据拷贝的情况。在使用传统的 I/O 时,数据必须先从文件或网络中读取到堆内存中,然后再从堆内存中复制到直接缓冲区中,最后再通过 SocketChannel 发送到网络中。而使用直接缓冲区时,数据可以直接从文件或网络中读取到直接缓冲区中,并且可以直接从直接缓冲区中发送到网络中,避免了不必要的数据拷贝和内存分配。 通过 ByteBufAllocator.DEFAULT.directBuffer 方法来创建基于直接内存的 ByteBuf: ByteBuf directBuf = ByteBufAllocator.DEFAULT.directBuffer(16); 通过 ByteBufAllocator.DEFAULT.heapBuffer 方法来创建基于堆内存的 ByteBuf: ByteBuf heapBuf = ByteBufAllocator.DEFAULT.heapBuffer(16); 注意: 直接内存是一种特殊的内存分配方式,可以通过在堆外申请内存来避免 JVM 堆内存的限制,从而提高读写性能和降低 GC 压力。但是,直接内存的创建和销毁代价昂贵,因此需要慎重使用。 此外,由于直接内存不受 JVM 垃圾回收的管理,我们需要主动释放这部分内存,否则会造成内存泄漏。通常情况下,可以使用 ByteBuffer.clear 方法来释放直接内存中的数据,或者使用 ByteBuffer.cleaner 方法来手动释放直接内存空间。 测试代码: public static void testCreateByteBuf { ByteBuf buf = ByteBufAllocator.DEFAULT.buffer(16); System.out.println(buf.getClass); ByteBuf heapBuf = ByteBufAllocator.DEFAULT.heapBuffer(16); System.out.println(heapBuf.getClass); ByteBuf directBuf = ByteBufAllocator.DEFAULT.directBuffer(16); System.out.println(directBuf.getClass); } 运行结果: class io.netty.buffer.PooledUnsafeDirectByteBuf class io.netty.buffer.PooledUnsafeHeapByteBuf class io.netty.buffer.PooledUnsafeDirectByteBuf 池化技术 在 Netty 中,池化技术指的是通过对象池来重用已经创建的对象,从而避免了频繁地创建和销毁对象,这种技术可以提高系统的性能和可伸缩性。 通过设置 VM options,来决定池化功能是否开启: -Dio.netty.allocator.type={unpooled|pooled} 在 Netty 4.1 版本以后,非 Android 平台默认启用池化实现,Android 平台启用非池化实现; 这里我们使用非池化功能进行测试,依旧使用的是上面的测试代码 testCreateByteBuf,运行结果如下所示: class io.netty.buffer.UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeDirectByteBuf class io.netty.buffer.UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf class io.netty.buffer.UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeDirectByteBuf 可以看到,ByteBuf 类由 PooledUnsafeDirectByteBuf 变成了 UnpooledUnsafeDirectByteBuf; 在没有池化的情况下,每次使用都需要创建新的 ByteBuf 实例,这个操作会涉及到内存的分配和初始化,如果是直接内存则代价更为昂贵,而且频繁的内存分配也可能导致内存碎片问题,增加 GC 压力。 使用池化技术可以避免频繁内存分配带来的开销,并且重用池中的 ByteBuf 实例,减少了内存占用和内存碎片问题。另外,池化技术还可以采用类似 jemalloc 的内存分配算法,进一步提升分配效率。 在高并发环境下,池化技术的优点更加明显,因为内存的分配和释放都是比较耗时的操作,频繁的内存分配和释放会导致系统性能下降,甚至可能出现内存溢出的风险。使用池化技术可以将内存分配和释放的操作集中到预先分配的池中,从而有效地降低系统的内存开销和风险。 内存释放 当在 Netty 中使用 ByteBuf 来处理数据时,需要特别注意内存回收问题。 Netty 提供了不同类型的 ByteBuf 实现,包括堆内存(JVM 内存)实现 UnpooledHeapByteBuf 和堆外内存(直接内存)实现 UnpooledDirectByteBuf,以及池化技术实现的 PooledByteBuf 及其子类。 UnpooledHeapByteBuf:通过 Java 的垃圾回收机制来自动回收内存; UnpooledDirectByteBuf:由于 JVM 的垃圾回收机制无法管理这些内存,因此需要手动调用 release 方法来释放内存; PooledByteBuf:使用了池化机制,需要更复杂的规则来回收内存; 由于池化技术的特殊性质,释放 PooledByteBuf 对象所使用的内存并不是立即被回收的,而是被放入一个内存池中,待下次分配内存时再次使用。因此,释放 PooledByteBuf 对象的内存可能会延迟到后续的某个时间点。为了避免内存泄漏和占用过多内存,我们需要根据实际情况来设置池化技术的相关参数,以便及时回收内存; Netty 采用了引用计数法来控制 ByteBuf 对象的内存回收,在博文 「源码解析」ByteBuf 的引用计数机制 中将会通过解读源码的形式对 ByteBuf 的引用计数法进行深入理解; 每个 ByteBuf 对象被创建时,都会初始化为1,表示该对象的初始计数为1。 在使用 ByteBuf 对象过程中,如果当前 handler 已经使用完该对象,需要通过调用 release 方法将计数减1,当计数为0时,底层内存会被回收,该对象也就被销毁了。此时即使 ByteBuf 对象还在,其各个方法均无法正常使用。 但是,如果当前 handler 还需要继续使用该对象,可以通过调用 retain 方法将计数加1,这样即使其他 handler 已经调用了 release 方法,该对象的内存仍然不会被回收。这种机制可以有效地避免了内存泄漏和意外访问已经释放的内存的情况。 一般来说,应该尽可能地保证 retain 和 release 方法成对出现,以确保计数正确。