Redis如何多开?


要在同一台服务器上运行多个 Redis 实例(即“多开” Redis),可以采用以下几种方法。下面介绍两种常用的方法:使用不同的配置文件使用 Docker 容器

方法一:使用不同的配置文件

这是最常见且简单的方法,通过为每个 Redis 实例创建独立的配置文件和数据目录来实现。

步骤:

  1. 安装 Redis

如果尚未安装 Redis,可以参考 Redis 官方安装文档 进行安装。

  1. 创建多个配置文件

为每个 Redis 实例创建一个独立的配置文件。例如,创建 redis1.confredis2.conf

bash cp /etc/redis/redis.conf /etc/redis/redis1.conf cp /etc/redis/redis.conf /etc/redis/redis2.conf

  1. 修改配置文件

编辑每个配置文件,确保以下参数是唯一的,以避免端口和数据目录冲突:

端口 (port):默认是 6379,可以为第二个实例设置为 6380,第三个为 6381,以此类推。 • PID 文件 (pidfile):默认是 /var/run/redis_6379.pid,可以修改为 /var/run/redis_6380.pid 等。 • 日志文件 (logfile):确保日志文件路径不同,如 /var/log/redis/redis1.log/var/log/redis/redis2.log。 • 数据目录 (dir):默认是 /var/lib/redis,可以为每个实例创建不同的目录,如 /var/lib/redis1/var/lib/redis2

示例修改 redis1.conf: conf port 6379 pidfile /var/run/redis_6379.pid logfile "/var/log/redis/redis1.log" dir /var/lib/redis1

示例修改 redis2.conf: conf port 6380 pidfile /var/run/redis_6380.pid logfile "/var/log/redis/redis2.log" dir /var/lib/redis2

  1. 创建数据目录并设置权限

bash sudo mkdir /var/lib/redis2 sudo chown redis:redis /var/lib/redis2

  1. 启动 Redis 实例

使用不同的配置文件启动每个 Redis 实例。

bash sudo redis-server /etc/redis/redis1.conf sudo redis-server /etc/redis/redis2.conf

  1. 验证实例运行

使用 redis-cli 连接到不同的实例,确保它们正常运行。

bash redis-cli -p 6379 # 和 redis-cli -p 6380

优点:

• 简单直观,适合小规模部署。 • 完全控制每个实例的配置。

缺点:

• 手动管理多个配置文件和进程,较为繁琐。 • 不适合大规模或需要动态扩展的场景。

方法二:使用 Docker 容器

Docker 提供了一种轻量级且易于管理的方式来运行多个 Redis 实例,特别适合开发和测试环境。

步骤:

  1. 安装 Docker

如果尚未安装 Docker,可以参考 Docker 官方安装文档 进行安装。

  1. 拉取 Redis 镜像

bash docker pull redis

  1. 运行多个 Redis 容器

使用 docker run 命令启动多个 Redis 实例,每个实例映射不同的端口和数据卷。

示例运行两个 Redis 容器:

bash docker run -d --name redis1 -p 6379:6379 -v /path/to/redis1-data:/data redis docker run -d --name redis2 -p 6380:6379 -v /path/to/redis2-data:/data redis

说明:-d:后台运行容器。 • --name:指定容器名称。 • -p:映射主机端口到容器端口。例如,将主机的 6380 端口映射到容器的 6379 端口。 • -v:挂载数据卷,确保数据持久化。

  1. 验证容器运行

使用 docker ps 查看运行中的容器:

bash docker ps

应该能看到 redis1redis2 两个容器正在运行。

  1. 连接 Redis 实例

使用 redis-cli 连接到不同的 Redis 实例:

bash redis-cli -p 6379 # 和 redis-cli -p 6380

优点:

• 简单快捷,适合快速部署多个实例。 • 隔离性好,每个实例运行在独立的容器中,互不干扰。 • 易于扩展和管理,配合 Docker Compose 可以更方便地管理多容器应用。

缺点:

• 需要一定的 Docker 知识。 • 对于生产环境,需要考虑资源管理和安全性。

使用 Docker Compose 管理多个 Redis 实例

对于更复杂的需求,可以使用 Docker Compose 来定义和管理多个 Redis 实例。

  1. 安装 Docker Compose

如果尚未安装,可以参考 Docker Compose 官方安装文档

  1. 创建 docker-compose.yml 文件

```yaml version: '3.8'

services: redis1: image: redis container_name: redis1 ports: - "6379:6379" volumes: - ./redis1-data:/data

 redis2:
   image: redis
   container_name: redis2
   ports:
     - "6380:6379"
   volumes:
     - ./redis2-data:/data

```

  1. 启动服务

docker-compose.yml 所在目录运行:

bash docker-compose up -d

  1. 停止服务

bash docker-compose down

优点:

• 配置集中管理,易于维护和扩展。 • 支持复杂的多容器应用场景。

方法三:使用 Systemd 管理多个 Redis 实例

对于需要在同一台服务器上以服务形式运行多个 Redis 实例的场景,可以使用 Systemd 来管理每个实例。

步骤:

  1. 创建多个配置文件

同方法一,为每个实例创建独立的配置文件,如 redis1.confredis2.conf

  1. 创建 Systemd 服务文件

为每个 Redis 实例创建一个 Systemd 服务文件。例如,创建 /etc/systemd/system/redis1.service/etc/systemd/system/redis2.service

示例 redis1.service: ```ini [Unit] Description=Redis In-Memory Data Store (Instance 1) After=network.target

[Service] ExecStart=/usr/bin/redis-server /etc/redis/redis1.conf ExecStop=/usr/bin/redis-cli shutdown User=redis Group=redis Restart=always

[Install] WantedBy=multi-user.target ```

示例 redis2.service: ```ini [Unit] Description=Redis In-Memory Data Store (Instance 2) After=network.target

[Service] ExecStart=/usr/bin/redis-server /etc/redis/redis2.conf ExecStop=/usr/bin/redis-cli shutdown User=redis Group=redis Restart=always

[Install] WantedBy=multi-user.target ```

  1. 重新加载 Systemd 配置

bash sudo systemctl daemon-reload

  1. 启动并启用服务

```bash sudo systemctl start redis1 sudo systemctl enable redis1

sudo systemctl start redis2 sudo systemctl enable redis2 ```

  1. 检查服务状态

bash sudo systemctl status redis1 sudo systemctl status redis2

优点:

• 利用 Systemd 管理服务,便于监控和自动重启。 • 适合需要将多个 Redis 实例作为系统服务运行的场景。

缺点:

• 配置较为复杂,需要对 Systemd 有一定了解。 • 不如 Docker 容器灵活,特别是在隔离性和快速部署方面。

总结

根据具体需求和环境选择合适的方法:

开发或测试环境:推荐使用 Docker 容器,因其快速且易于管理。

生产环境:如果需要稳定性和系统级集成,可以选择使用不同的配置文件配合 Systemd 管理;如果需要高隔离性和灵活性,Docker 仍然是不错的选择。

简单多实例需求:使用不同的配置文件手动管理也是一种有效的方法,尤其适合小规模部署。

确保无论采用哪种方法,都要注意以下几点以保证 Redis 实例的稳定运行:

端口不冲突:每个实例使用不同的端口。

数据目录独立:避免数据覆盖或冲突。

资源分配:监控服务器资源,确保每个实例有足够的 CPU、内存和存储资源。

安全性:配置适当的访问控制和认证机制,保护 Redis 实例免受未授权访问。

Nginx常见配置


Nginx 是一个高性能的 HTTP 和反向代理服务器,常用于负载均衡、静态文件服务、反向代理等场景。以下是一些常见的 Nginx 配置示例和说明:

1. 基本配置

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include /etc/nginx/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 /var/log/nginx/access.log main;

    sendfile on;
    keepalive_timeout 65;

    include /etc/nginx/conf.d/*.conf;
}

2. 静态文件服务

server {
    listen 80;
    server_name example.com;

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

    location /images/ {
        alias /data/images/;
    }
}

root 指令用于指定网站的根目录。 • alias 指令用于将 URL 路径映射到文件系统的特定目录。

3. 反向代理

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

proxy_pass 指令用于将请求转发到后端服务器。 • proxy_set_header 指令用于设置请求头,传递客户端信息到后端服务器。

4. 负载均衡

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;

    # 负载均衡算法
    least_conn;  # 最少连接数
    # ip_hash;   # 基于 IP 的哈希算法
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

upstream 块用于定义一组后端服务器。 • least_connip_hash 是常见的负载均衡算法。

5. HTTPS 配置

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

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

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

listen 443 ssl 启用 HTTPS。 • ssl_certificatessl_certificate_key 分别指定 SSL 证书和私钥文件。 • return 301 用于将 HTTP 请求重定向到 HTTPS。

6. 重定向配置

server {
    listen 80;
    server_name old.example.com;

    return 301 https://new.example.com$request_uri;
}

return 301 用于永久重定向请求到新的 URL。

7. 静态文件缓存

server {
    listen 80;
    server_name example.com;

    location /static/ {
        alias /var/www/static/;
        expires 30d;
        add_header Cache-Control "public, no-transform";
    }
}

expires 指令用于设置静态文件的缓存时间。 • add_header 指令用于添加自定义的响应头。

8. 限制访问

location /admin/ {
    allow 192.168.1.0/24;
    deny all;
}

allowdeny 指令用于限制特定 IP 地址或 IP 段的访问。

9. 日志配置

http {
    log_format custom '$remote_addr - $remote_user [$time_local] "$request" '
                       '$status $body_bytes_sent "$http_referer" '
                       '"$http_user_agent" "$http_x_forwarded_for" "$request_time"';

    access_log /var/log/nginx/access.log custom;
}

log_format 指令用于自定义日志格式。 • access_log 指令用于指定访问日志的路径和格式。

10. Gzip 压缩

http {
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    gzip_min_length 1000;
    gzip_comp_level 6;
    gzip_proxied any;
    gzip_vary on;
}

gzip 指令用于启用 Gzip 压缩。 • gzip_types 指定需要压缩的文件类型。 • gzip_min_length 设置压缩的最小文件大小。 • gzip_comp_level 设置压缩级别。

11. 防止点击劫持

add_header X-Frame-Options "SAMEORIGIN";

X-Frame-Options 响应头用于防止点击劫持攻击。

12. 防止 MIME 类型嗅探

add_header X-Content-Type-Options "nosniff";

X-Content-Type-Options 响应头用于防止 MIME 类型嗅探。

13. 防止 XSS 攻击

add_header X-XSS-Protection "1; mode=block";

X-XSS-Protection 响应头用于启用浏览器的 XSS 过滤机制。

14. 限制请求速率

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

    server {
        location /api/ {
            limit_req zone=one burst=5;
        }
    }
}

limit_req_zone 指令用于定义限速区域。 • limit_req 指令用于应用限速规则。

15. 自定义错误页面

server {
    error_page 404 /404.html;
    location = /404.html {
        root /var/www/html/errors;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /var/www/html/errors;
    }
}

error_page 指令用于自定义错误页面。

这些是一些常见的 Nginx 配置示例,实际使用中可以根据具体需求进行调整和扩展。

nginx查看并发连接数


netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}'

-

SYN_RECV # 一个连接请求已经到达,等待确认

ESTABLISHED # 正常数据传输状态/当前并发连接数

FIN_WAIT2 # 另一边已同意释放

ITMED_WAIT # 等待所有分组死掉

CLOSING # 两边同时尝试关闭

TIME_WAIT # 另一边已初始化一个释放

LAST_ACK # 等待所有分组死掉

-

实时统计QPS:

tail -f /data/log/nginx/nginx.api.access.log | awk -F '[' '{print $2}' | awk '{print $1}' | uniq -c

nginx socket failed (24/ Too many open files)解决方案


前端中转机,nginx出现socket() failed (24: Too many open files)...错误提示,客户端方面收到http状态码500的错误信息,查找网上方案,加以实际,得出以下方案。

出现此错误,表示系统打开文件数过多,超过系统配置参数。

使用命令查看:

ulimit -n

默认情况下为1024或者65535

配置可以的话,可以提高配置数值,升级到655350

1、修改/etc/security/limits.conf,修改或添加以下配置:
root soft nofile 655350
root hard nofile 655350
* soft nofile 655350
* hard nofile 655350

保存修改后,退出当前shell,重新登录即可生效。

注意:ubuntu下需要注明root用户,即配置前两行必备,否则重新登录后无法生效。

重新登录后,可使用以下命令查看值:

ulimit -Hn
ulimit -Sn
2、修改nginx配置,打开文件限制
vi /etc/nginx/nginx.conf

加入以下配置,与worker_processes以及pid同级:

worker_rlimit_nofile 102400;

该配置项是指一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文 件数(ulimit -n)与nginx 进程数相除,但是nginx 分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。

现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。

配置成功后,重启nginx:

service nginx restart

完成以上步骤,即可解决nginx打开文件数过多的报错。

mongodb3.4安装(ubuntu)


1、导入包管理系统使用的公钥
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
2、为mongodb创建一个源文件 ubuntu14.04:
echo "deb [ arch=amd64 ] http://mirrors.aliyun.com/mongodb/apt/debian wheezy/mongodb-org/3.4 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
echo "deb [ arch=amd64 ] http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
ubuntu16.04:
echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
3、重新加载本地数据库
sudo apt-get update
4、安装mongodb
sudo apt-get install -y mongodb-org
官方参考地址:https://docs.mongodb.com/v3.4/tutorial/install-mongodb-on-ubuntu/

linux下ssh免密码登录设置


每次登录远程主机使用密码难免有点烦人,在此介绍一种方式,可使用ssh密钥进行免密码登录。

ssh密钥生成

ssh-keygen:此命令用于生成密钥。

常用到的命令选项如下:

  • -t:用于指定密钥类型,rsa或者dsa,一般使用rsa;
  • -b:指定密钥长度;
  • -e:读取openssh的私钥或者公钥文件;
  • -C:添加注释;
  • -f:指定用来保存密钥的文件名;
  • -i:读取未加密的ssh-v2兼容的私钥/公钥文件,然后在标准输出设备上显示openssh兼容的私钥/公钥;
  • -l:显示公钥文件的指纹数据;
  • -N:提供一个新密语;
  • -P:提供(旧)密语;
  • -q:静默模式。

Demo:

ssh-keygen -t rsa -P abcdefg -f demo -C 'just a demo key'

上面的语句,意思为:创建一个密语为abcdefg,注释为just a demo key,名为demo的密钥,会有两个文件生成,demo(私钥)和demo.pub(公钥)。若要进行免密登录,需将密语设置为空。

将公钥文件部署到远程主机

命令如下:

# 本地执行:
# 将公钥文件上传至服务器tmp目录下
scp ~/.ssh/demo.pub root@10.211.55.5:/tmp
# 服务器执行:
# 将公钥内容追加至authorized_keys文件中,并修改其权限为600
mkdir -p ~/.ssh
cat /tmp/demo.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

至此,即可实现免密码登录,命令:ssh root@10.211.55.5

本地配置(可选)
vi ~/.ssh/config

# 请求配置
ServerAliveInterval 30  # 该选项表示客户端每隔30秒会向服务器发送一个请求,不执行任何操作,确保主机不会因为闲置断开连接

# 主机配置,Host表示别名,HostName输入IP,User即登录用户名,IdentityFile则是上传至服务器的公钥所对应的私钥路径。
Host demo-root
    HostName 10.211.55.5
    User root
    IdentityFile ~/.ssh/demo

如上配置,则可实现别名登录,免去记忆服务器IP的麻烦。

命令:ssh demo-root

粤公网安备 44010602011201号

粤ICP备2023003994号