作者: sys

  • 信息系统项目管理师论文范文:通用开头结尾

    一,开头
    为提升信息化管理水平,提高行政办公效率,某高速公路管理局启动了办公系统建设项目。该项目于2022年3月经过公开招投标,我公司因优质的产品、服务中标。公司发布项目章程,任命我为项目经理,组建项目制团队。

    该项目总投资198万元人民币,建设工期历时9个月。采用B/S架构,java语言,作为国产化示范项目,国产达梦数据库,符合等保2级标准,开发了行政办公、资产管理、财务审计等6大功能模块。采用高内聚、低耦合的模块化设计原则,确保信息系统扩展升级的需要。

    二,过渡
    由于项目成员缺乏业务方面相关知识,该系涉及行政/财务/技术等多个需求部门,系统用户觉得多,涉及功能模块众多范围广泛,,且机关事业单位对信息系统的建设标准要求严格,以高质量、高可靠、高安全著称,尤其在网络安全和国产化方面标准较高,这些客观因素都会增加系统开发难度,过程中需要整合技术/人力资源/知识等资源,平衡进度/质量/成本等因素,增加需求变更的可能性,带来需求蔓延的风险,

    因此项目管理显得非常重要。在项目实施过程中,我严格执行项目管理流程,发挥组织管理和协调能力,最终带领团队去的项目成功。本文以此项目为例,从以下6个方面讨论项目管理。

    三,结尾
    经过项目组全体人员的共同努力,该项目于2023年1月顺利通过甲方验收并上线,得到了双方领导的一致好评。

    本项目的成功离不开我有效的项目管理,特别是建立了需求跟踪矩阵,确保了需求与产品的一致性,同时严格按照变更管理流程控制变更,有效防止了范围蔓延。

    当然在本项目中也存在不足之处,如因供应商原因,导致一批设备延期到货,导致我们的系统联调无法按期进行。最后我通过变更设备的方式,较好地解决了这一问题。虽然没有影响最终完工,但是仍然给项目带来一定影响。我把这次教训总结在工作日志里,在今后的项目管理过程中,以此为鉴。

  • OceanBase 单机版部署

    一、安装

    1. 通过 all-in-one 安装包部署 OBD 环境
    tar -xzf oceanbase-all-in-one-*.tar.gz
    cd oceanbase-all-in-one/bin/
    ./install.sh
    source ~/.oceanbase-all-in-one/bin/env.sh

    2. 禁用远程仓库

    obd mirror disable remote
    obd mirror list
    # 查看 Type=remote 对应的 Enabled 变成了 False,说明已关闭远程镜像源

    3. 查看本地镜像中安装包列表

    obd mirror list local

    4. 配置文件

    user:
    username: root
    password: xx
    port: 22
    oceanbase-ce:
    servers:
    - 172.16.99.220
    global:
    home_path: /home/oceanbase/oceanbase
    data_dir: /home/oceanbase/data
    redo_dir: /home/oceanbase/redo
    devname: ens32
    mysql_port: 2881
    rpc_port: 2882
    obshell_port: 2886
    zone: zone1
    cluster_id: 1
    memory_limit: 6G
    system_memory: 1G
    datafile_size: 2G
    datafile_next: 2G
    datafile_maxsize: 20G
    log_disk_size: 4G
    cpu_count: 16
    production_mode: false
    enable_syslog_wf: false
    max_syslog_file_count: 4
    root_password: xx
    enable_syslog_recycle: true

    5. 部署 OceanBase 数据库

    obd cluster deploy oceanbase -c mini-single.yaml

    6. 检查和启动数据库

    /home/oceanbase/oceanbase/bin/observer --version

    obd cluster list

    obd cluster start oceanbase

    obclient -h127.0.0.1 -P2881 -uroot -pDDcampus**88 -A

    mysql -h127.0.0.1 -P2881 -uroot -pDDcampus**88 -A

    设置MySQL 兼容模式

    SHOW VARIABLES LIKE 'ob_compatibility_mode';

    ALTER SYSTEM SET ob_compatibility_mode='mysql';

    7.修改集群配置

    obd cluster edit-config oceanbase

    obd cluster reload obtest

    8.在/etc/systemd/system/目录下创建一个名为oceanbase.service的文件

    [Unit]
    Description=oceanbase
    After=network.target

    [Service]
    Type=forking
    User=root
    EnvironmentFile=/etc/profile.d/obd.sh
    ExecStart=/usr/bin/obd cluster start dcampus
    ExecStop=/usr/bin/obd cluster stop dcampus
    ExecReload=/usr/bin/obd cluster restart dcampus
    LimitNOFILE=65535
    LimitNPR0C=65535

    [Install]
    WantedBy=multi-user.target

    systemctl daemon-reload
    systemctl enable oceanbase.service
    systemctl start oceanbase.service

    二、创建租户

    1.创建资源规格

    登录oceanbase,通过 DBA_OB_UNIT_CONFIGS 视图,获取已有的资源规格信息

    SELECT * FROM oceanbase.DBA_OB_UNIT_CONFIGS;

    通过 CREATE RESOURCE UNIT 语句,创建一个名称为 S1_unit_config 的资源规格,其资源配置为 CPU 为 1 核,内存 5G,日志盘空间 6G。

    CREATE RESOURCE UNIT S1_unit_config
    MEMORY_SIZE = '5G',
    MAX_CPU = 1,
    MIN_CPU = 1,
    LOG_DISK_SIZE = '6G',
    MAX_IOPS = 10000,
    MIN_IOPS = 10000,
    IOPS_WEIGHT=1;

    2.创建资源池

    登录数据库,通过 DBA_OB_RESOURCE_POOLS 视图,获取资源池的配置信息

    SELECT * FROM oceanbase.DBA_OB_RESOURCE_POOLS;

    通过 CREATE RESOURCE POOL 语句,创建一个名为 mq_pool_01 的资源池,在 zone1、zone2 里各创建 1 个 Unit,每个 Unit 的资源规格为 S1_unit_config

    CREATE RESOURCE POOL mq_pool_01 UNIT='S1_unit_config', UNIT_NUM=1, ZONE_LIST=('zone1','zone2');

    3.创建租户

    登录数据库,通过 DBA_OB_TENANTS 视图,查看所有的租户信息。

    SELECT * FROM oceanbase.DBA_OB_TENANTS;

    通过 CREATE TENANT 语句,创建一个名为 mq_t1 的租户(默认为 MySQL 模式租户),副本数为 2,资源池指定为 mq_pool_01,Primary Zone 为 zone1,允许所有 IP 连接数据库。

    租户的副本分布的 Zone List 继承于 resource_pool_list 的 zone_list 属性,租户的副本个数继承于 resource_pool_list 的 zone_list 属性的个数,租户在每个 Zone 的 Unit 个数继承于 resource_pool_list 的 unit_num 属性、租户的 Unit 的资源规格继承于 resource_pool_list 的 unit 属性。

    CREATE TENANT IF NOT EXISTS mq_t1 PRIMARY_ZONE='zone1', RESOURCE_POOL_LIST=('mq_pool_01') set OB_TCP_INVITED_NODES='%';

    4.租户创建成功后,可以尝试登录租户进行使用。

    MySQL 兼容模式:obclient -h172.30.xx.xx -P2883 -uroot@mq_t1#cluster -A

    Oracle 兼容模式:obclient -h172.30.xx.xx -P2883 -usys@oracle_tenant1#cluster -A

  • MySQL逻辑备份mysqldump简介

    一.mysqldump参数介绍

    参数名 描述 启用 弃用
    --add-drop-database 在create database语句前带上drop database语句
    --add-drop-table 在create table语句前带上 drop table语句
    --add-drop-trigger 在create trigger语句前带上 drop trigger语句
    --add-locks 导出的时候,每个表执行LOCK TABLES and UNLOCK TABLES语句
    --all-databases 导出所有的数据库
    --allow-keywords 允许列名为关键字
    --apply-slave-statements 在 STOP SLAVE和START SLAVE之间加上 CHANGE MASTER语句
    --bind-address 用指定的网络接口连接mysql
    --character-sets-dir 字符集文件的目录
    --column-statistics 写ANALYZE TABLE 语句收集统计信息、直方图
    --comments 导出的时候带上comment注释语句
    --compact 导出更少的输出信息(用于调试)。去掉注释和头尾等结构。
    --compatible 导出的数据将和其它数据库或旧版本的MySQL 相兼容。
    值可以为ansi、mysql323、mysql40、
    postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options等,要使用几个
    值,用逗号将它们隔开。它并不保证能完全兼容,而是尽量兼容。
    --complete-insert 使用完整的insert语句(包含列名称)。这么做能提高插入效率,但是可能会受到max_allowed_packet参数的影响而导致插入失败。
    --compress 在客户端和服务器之间启用压缩传递所有信息 8.0.18
    --compression-algorithms 允许连接mysql服务器的时候使用压缩算法 8.0.18
    --create-options 在CREATE TABLE语句中包括所有MySQL特性选项。(默认为打开状态)
    --databases 导出几个数据库。参数后面所有名字参量都被看作数据库名。
    --debug 写debugging日志
    --debug-check 检查内存和打开文件使用说明并退出
    --debug-info 输出调试信息并退出
    --default-auth 需要使用的身份验证插件
    --default-character-set 指定默认的字符集
    --defaults-extra-file 除了通常的选项文件外,还读取指定的选项文件
    --defaults-file 只读取选项文件
    --defaults-group-suffix 选项组后缀值
    --delete-master-logs master备份后删除日志. 这个参数将自动激活--master-data
    --disable-keys 对于每个表,用 /*!40000 ALTER TABLE tbl_name DISABLE KEYS /;
    和 /
    !40000 ALTER TABLE tbl_name ENABLE KEYS */;
    语句引用INSERT语句。
    这样可以更快地导入dump出来的文件,因为它是在插入所有行后创建索引的。
    该选项只适合MyISAM表,默认为打开状态。
    --dump-date 如--comments指定,则dump加上"Dump completed on" date 注释
    --dump-slave 该选项将导致主的binlog位置和文件名追加到导出数据的文件中。
    设置为1时,将会以CHANGE MASTER命令输出到数据文件;
    设置为2时,在命令前增加说明信息。该选项将会打开--lock-all-tables,除非--single-transaction被指定。
    该选项会自动关闭--lock-tables选项。默认值为0。
    --enable-cleartext-plugin 开启cleartext认证插件
    --events 导出数据库的事件
    --extended-insert 使用 multiple-row INSERT 语法
    --fields-enclosed-by 输出文件中的各个字段用给定字符包裹。
    与--tab选项一起使用,不能用于--databases和--all-databases选项
    --fields-escaped-by 输出文件中的各个字段忽略给定字符。
    与--tab选项一起使用,不能用于--databases和--all-databases选项
    --fields-optionally-enclosed-by 输出文件中的各个字段用给定字符选择性包裹。
    与--tab选项一起使用,不能用于--databases和--all-databases选项
    --fields-terminated-by 输出文件中的各个字段用给定字符包裹。
    与--tab选项一起使用,不能用于--databases和--all-databases选项
    --flush-logs 开始导出之前刷新日志
    --flush-privileges 在导出mysql数据库之后,发出一条FLUSH PRIVILEGES 语句。
    --force 即便dump报错依旧继续导出
    --get-server-public-key 从服务器请求 RSA public key
    --help 显示帮助信息并退出
    --hex-blob 用十六进制记数法导出binary列
    --host mysql所在服务器信息
    --ignore-error 忽略指定的报错
    --ignore-table 不导出指定的表
    --include-master-host-port 在--dump-slave产生的'CHANGE MASTER TO..'
    语句中增加'MASTER_HOST=<host>,MASTER_PORT=<port>'
    --insert-ignore 在插入行时使用INSERT IGNORE语句.
    --lines-terminated-by 输出文件的每行用给定字符串划分。
    与--tab选项一起使用,不能用于--databases和--all-databases选项。
    --lock-all-tables 提交请求锁定所有数据库中的所有表,以保证数据的一致性
    使用flush table with read lock来获取全局的一致性备份
    --lock-tables 导出前锁定表
    --log-error 将警告和错误输出到指定文件
    --login-path 从.mylogin.cnf读取 login path
    --master-data 该选项将binlog的位置和文件名追加到输出文件中。
    如果为1,将会输出CHANGE MASTER 命令;
    如果为2,输出的CHANGE MASTER命令前添加注释信息。
    该选项将打开--lock-all-tables 选项,除非--single-transaction也被指定(在这种情况下,全局读锁在开始导出时获得很短的时间;
    其他内容参考下面的--single-transaction选项)。
    该选项自动关闭--lock-tables选项。
    --max-allowed-packet 服务器发送和接受的最大包长度。
    --net-buffer-length TCP/IP和socket连接的缓存大小。
    --network-timeout 增加网络超时选项,允许大表的导出
    --no-autocommit 使用autocommit/commit 语句包裹表。
    --no-create-db 导出文件中不包含CREATE DATABASE语句
    --no-create-info 导出文件中不包含 CREATE TABLE语句
    --no-data 只导出数据库表结构,不导出数据
    --no-defaults 不读取任何选项文件
    --no-set-names 同 --skip-set-charset 选项
    --no-tablespaces 导出文件中不包含 CREATE LOGFILE GROUP 和 CREATE TABLESPACE 语句
    --opt --add-drop-table --add-locks --create-options --disable-keys --extended-insert
    --lock-tables --quick --set-charset的缩写
    --order-by-primary 导出的数据根据表的主键或唯一索引进行排序
    --password 登陆mysql服务器用户的密码
    --pipe 使用命名管道连接mysql(windows独有)
    --plugin-dir 插件安装的目录
    --port TCP/IP 连接的端口
    --print-defaults 打印出默认的options
    --protocol 使用的连接协议,包括:tcp, socket, pipe, memory.
    --quick 不缓冲查询,直接导出到标准输出。默认为打开状态,使用--skip-quick取消该选项。
    --quote-names 使用(`)引起表和列名。默认为打开状态,使用--skip-quote-names取消该选项。
    --replace 使用REPLACE INTO 取代INSERT INTO.
    --result-file 直接输出到指定文件中。
    --routines 导出存储过程以及自定义函数。
    --server-public-key-path RSA public key 所在的目录及文件
    --set-charset 增加SET NAMES default_character_set 输出
    --set-gtid-purged 是否增加 SET @@GLOBAL.GTID_PURGED 到输出
    --shared-memory-base-name 共享内存连接使用的共享内存名称(windows独有)
    --show-create-skip-secondary-engine CREATE TABLE语句中排除第二种存储引擎 8.0.18
    --single-transaction 该选项在导出数据之前提交一个BEGIN SQL语句,
    BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。
    它只适用于多版本存储引擎,仅InnoDB。
    本选项和--lock-tables 选项是互斥的,因为LOCK TABLES 会使任何挂起的事务隐含提交。
    要想导出大表的话,应结合使用--quick 选项。
    --skip-add-drop-table 输出的create table语句前不包含drop table语句
    --skip-add-locks 不加锁
    --skip-comments 不加备注文件到输出
    --skip-compact 输出的文件不压缩
    --skip-disable-keys 不禁用 keys
    --skip-extended-insert 关闭extended-insert
    默认导出:INSERT INTO t3 VALUES (1,'aaaaaaaa'),(2,'bbbbbbbb'),(3,'cccccccccc');
    开启后 INSERT INTO t3 VALUES (1,'aaaaaaaa');
    INSERT INTO t3 VALUES (2,'bbbbbbbb');
    INSERT INTO t3 VALUES (3,'cccccccccc');
    除非必要,不然不要开启,文件过大,执行性能也差
    --skip-opt 关闭--opt选项
    --skip-quick 不从服务器一次检索表的行
    --skip-quote-names 不引用标识符
    --skip-set-charset 不加 SET NAMES语句
    --skip-triggers 不导出触发器
    --skip-tz-utc 关闭 tz-utc
    --socket socket文件
    --ssl-ca ssl安全相关
    --ssl-capath ssl安全相关
    --ssl-cert ssl安全相关
    --ssl-cipher ssl安全相关
    --ssl-crl ssl安全相关
    --ssl-crlpath ssl安全相关
    --ssl-fips-mode ssl安全相关
    --ssl-key ssl安全相关
    --ssl-mode ssl安全相关
    --tab 为每个表在给定路径创建tab分割的文本文件。要求mysqldump在mysql服务器上
    --tables 覆盖--databases (-B)参数,指定需要导出的表名
    --tls-ciphersuites 允许用于加密连接的TLSv1.3密码套件 8.0.16
    --tls-version 允许加密连接的TLS协议
    --triggers 导出触发器。该选项默认启用,用--skip-triggers禁用它。
    --tz-utc 在输出文件中增加 SET TIME_ZONE='+00:00'
    --user 登陆mysql服务器的用户名
    --verbose 输出多种平台信息。
    --version 输出版本信息并退出
    --where 只转储给定的WHERE条件选择的记录。
    请注意如果条件包含命令解释符专用空格或字符,一定要将条件引用起来。
    --xml 生成XML输出
    --zstd-compression-level 使用zstd压缩的到服务器的连接的压缩级别 8.0.18
  • 达梦数据库操作说明

    数据库实例名:DMDB
    数据库名:DMDB
    数据库超级管理员账号/密码:SYSDBA/n@dameng123
    数据库审计员账号/密码:SYSAUDITOR/n@dameng123
    数据库安全员账号/密码:SYSSSO/SYSSSO
    数据库默认端口:5236

    数据库安装版本:DM Database Server 64 V8
    数据库软件安装路径:/home/dmdba/dmdbms
    数据库数据文件路径:/dmdata/dmdb
    数据库归档文件路径:/dmdata/dmarch
    归档空间限制:200G #如果不够可调整
    数据库备份文件路径:/dmdata/dmbak
    数据库驱动路径:/home/dmdba/dmdbms/drivers
    数据库文档路径:/home/dmdba/dmdbms/doc
    数据库日志路径:/home/dmdba/dmdbms/log

    2、数据库客户端命令工具:
    su - dmdba
    cd /home/dmdba/dmdbms/bin
    ./disql SYSDBA/'"n@dameng123"':5236
    说明:密码含特殊字符使用单引号+双引号包围起来

    3、数据库图形化管理工具:
    客户端管理工具:manager
    cd /home/dmdba/dmdbms/tool
    ./manager

    4、数据库数据迁移工具:
    ./dts

    5、数据库服务重启步骤:
    su - dmdba
    cd /home/dmdba/dmdbms/bin
    ./DmServicedmdb start
    ./DmServicedmdb stop

    查看数据库服务进程
    ps -ef|grep dmserver

    6,sqlark工具的安装使用

    https://www.sqlark.com

    7,创建用户和表空间,禁止使用系统默认的用户(SYSDBA)和表空间(main)存放业务数据。

    工具和驱动下载
    https://eco.dameng.com/download/
    技术文档
    https://eco.dameng.com/document/dm/zh-cn/start/install-dm-windows-prepare.html

    示例:

    • 创建用户
      create user casinfo identified by "Casinfo@dameng123";
    • 用户角色分配,管理工具上看有什么角色,根据具体情况而定,DBA角色应该是不用分配给应用账号的。
      grant dba,resource,public,soi,vti,svi to casinfo;

    select * from dba_role_privs where grantee='casinfo';

    -创建表空间,指定用户的默认表空间
    (数据文件存放在跟其他数据文件一样的就行,注意文件名不能一样,以下指定每个数据文件10G,视实际情况而定,不够再加数据文件,要留意空间是否足够)

    select * from v$tablespace;
    select path from v$datafile;

    //数据表空间
    create tablespace casinfo datafile '/dmdata/dmdb/casinfo01.dbf' size 128 autoextend on next 128 maxsize 10240;
    alter tablespace casinfo add datafile '/dmdata/dmdb/casinfo02.dbf' size 128 autoextend on next 128 maxsize 10240;

    //索引表空间
    create tablespace casinfo_index datafile '/dmdata/dmdb/casinfo_index01.dbf' size 128 autoextend on next 128 maxsize 10240;

    //设置用户的默认表空间
    alter user casinfo default tablespace casinfo;
    alter user casinfo default index tablespace casinfo_index;

    //查询用户表空间信息
    select username,user_id,default_tablespace,default_index_tablespace
    from dba_users;

  • Headscale vpn安装

    一、服务端安装

    wget -O /usr/local/bin/headscale https://github.com/juanfont/headscale/releases/download/v0.24.0/headscale_0.24.0_linux_amd64
    chmod +x /usr/local/bin/headscale
    ln -s /usr/local/bin/headscale /usr/bin/headscale

    #创建配置目录

    useradd headscale

    mkdir -p /etc/headscale

    #创建目录用来存储数据与证书

    mkdir -p /var/lib/headscale

    #创建空的 SQLite 数据库文件

    touch /var/lib/headscale/db.sqlite

    mkdir /var/run/headscale

    chown -R headscale:headscale /etc/headscale

    chown -R headscale:headscale /var/lib/headscale

    chown -R headscale:headscale /var/run/headscale

    #创建配置文件

    wget https://github.com/juanfont/headscale/raw/main/config-example.yaml -O /etc/headscale/config.yaml

    vi config.yaml

    server_url: http://nps.xx.com:54321

    listen_addr: 0.0.0.0:54321

    v4: 172.16.0.0/16

    # v6: fd7a:115c:a1e0::/48

    magic_dns: false

    创建服务启动文件

    vi /etc/systemd/system/headscale.service

    [Unit]
    Description=headscale controller
    After=syslog.target
    After=network.target
    [Service]
    Type=simple
    User=headscale
    Group=headscale
    ExecStart=/usr/local/bin/headscale serve
    Restart=always
    RestartSec=5
    # Optional security enhancements
    NoNewPrivileges=yes
    PrivateTmp=yes
    ProtectSystem=strict
    ProtectHome=yes
    ReadWritePaths=/var/lib/headscale /var/run/headscale AmbientCapabilities=CAP_NET_BIND_SERVICE
    RuntimeDirectory=headscale
    [Install]
    WantedBy=multi-user.target

    启动

    systemctl daemon-reload
    systemctl enable --now headscale

    创建租户

    headscale users create default

    headscale users list

    二、安装derper中继服务

    安装golang环境

    yum remove golang

    wget https://golang.google.cn/dl/go1.23.5.linux-amd64.tar.gz

    tar -zxvf go1.23.5.linux-amd64.tar.gz -C /usr/local/

    vi /etc/profile

    export GOROOT=/usr/local/go
    export GOPATH=/usr/local/gopath
    export GOBIN=$GOPATH/bin
    export PATH=$PATH:$GOROOT/bin
    export PATH=$PATH:$GOPATH/bin

    source /etc/profile

    go env -w GOPROXY=https://goproxy.cn,direct

    go env -u GOPROXY

    go install tailscale.com/cmd/derper@latest

    yum install supervisor

    vi /etc/supervisord.conf

    [include]
    files = supervisord.d/*.conf

    vi /etc/supervisord.d/derper.conf

    [program:derper]
    command=/usr/local/gopath/bin/derper -hostname=nps.xx.com -c /root/derper.conf -certmode manual -certdir /home/dcampuscomkey -a :44321 -http-port -1 -stun -stun-port 3478
    user=root
    redirect_stderr=true
    stdout_logfile=/var/log/supervisor/derper.log
    stderr_logfile=/var/log/supervisor/derper-err.log
    stdout_logfile_maxbytes=10MB
    stdout_logfile_backups=1

    systemctl restart supervisord

    systemctl enable supervisord

    跟换derp启动,验证加密

    command=/usr/local/gopath/bin/derper -hostname=nps.dcampus.com -c /root/derper.conf -certmode manual -certdir /home/dcampuscomkey -a :44321 -http-port -1 -stun -stun-port 3478 --verify-clients=true

    vi /etc/headscale/config.yaml

    # - https://controlplane.tailscale.com/derpmap/default

    enabled: disable

    paths:

    - /etc/headscale/derp.yaml

    vi /etc/headscale/derp.yaml

    regions:
    901:
    regionid: 901
    regioncode: nps
    regionname: xx
    nodes:
    - name: 1
    regionid: 901
    hostname: 'nps.xx.com'
    ipv4: 'x.x.x.x'
    stunport: 3478
    stunonly: false
    derpport: 44321

    重启headscale,客户端查看: tailscale netcheck

    三、客户端安装

    Linux:

    参考https://pkgs.tailscale.com/stable/

    # 将 换成你的 Headscale 公网 IP 或域名

    tailscale up --login-server=http://nps.xxx.com:54321 --accept-routes=true --accept-dns=false --advertise-routes=172.16.99.0/24 --advertise-exit-node --reset
    #这里推荐将 DNS 功能关闭,因为它会覆盖系统的默认 DNS

    执行完上面的命令后,会出现链接信息,浏览器打开链接

    将其中的命令复制粘贴到 headscale 所在机器的终端中,将USERNAME替换前面创建的租户default

    注册成功,查看注册的节点:headscale nodes list

    Windows:

    安装客户端,完成后需要以管理员身份打开命令行,将其中修改注册表命令粘贴执行

    REG ADD "HKLM\Software\Tailscale IPN" /v UnattendedMode /t REG_SZ /d always
    REG ADD "HKLM\Software\Tailscale IPN" /v LoginURL /t REG_SZ /d "http://nps.xx.com:54321"

    登录命令,将其中的命令粘贴到 Headscale 所在主机的终端,将 USERNAME 替换为之前创建的 USERNAME,然后执行命令即可

    tailscale login --login-server=http://nps.xx.com:54321 --accept-routes=true --accept-dns=false

    headscale node list

    四、打通局域网

    到目前为止我们只是打造了一个点对点的 Mesh 网络,各个节点之间都可以通过 WireGuard 的私有网络 IP 进行直连。 我们可以通过适当的配置让每个节点都能访问其他节点的局域网 IP

    配置路由转发

    echo 'net.ipv4.ip_forward = 1' | tee /etc/sysctl.d/ipforwarding.conf
    echo 'net.ipv6.conf.all.forwarding = 1' | tee -a /etc/sysctl.d/ipforwarding.conf
    sysctl -p /etc/sysctl.d/ipforwarding.conf

    客户端重新执行注册命令

    客户端修改注册节点的命令,在原来命令的基础上加上参数 --advertise-routes=172.16.99.0/24,告诉 Headscale 服务器“我这个节点可以转发这些地址的路由”

    tailscale up --login-server=http://nps.xxx.com:54321 --accept-routes=true --accept-dns=false --advertise-routes=172.16.99.0/24 --advertise-exit-node --reset

    #Headscale 服务端开启路由,查看路由

    # headscale routes list

    #开启路由

    # headscale routes enable -r 1

    #其他节点查看路由结果

    ip route show table 52|grep "192.168.1.0/24"

    五、命令

    创建一个9999天的密钥

    headscale apikeys create --expiration 9999d

    # 根据id删除指定的节点

    headscale node delete -i <ID>

  • linux NPS vpn安装

    1、官方下载
    官方下载地址:https://github.com/ehang-io/nps/releases

    2.服务器端安装

    tar xzvf linux_amd64_server.tar.gz

    ./nps install

    vi /etc/nps/conf/nps.conf

    http_proxy_port=8080
    https_proxy_port=443

    public_vkey=xx

    web_host=nps.xx.com
    web_username=admin
    web_password=xx
    web_port = 8282

    disconnect_timeout=600

    nps start | stop

    查询版本
    nps --version

    访问http://nps.xx.com:8282

    先建客户端,再建隧道

    3.客户端安装

    tar xzvf linux_amd64_client.tar.gz

    # 连接服务端(后台启动,日志在 nps.txt)

    ./npc -server=${您服务器的IP地址}:${bridge_port} -vkey=${vkey}

    nohup ./npc -server=39.103.xx.xx:8024 -vkey=1ziiu0cg65ybsl7h -type=tcp > /home/nps/nps.txt &

    或:

    vi conf/npc.conf

    server_addr=nps.xx.com:8024

    vkey=krs5yxxxxxxxxxx

    只保留tcp即可

    [tcp]
    mode=tcp
    target_addr=127.0.0.1:22
    server_port=22022

    /usr/bin/nohup ./npc -config=conf/npc.conf &

    客户端监控vi monitor.sh

    #! /bin/bash

    cd /root/
    PCOUNT=ps -ef|grep npc|grep -v grep|wc -l
    echo $PCOUNT

    if [ $PCOUNT -eq 0 ]; then
    echo "Starting process…" >> /root/logs/restart.log
    echo $(date +"%y-%m-%d %H:%M:%S")-"restart service" >>/root/logs/restart.log

    #这个是你启动脚本的目录

    /usr/bin/nohup /root/npc -config=/root/conf/npc.conf &
    else
    echo $(date +"%y-%m-%d %H:%M:%S")-"Process is running!" >> /root/logs/restart.log
    fi

  • 虚拟机克隆后网络更新配置

    编辑以下文件为最新网卡

    vi /etc/sysconfig/network-scripts/ifcfg-eth0

    vi /etc/udev/rules.d/70-persistent-net.rules

  • Syncthing安装和使用

    一、什么是Syncthing?
    Syncthing 是一个自由的开源文件同步工具,支持多平台,包括Linux、macOS、Windows、Android等。它的最大亮点是完全去中心化,不依赖云端服务器,数据传输加密,极大保护了用户隐私。

    二、安装Syncthing
    1.github下载最新二进制包
    releases:https://github.com/syncthing/syncthing/releases
    安卓:https://github.com/syncthing/syncthing-android

    tar -xzvf syncthing-linux-amd64-v1.29.12.tar.gz

    mv syncthing /usr/bin/syncthing

    或者直接 yum install syncthing

    useradd syncthing

    2.启动Syncthing

    先syncthing用户启动 syncthing 生成配置文件

     syncthing -paths 找到 config.xml 这项,vim编辑config.xml文件内容

    vi /home/syncthing/.local/state/syncthing/config.xml

    将127.0.0.1:8384改成0.0.0.0:8384

    配置完成后重新启动: syncthing

    chmod 777 /usr/bin/sync*

    三、设置开机自启动
    创建系统服务
    sudo vi /etc/systemd/system/syncthing.service
    在文件中输入以下内容:
    [Unit]
    Description=Syncthing - Open Source Continuous File Synchronization
    Documentation=https://docs.syncthing.net/
    After=network.target
    [Service]
    #你的用户名如:syncthing 或 root
    User=syncthing
    ExecStart=/usr/bin/syncthing -no-browser
    [Install]
    WantedBy=multi-user.target


    其中:-no-browser 是 Syncthing 的一个启动选项,表示在启动 Syncthing 时不自动打开浏览器访问管理界面。
    保存并退出后,执行以下命令启用服务:
    重新加载systemd
    sudo systemctl daemon-reload
    启用并启动Syncthing服务
    sudo systemctl enable syncthing
    sudo systemctl start syncthing

    四、配置Syncthing
    1.配置防火墙
    在使用 Syncthing 时,除了 8384 端口(用于 Web UI),你还需要确保以下端口开放:
    22000:用于同步数据的主要端口。
    21027(UDP):用于局域网发现和连接。
    2.添加同步文件夹
    进入Web界面后,你可以点击“添加文件夹”按钮,选择需要同步的本地文件夹。注意,每个同步的文件夹都可以设置唯一的ID和不同的权限。
    3.添加同步设备
    点击页面中的“添加远程设备”,输入对方设备的ID(可以从对方Syncthing管理界面获取)。双方设备会自动互相配对,一旦连接成功,就可以开始同步了。

  • ubuntu 20.4 安装 openssl 3.x

    # 下载 openssl 源代码压缩包

    wget https://www.openssl.org/source/openssl-3.0.15.tar.gz

    # 安装编译包

    sudo apt-get install -y g++

    sudo apt-get install -y make

    sudo apt-get install -y perl

    # 解压源代码压缩包

    tar -zxf openssl-3.0.15.tar.gz

    #切换到解压后的源代码目录

    cd openssl-3.0.15/

    # 配置编译项

    sudo ./config --prefix=/usr/local/openssl

    # 编译,-j32是用32线程编译,速度更快

    sudo make -j32

    # 安装 openssl

    sudo make install

    # 安装 openssl

    sudo make install

    # 备份原来 openssl

    mv /usr/bin/openssl /usr/bin/openssl.back

    # 创建软链接到系统位置

    sudo ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl

    #sudo ln -s /usr/local/openssl/lib64/libssl.so.3 /usr/lib/libssl.so.3

    #sudo ln -s /usr/local/openssl/lib64/libcrypto.so.3 /usr/lib/libcrypto.so.3

    # 将openssl的库添加到系统,ubuntu 64位:lib64,32位:lib

    sudo echo '/usr/local/openssl/lib64' > /etc/ld.so.conf.d/openssl.conf

    # 查看openssl版本

    openssl version

  • Linux系统发送邮件配置

    1、环境安装

    yum install -y sendmail

    yum install -y mailx

    2、检查sendmail服务

    启动:systemctl start sendmail.service

    设置开机启动:systemctl enable sendmail.service

    3、vim /etc/mail.rc添加以下信息:

    set from=your_email@163.com      # 发送邮件的邮箱
    set smtp=smtp.163.com:465            # 邮箱域名,注意端口号,465或587
    set smtp-auth-user=your_email@163.com   # 邮箱账号
    set smtp-auth-password=your_password_or_auth_code  # 邮箱登录密码或授权码
    set smtp-auth=login
    set ssl-verify=ignore            # 忽略SSL证书验证(根据实际情况可能需要调整)

    QQ邮箱配置:

    set from=xxxxx@qq.com  #写你的qq邮箱

    set smtp=smtp.qq.com:587 #不变 第三方发送邮件的地址,端口号是:465或587

    set smtp-auth-user=xxxxx@qq.com #写你的qq邮箱

    set smtp-auth-password=asasasasasas #写你的qq邮箱第三方授权码

    set smtp-auth=login  #不变 这是smtp的认证方式,写login就行

    4、使用指令测试:

    发送普通邮件:
    echo "这是一个带附件的邮件" |mail -s "测试邮件" xx@163.com

    echo "hello,world"|mailx -v -s "test" xx@163.com
    发送带附件的邮件
    echo "这是一个带附件的邮件" |mail -s "测试邮件" -a file.txt xx@qq.com

    5.邮件指令:

    检查邮件队列的状态:postqueue -p

    除队列中的所有邮件:postsuper -d ALL

  • 服务器从阿里云同步时间

    一、centos 7

    yum -y install ntpdate

    ntpdate ntp1.aliyun.com

    crontab -e

    01 01 * * * /usr/sbin/ntpdate ntp1.aliyun.com

    二、centos 8

    yum -y install chrony

    //注释pool 2.centos.pool.ntp.org iburst
    sed -i 's/^pool 2.centos.pool.ntp.org iburst/#&/' /etc/chrony.conf
    //添加三个阿里云NTP的服务器
    echo -e "server ntp1.aliyun.com iburst\nserver ntp2.aliyun.com iburst\nserver ntp3.aliyun.com iburst" | sudo tee -a /etc/chrony.conf

    systemctl restart chronyd

    systemctl enable chronyd

  • mysql安装审计插件

    一、插件地址

    https://github.com/mcafee/mysql-audit

    解压

    # unzip audit-plugin-mysql-5.7-1.1.4-725-linux-x86_64.zip

    将下载到的插件安装包中lib/libaudit_plugin.so复制到mysql插件目录中,并加上执行权限

    查看当前mysql插件目录

    show global variables like 'plugin_dir';

    拷贝插件到目录,并赋权

    chown -R mysql:mysql

    chown -R 775 插件

    执行插件安装包中的offset-extract.sh,获取offsets值对插件安装包中的offset-extract.sh赋执行权限并运行,获取offsets值
    chmod +x utils/offset-extract.sh
    ./utils/offset-extract.sh /usr/sbin/mysqld

    从第3列7832开始到0为offsets值。

    添加配置my.cnf

    [mysqld]
    audit_json_file = on
    plugin-load=AUDIT=libaudit_plugin.so
    audit_record_cmds='insert,delete,update,create,drop,alter,grant,truncate'
    audit_json_log_file=/home/mysql/mysql-audit.json
    audit_offsets =7832, 7880, 3640, 4800, 456, 360, 0, 32, 64, 160, 544, 7996, 4368, 3656, 3664, 3668, 6080, 2072, 8, 7064, 7104, 7088, 13480, 148, 672, 0

    进入mysql命令窗口,安装插件

    INSTALL PLUGIN AUDIT SONAME 'libaudit_plugin.so';

    查看版本:

    show global status like '%audit%';

    查看插件有哪些可配置的参数:

    SHOW GLOBAL VARIABLES LIKE '%audi%';

    插件卸载 

    需要在 my.cnf 中 [mysqld] 下添加 audit_uninstall_plugin=1,重启mysql。重启完毕后执行两次 UNINSTALL PLUGIN AUDIT; 即可卸载。

    卸载完成后需要从 my.cnf 中删除 audit_uninstall_plugin=1 ,否则下次mysql启动会报错:[ERROR] /data/mysql/bin/mysqld: unknown variable 'audit_uninstall_plugin=1'

  • git查找删除大文件

    一、查看哪些历史提交过文件占用空间较大

    git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"

    二、删除大文件

    git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch big-file.ipa' --prune-empty --tag-name-filter cat -- --all
    // 说明
    上面脚本中的big-file.ipa请换成你第一步查出的大文件名,或者这里直接写一个目录。

    Cannot rewrite branches: You have unstaged changes

    解决方案:执行 :git stash

    三、推送修改后的repo

    git push origin master --force

    四、清理和回收空间

    rm -rf .git/refs/original/

    git reflog expire --expire=now --all

    git gc --prune=now

  • RocketMQ的下载与安装

    一、下载地址

    https://rocketmq.apache.org/download

    二、安装

    1.解压

    unzip rocketmq-all-5.2.0-bin-release.zip

    2.修改conf目录配置文件

    vi broker.conf

    增加:brokerIP1=本机IP

    autoCreateTopicEnable= true

    3.修改bin目录配置文件

    vi runbroker.sh

    vi runserver.sh

    4.启动

    nohup sh mqnamesrv &

    nohup sh mqbroker -n localhost:9876 &

    5.操作主题

    ./mqadmin topicList -n localhost:9876

    ./mqadmin updatetopic -n localhost:9876 -c DefaultCluster -t TestTopic -a +message.type=NORMAL

    ./mqadmin deleteTopic -n localhost:9876 -c DefaultCluster -t TestTopic

    6.日志

    cat logs/rocketmqlogs/namesrv.log

  • docker-wordpress

    1.Dockerfile_wordpress

    # This wordpress Dockerfile
    # Version 20240222

    # Base images 基础镜像
    FROM dockerstorage.xxx.com:5533/nginx/nginx-base:latest

    #ENV 设置环境变量
    #ENV PATH=$HOME/bin:$PATH
    #ENV CLASSPATH=.:$CLASSPATH

    #ADD 文件放在当前目录下,拷过去会自动解压
    ADD latest-zh_CN.tar.gz /home/
    ADD nginx.conf /usr/local/nginx/conf/
    ADD wp-content/upgrade /home/wordpress/wp-content/upgrade
    ADD wp-content/themes /home/wordpress/wp-content/themes
    ADD wp-content/plugins /home/wordpress/wp-content/plugins
    ADD wp-content/mu-plugins /home/wordpress/wp-content/mu-plugins
    ADD wp-content/languages /home/wordpress/wp-content/languages
    ADD .htaccess /home/wordpress/
    ADD wp-config.php /home/wordpress/

    #WORKDIR 相当于cd
    WORKDIR /home
    RUN chmod -R 777 /home/wordpress

    #CMD 运行以下命令
    CMD /home/run.sh && tail -f /dev/null

    2.docker-compose.yml

    # 编排服务(容器),每个服务启动一个镜像
    # Time: 20240222
    version: '3'

    services:
    wordpress:
    restart: always
    # env_file:
    # - .env
    image: dockerstorage.xxx.com:5533/wordpress/dockerwordpress1:2024v1
    build:
    context: ./
    dockerfile: Dockerfile_wordpress
    ports:
    - "3301:80"
    volumes:
    - ./wp-content/uploads:/home/wordpress/wp-content/uploads
    - ./wp-content/upgrade:/home/wordpress/wp-content/upgrade
    - ./wp-content/themes:/home/wordpress/wp-content/themes
    - ./wp-content/plugins:/home/wordpress/wp-content/plugins
    - ./wp-content/mu-plugins:/home/wordpress/wp-content/mu-plugins
    - ./wp-content/languages:/home/wordpress/wp-content/languages
    - ./.htaccess:/home/wordpress/.htaccess
    - ./wp-config.php:/home/wordpress/wp-config.php
    - ./nginx.conf:/usr/local/nginx/conf/nginx.conf
    environment:
    - utf8
    - TZ=Asia/Shanghai
    extra_hosts:
    - "dockermysql.xxx.com:host-gateway"
    dns:
    - 114.114.114.114
    - 223.5.5.5
    - 8.8.8.8
    networks:
    - basic
    ulimits:
    nproc:
    soft: 65535
    hard: 65535
    nofile:
    soft: 65535
    hard: 65535

    networks:
    basic:
    driver: bridge

    3.wp-config.php

    /**
    * The base configuration for WordPress
    *
    * The wp-config.php creation script uses this file during the installation.
    * You don't have to use the web site, you can copy this file to "wp-config.php"
    * and fill in the values.
    *
    * This file contains the following configurations:
    *
    * * Database settings
    * * Secret keys
    * * Database table prefix
    * * ABSPATH
    *
    * @link https://wordpress.org/documentation/article/editing-wp-config-php/
    *
    * @package WordPress
    */
    $_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];

    // ** Database settings - You can get this info from your web host ** //
    /** The name of the database for WordPress */

    if (strstr($_SERVER['HTTP_HOST'], 'dockerwp1.xxx.com')) {
    define( 'DB_NAME', 'xxx' );

    /** Database username */
    define( 'DB_USER', 'xxx' );

    /** Database password */
    define( 'DB_PASSWORD', 'xxx' );

    /** Database hostname */
    define( 'DB_HOST', 'dockermysql.xxx.com:3306' );

    /** Database charset to use in creating database tables. */
    define( 'DB_CHARSET', 'utf8mb4' );

    /** The database collate type. Don't change this if in doubt. */
    define( 'DB_COLLATE', '' );

    } else {
    define( 'DB_NAME', 'xxx' );

    /** Database username */
    define( 'DB_USER', 'xxx' );

    /** Database password */
    define( 'DB_PASSWORD', 'xxx' );

    /** Database hostname */
    define( 'DB_HOST', 'dockermysql.xxx.com:3306' );

    /** Database charset to use in creating database tables. */
    define( 'DB_CHARSET', 'utf8mb4' );

    /** The database collate type. Don't change this if in doubt. */
    define( 'DB_COLLATE', '' );

    }

    /**#@+
    * Authentication unique keys and salts.
    *
    * Change these to different unique phrases! You can generate these using
    * the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}.
    *
    * You can change these at any point in time to invalidate all existing cookies.
    * This will force all users to have to log in again.
    *
    * @since 2.6.0
    */
    define( 'AUTH_KEY', 'put your unique phrase here' );
    define( 'SECURE_AUTH_KEY', 'put your unique phrase here' );
    define( 'LOGGED_IN_KEY', 'put your unique phrase here' );
    define( 'NONCE_KEY', 'put your unique phrase here' );
    define( 'AUTH_SALT', 'put your unique phrase here' );
    define( 'SECURE_AUTH_SALT', 'put your unique phrase here' );
    define( 'LOGGED_IN_SALT', 'put your unique phrase here' );
    define( 'NONCE_SALT', 'put your unique phrase here' );

    /**#@-*/

    /**
    * WordPress database table prefix.
    *
    * You can have multiple installations in one database if you give each
    * a unique prefix. Only numbers, letters, and underscores please!
    */
    $table_prefix = 'wp_';

    /**
    * For developers: WordPress debugging mode.
    *
    * Change this to true to enable the display of notices during development.
    * It is strongly recommended that plugin and theme developers use WP_DEBUG
    * in their development environments.
    *
    * For information on other constants that can be used for debugging,
    * visit the documentation.
    *
    * @link https://wordpress.org/documentation/article/debugging-in-wordpress/
    */
    define( 'WP_DEBUG', false );

    /* Add any custom values between this line and the "stop editing" line. */
    /*内存配置*/
    define('WP_MEMORY_LIMIT', '2048M');
    /*域名配置
    define( 'SUNRISE', 'on' );*/
    /*多站点*/
    define('WP_ALLOW_MULTISITE', true);

    define('MULTISITE', true);
    /*子目录*/
    define('SUBDOMAIN_INSTALL', false);
    define('DOMAIN_CURRENT_SITE', 'dockerwp1.xxx.com');
    define('PATH_CURRENT_SITE', '/');
    define('SITE_ID_CURRENT_SITE', 1);
    define('BLOG_ID_CURRENT_SITE', 1);
    /* That's all, stop editing! Happy publishing. */

    /* wordpress后台编辑网站地址http改成https后,后台进不去解决办法。
    define('FORCE_SSL_ADMIN', true);
    define('FORCE_SSL_LOGIN', true);
    $_SERVER['HTTPS'] = 'ON';
    define( 'CONCATENATE_SCRIPTS', false );*/

    /** Absolute path to the WordPress directory. */
    if ( ! defined( 'ABSPATH' ) ) {
    define( 'ABSPATH', dirname( __FILE__ ) . '/' );
    }
    define("FS_METHOD", "direct");
    define("FS_CHMOD_DIR", 0777);
    define("FS_CHMOD_FILE", 0777);
    /** Sets up WordPress vars and included files. */
    require_once ABSPATH . 'wp-settings.php';

    4.nginx.conf

    user  nginx;
    worker_processes  4;
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    worker_rlimit_nofile 65535;
    events {
        use epoll;
        worker_connections 65535;
    }
    
    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;
    
        server_tokens off;
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 600;
    
        gzip on;
        gzip_min_length 4k;
        gzip_buffers 8 1024k;
        gzip_http_version 1.1;
        gzip_comp_level 6;
        gzip_types text/plain text/javascript text/css text/xml application/json application/javascript application/x-javascript application/xml;
        gzip_vary on;
    
        server_names_hash_bucket_size 2048;
        client_header_buffer_size 1024k;
        large_client_header_buffers 8 1024k;
        client_max_body_size 1024M;
        client_header_timeout 300;
        client_body_timeout 300;
        send_timeout 300;
    	
        #用于tomcat反向代理,解决nginx 504错误
        proxy_connect_timeout 300; #单位秒
        proxy_send_timeout 300;
        proxy_read_timeout 300;
        proxy_buffer_size 1024k;
        proxy_buffers 8 1024k;
        proxy_busy_buffers_size 2048k;
        proxy_temp_file_write_size 2048k;
    
       fastcgi_connect_timeout 300;
       fastcgi_send_timeout 300;
       fastcgi_read_timeout 300;
       fastcgi_buffer_size 1024k;
       fastcgi_buffers 8 1024k;
       fastcgi_busy_buffers_size 2048k;
       fastcgi_temp_file_write_size 2048k;
       
    #   map $http_host $blogid {
    #    default 0;
    #    include /home/wordpress/wp-content/uploads/nginx-helper/map.conf;
    #   }
    
        server {
            listen       80;
            server_name  localhost;
            access_log  logs/host.access.log  main;
    		
            root   /home/wordpress/;
            index index.php index.html index.htm;
    
            location / {
                try_files $uri $uri/ /index.php?$args;
            }
    		
    #		location ~ ^/[_0-9a-zA-Z-]+/files/(.*)$ {
    #            try_files /wp-content/blogs.dir/$blogid/files/$2 /wp-includes/ms-files.php?file=$2 ;
    #            access_log off; log_not_found off; expires max;
    #        }
    
            #avoid php readfile()
            location ^~ /blogs.dir {
                internal;
                alias /home/wordpress/wp-content/blogs.dir ;
                access_log off; log_not_found off;      expires max;
            }
    
            if (!-e $request_filename) {
                rewrite /wp-admin$ $scheme://$host$uri/ permanent;
                rewrite ^/[_0-9a-zA-Z-]+(/wp-.*) $1 last;
                rewrite ^/[_0-9a-zA-Z-]+(/.*\.php)$ $1 last;
            }
    		
            location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                expires max;
                log_not_found off;
            }
    
            #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;
            }
    
            # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
            #
            location ~.*\.php$ {
                root           /home/wordpress/;
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include        fastcgi_params;
    			
                proxy_redirect off;
                #获取到的 Host 包含浏览器请求的 IP
                proxy_set_header Host $host;
                #获取到的 Host 包含浏览器请求的 IP 和端口
                #proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
                ###允许跨域
                add_header Access-Control-Allow-Origin $http_origin;
                add_header Access-Control-Allow-Credentials true;
                ##禁用缓存
                proxy_buffering off;
            }
    
            # deny access to .htaccess files, if Apache's document root
            # concurs with nginx's one
            #
            #location ~ /\.ht {
            #    deny  all;
            #}
        }
    
    
        # 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;
        #    }
        #}
    
    }
    
  • docker-nginx

    1.Dockerfile_nginx

    # This nginx Dockerfile
    # Version 20240206

    # Base images 基础镜像
    FROM dockerstorage.xxx.com:5533/os/anolisos:latest

    #ENV 设置环境变量
    ENV PATH=/usr/local/nginx/sbin:$PATH
    ENV CLASSPATH=.:$CLASSPATH

    #RUN 执行以下命令
    RUN useradd -s /sbin/nologin -M nginx

    #ADD 文件放在当前目录下,拷过去会自动解压
    ADD nginx-1.24.0.tar.gz /home/
    ADD openssl-1.1.1w.tar.gz /home/
    ADD nginx-goodies-nginx-sticky-module-ng.tgz /home/

    #WORKDIR 相当于cd
    WORKDIR /home/nginx-1.24.0

    #编译安装
    RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --http-log-path=/usr/local/nginx/logs/access.log --error-log-path=/usr/local/nginx/logs/error.log --with-file-aio --with-http_ssl_module --with-pcre --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module --add-module=/home/nginx-goodies-nginx-sticky-module-ng --with-openssl=/home/openssl-1.1.1w && make && make install

    #添加启动脚本
    RUN echo '#!/bin/bash' >> /home/run.sh
    RUN echo '/usr/local/php8/sbin/php-fpm' >> /home/run.sh
    RUN echo '/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf' >> /home/run.sh
    RUN chmod 775 /home/run.sh

    #安装libiconv
    ADD libiconv-1.17.tar.gz /home/
    WORKDIR /home/libiconv-1.17
    RUN ./configure && make && make install

    #安装curl
    ADD curl-8.6.0.tar.gz /home/
    WORKDIR /home/curl-8.6.0
    RUN ./configure --without-nss --with-ssl && make && make install

    #安装php
    ADD php-8.2.14.tar.gz /home/
    WORKDIR /home/php-8.2.14
    RUN ./configure --prefix=/usr/local/php8 --with-config-file-path=/usr/local/php8/etc --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --enable-shared --enable-debug --enable-soap --enable-bcmath --enable-calendar --enable-dom --enable-exif --enable-fileinfo --enable-filter --enable-ftp --enable-gd-jis-conv --enable-mbstring --enable-mbregex --enable-pdo --enable-session --enable-shmop --enable-simplexml --enable-sockets --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-mysqlnd-compression-support --enable-gd --enable-opcache --enable-xml --with-sqlite3 --with-iconv --with-bz2 --with-curl --with-cdb --with-openssl --with-jpeg --with-freetype --with-xpm --with-gettext --with-mhash --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-zlib --with-zlib-dir --with-pdo-sqlite --with-readline --with-xsl --with-pear --with-gmp --with-iconv=/usr/local && make ZEND_EXTRA_LIBS='-liconv' && make install
    RUN ./libtool --finish /usr/local/php8/lib/
    ADD php.ini /usr/local/php8/etc/
    ADD php-fpm.conf /usr/local/php8/etc/
    ADD www.conf /usr/local/php8/etc/php-fpm.d/
    ADD nginx.conf /usr/local/nginx/conf/
    ADD index.php /usr/local/nginx/html/

    #CMD 运行以下命令
    CMD /home/run.sh && tail -f /dev/null

    2.docker-compose.yml

    # 编排服务(容器),每个服务启动一个镜像
    # Time: 20240206
    version: '3'

    services:
    nginx:
    restart: always
    # env_file:
    # - .env
    image: dockerstorage.xxx.com:5533/nginx/nginx-base:latest
    container_name: nginx-base
    build:
    context: ./
    dockerfile: Dockerfile_nginx
    ports:
    - "8181:80"
    # volumes:
    # - ./logs:/usr/local/nginx/logs
    environment:
    - utf8
    - TZ=Asia/Shanghai
    extra_hosts:
    - "dockermysql.xxx.com:host-gateway"
    dns:
    - 114.114.114.114
    - 223.5.5.5
    - 8.8.8.8
    networks:
    - basic
    ulimits:
    nproc:
    soft: 65535
    hard: 65535
    nofile:
    soft: 65535
    hard: 65535

    networks:
    basic:
    driver: bridge

  • docker-tomcat

    1.Dockerfile_tomcat

    # This tomcat Dockerfile
    # Version 20240206

    # Base images 基础镜像
    FROM dockerstorage.dcampus.com:5533/os/anolisos:latest

    #ENV 设置环境变量
    ENV JAVA_HOME=/usr/java/jdk1.8.0_361
    ENV CATALINA_HOME=/home/apache-tomcat-9.0.85
    ENV PATH=$CATALINA_HOME/bin:$JAVA_HOME/bin:$PATH
    ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib:$CLASSPATH

    # 安装jdk
    RUN mkdir /usr/java
    ADD jdk-8u361-linux-x64.tar.gz /usr/java/

    #ADD 文件放在当前目录下,拷过去会自动解压
    ADD apache-tomcat-9.0.85.tar.gz /home/

    #ADD 增加启动脚本文件
    ADD tomcat.sh /home/

    #WORKDIR 相当于cd
    WORKDIR /home

    #RUN 如果webapps单独出来,执行以下命令
    RUN rm -rf /home/apache-tomcat-9.0.85/webapps/*
    ADD webapps.tgz /home/apache-tomcat-9.0.85/
    ADD web.xml /home/apache-tomcat-9.0.85/conf/

    #CMD 运行以下命令
    CMD /home/tomcat.sh start && tail -f /dev/null

    2.docker-compose.yml

    # 编排服务(容器),每个服务启动一个镜像
    # Time: 20240206
    version: '3'

    services:
    tomcat:
    restart: always
    # env_file:
    # - .env
    image: dockerstorage.xxx.com:5533/tomcat/tomcat-base:latest
    container_name: tomcat-base
    build:
    context: ./
    dockerfile: Dockerfile_tomcat
    ports:
    - "8080:8080"
    # volumes:
    # - ./logs:/home/apache-tomcat-9.0.85/logs
    environment:
    - utf8
    - TZ=Asia/Shanghai
    extra_hosts:
    - "dockermysql.xxx.com:host-gateway"
    dns:
    - 114.114.114.114
    - 223.5.5.5
    - 8.8.8.8
    networks:
    - basic
    ulimits:
    nproc:
    soft: 65535
    hard: 65535
    nofile:
    soft: 65535
    hard: 65535

    networks:
    basic:
    driver: bridge

  • docker-redis

    1.Dockerfile_redis

    # This mysql Dockerfile
    # Version 20240206

    # Base images 基础镜像
    FROM dockerstorage.xxx.com:5533/os/anolisos:latest

    #ADD 文件放在当前目录下,拷过去会自动解压
    ADD tcl8.6.11-src.tar.gz /home/
    WORKDIR /home/tcl8.6.11/unix/
    RUN ./configure && make && make install

    ADD redis-5.0.14.tar.gz /home/
    WORKDIR /home/redis-5.0.14/
    RUN make MALLOC=libc && make install

    ADD redis.conf /etc/
    RUN echo vm.overcommit_memory=1 >> /etc/sysctl.conf

    #启动脚本
    RUN echo '#!/bin/bash' >> /home/run.sh
    RUN echo '/usr/local/bin/redis-server /etc/redis.conf' >> /home/run.sh
    RUN chmod 775 /home/run.sh

    #CMD 运行以下命令
    CMD /home/run.sh && tail -f /dev/null

    2.docker-compose.yml

    # 编排服务(容器),每个服务启动一个镜像
    # Time: 20240206
    version: '3'

    services:
    redis:
    image: dockerstorage.xxx.com:5533/redis/redis-base:latest
    container_name: redis-base
    restart: always
    build:
    context: ./
    dockerfile: Dockerfile_redis
    ports:
    - "6379:6379"
    #volumes:
    # node1的数据卷映射
    #- ./data:/home/mysql/data
    environment:
    # 时区
    - TZ=Asia/Shanghai
    dns:
    - 114.114.114.114
    - 223.5.5.5
    - 8.8.8.8
    networks:
    - basic
    ulimits:
    nproc:
    soft: 65535
    hard: 65535
    nofile:
    soft: 65535
    hard: 65535

    networks:
    basic:
    driver: bridge

  • docker-mysql

    1.Dockerfile_mysql

    # This mysql Dockerfile
    # Version 20240206

    # Base images 基础镜像
    FROM dockerstorage.xxx.com:5533/os/anolisos:latest

    #ENV 设置环境变量
    ENV MYSQL_HOME=/usr/local/mysql
    ENV PATH=$MYSQL_HOME/bin:$PATH
    ENV CLASSPATH=.:$MYSQL_HOME/lib:$CLASSPATH

    #ADD 文件放在当前目录下,拷过去会自动解压
    RUN useradd mysql
    ADD mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz /usr/local/
    ADD my.cnf /etc/

    #WORKDIR 相当于cd
    WORKDIR /usr/local/

    #RUN 执行以下命令
    RUN mv mysql-5.7.44-linux-glibc2.12-x86_64 mysql && chown -R mysql:mysql mysql && /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/home/mysql/data && cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld && /usr/sbin/chkconfig --add mysqld

    #启动脚本
    RUN echo '#!/bin/bash' >> /home/run.sh
    RUN echo '/etc/init.d/mysqld start' >> /home/run.sh
    RUN chmod 775 /home/run.sh

    #CMD 运行以下命令
    CMD /home/run.sh && tail -f /dev/null

    2.docker-compose.yml

    # 编排服务(容器),每个服务启动一个镜像
    # Time: 20240206
    version: '3'

    services:
    mysql-master:
    image: dockerstorage.xxx.com:5533/mysql/mysql-master:5.7.44
    container_name: mysql-master
    restart: always
    build:
    context: ./
    dockerfile: Dockerfile_mysql
    ports:
    - 3306:3306
    volumes:
    # 初始化数据库,只能在master节点,不需要可以删除
    #- ./init.sql:/docker-entrypoint-initdb.d/init.sql
    # node1的数据卷映射
    - ./data:/home/mysql/data
    environment:
    # 时区
    - TZ=Asia/Shanghai
    # 主从复制用户
    #- MYSQL_REPLICATION_USER=repl-user
    # 主从复制密码
    #- MYSQL_REPLICATION_PASSWORD=root
    # 主从复制角色
    #- MYSQL_REPLICATION_MODE=master
    dns:
    - 114.114.114.114
    - 223.5.5.5
    - 8.8.8.8
    networks:
    - basic
    ulimits:
    nproc:
    soft: 65535
    hard: 65535
    nofile:
    soft: 65535
    hard: 65535

    networks:
    basic:
    driver: bridge

  • docker-os

    1.Dockerfile_base

    # This Base Dockerfile
    # Version 20240206

    # Base images 基础镜像
    #FROM centos:7
    FROM openanolis/anolisos

    #ENV 设置环境变量
    ENV PATH=$HOME/bin:$PATH
    ENV CLASSPATH=.:$CLASSPATH

    #RUN 执行以下命令
    RUN yum update -y
    RUN yum install -y epel-release
    RUN yum install -y net-tools gcc gcc-c++ wget autoconf make telnet sshpass libncurses* GeoIP GeoIP-devel libpsl* sysstat oniguruma* openssl openssl-devel openssh openssh-server openssh-clients lftp libtool expect numactl zip bison imake automake screen php-gd flex pcre pcre-devel libpng libpng-devel libjpeg libjpeg-devel freetype freetype-devel gd gd-devel zlib zlib-devel bzip2 bzip2-devel libXpm libXpm-devel ncurses ncurses-devel libmcrypt libmcrypt-devel libxml2 libxml2-devel curl curl-devel gmp gmp-devel libzip libzip-devel sqlite sqlite-devel readline readline-devel libxslt libxslt-devel fontconfig-devel libtiff-devel libevent-devel gdbm-devel glib2 glib2-devel libicu-devel libmemcached-devel xmlrpc-c xmlrpc-c-devel glibc glibc-devel systemd-devel yum-utils device-mapper-persistent-data lvm2 && yum clean all

    #添加库
    RUN echo /lib >> /etc/ld.so.conf
    RUN echo /lib64 >> /etc/ld.so.conf
    RUN echo /usr/lib >> /etc/ld.so.conf
    RUN echo /usr/lib64 >> /etc/ld.so.conf

    #CMD 运行以下命令
    CMD tail -f /dev/null

    2.docker-compose.yml

    # 编排服务(容器),每个服务启动一个镜像
    # Time: 20240206
    version: '3'

    services:
    base:
    restart: always
    # env_file:
    # - .env
    image: dockerstorage.xxx.com:5533/os/anolisos:latest
    container_name: anolisos-latest
    build:
    context: ./
    dockerfile: Dockerfile_base
    environment:
    - utf8
    - TZ=Asia/Shanghai
    extra_hosts:
    - "dockermysql.xxx.com:host-gateway"
    dns:
    - 114.114.114.114
    - 223.5.5.5
    - 8.8.8.8
    networks:
    - basic
    ulimits:
    nproc:
    soft: 65535
    hard: 65535
    nofile:
    soft: 65535
    hard: 65535

    networks:
    basic:
    driver: bridge

  • 设置监控启动shell脚本

    vi /home/monitor

    #! /bin/bash

    cd /home/
    PCOUNT=`ps -ef|grep java|grep cms|grep -v grep|wc -l`
    echo $PCOUNT

    if [ $PCOUNT -eq 0 ]; then
    echo "Starting process…" >> /root/logs/restart.log
    echo $(date +"%y-%m-%d %H:%M:%S")-"restart service" >>/root/logs/restart.log
    #这个是你启动脚本的目录
    sh /home/yxdc/cms/tomcat-8.sh start
    else
    echo $(date +"%y-%m-%d %H:%M:%S")-"Process is running!" >> /root/logs/restart.log
    fi

  • k8s 的账户授权RBAC 及安装Kubepi

    一、用户授权案例

    1.创建指定namespace

    kubectl create ns user-ns

    可切换空间:kubectl config set-context --namespace user-ns --current

    2.创建sa账户

    kubectl create serviceaccount kubepi-user

    查看:kubectl get sa

    3.创建role角色,role.yaml

    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
    namespace: user-ns
    name: user-role
    rules:
    -apiGroups: ["*"]
    resources: ["pods"]
    verbs: ["*"]
    -apiGroups: ["apps/v1"]
    resources: ["deployments"]
    verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

    执行:kubectl apply -f role.yaml

    查看:kubectl get role

    4.将sa账户绑定到user-role角色 ,这里绑定到cluster-admin,vi role-bind.yaml

    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
    name: role-bind
    namespace: kube-system
    subjects:
    -kind: ServiceAccount
    name: kubepi-user
    namespace: kube-system
    roleRef:
    kind: Role
    name: cluster-admin
    apiGroup: rbac.authorization.k8s.io

    执行:kubectl apply -f role-bind.yaml

    查看:kubectl get rolebindings.rbac.authorization.k8s.io -o yaml

    5.创建sa账户secret类型token,vi sa-token.yaml

    apiVersion: v1
    kind: Secret
    type: kubernetes.io/service-account-token
    metadata:
    name: kubepi-user-token
    namespace: kube-system
    annotations:
    kubernetes.io/service-account.name: "kubepi-user"

    执行:kubectl apply -f sa-token.yaml

    查看:kubectl describe secrets kubepi-user-token|grep token

    二、安装kubepi

    docker pull kubeoperator/kubepi-server

    docker run --privileged -itd --restart=unless-stopped --name kube_dashboard -v /home/docker-mount/kubepi/:/var/lib/kubepi/ -p 8000:80 kubeoperator/kubepi-server

    地址: http://x.x.x.x:8000
    默认用户名:admin
    默认密码:kubepi

    填写集群名称,默认认证模式,填写apisever地址及token:

  • keepalived的安装与配置

    一、下载安装

    yum install keepalived

    二、配置

    vi /etc/keepalived/keepalived.conf

    1.主(master)

    global_defs {
    router_id LVS_MASTER #名称标记为master,名字随便取
    vrrp_gna_interval 0
    }

    #加入周期性检测nginx服务脚本的相关配置

    vrrp_script check_nginx{
    script "/etc/keepalived/check_nginx.sh" #心跳执行的脚本,检测nginx是否启动
    interval 2 #(检测脚本执行的间隔,单位是秒)
    }

    vrrp_instance VI_1 {
    state MASTER #指定当前节点为master节点,只能有一个master,其余只能是backup
    interface ens33 #绑定此虚拟路由使用的网卡的名称,使用ifconfig或者ip addr查看
    virtual_router_id 99 #指定虚拟路由id,虚拟路由的唯一标识,范围是0-255,mater和backup节点需要指定一样的,相同id为一组
    priority 200 #指定当前结点的优先级,master节点要大于backup节点。
    advert_int 1 #指定发送VRRP通告的间隔,单位是秒
    virtual_ipaddress {
    192.168.199.130 #指定虚拟ip,自己定义的虚拟ip
    }

    #添加跟踪(执行脚本)

    track_script { check_nginx }

    }

    2.备(backup)

    global_defs {
    router_id LVS_BACKUP #名称标记为BACKUP,名字随便取
    vrrp_gna_interval 0
    }

    #加入周期性检测nginx服务脚本的相关配置

    vrrp_script check_nginx{
    script "/etc/keepalived/check_nginx.sh" #心跳执行的脚本,检测nginx是否启动
    interval 2 #(检测脚本执行的间隔,单位是秒)
    }

    vrrp_instance VI_1 {
    state BACKUP #指定当前节点为master节点,只能有一个master,其余只能是backup
    interface ens33 #绑定此虚拟路由使用的网卡的名称,使用ifconfig或者ip addr查看
    virtual_router_id 99 #指定虚拟路由id,虚拟路由的唯一标识,范围是0-255,mater和backup节点需要指定一样的,相同id为一组
    priority 199 #指定当前结点的优先级,master节点要大于backup节点。
    advert_int 1 #指定发送VRRP通告的间隔,单位是秒
    virtual_ipaddress {
    192.168.199.130 #指定虚拟ip,自己定义的虚拟ip
    }

    #添加跟踪(执行脚本)

    track_script{ check_nginx }

    }

    3.编辑监听脚本

    vi /etc/keepalived/check_nginx.sh

    #!/bin/bash

    #检测nginx是否启动了

    A=`ps -C nginx --no-header |wc -l`
    if [ $A -eq 0 ]; then #如果nginx没有启动就启动nginx
    /usr/local/nginx/sbin/nginx #重启nginx,也可以使直接监听应用服务
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then #nginx重启失败,则停掉keepalived服务,进行VIP转移
    killall keepalived
    fi
    fi

    4. 查看网卡是否有虚拟IP

  • Apache 增加登录认证

    1.启用Apache的auth_basicauthn_file模块,默认启用

    2.生成密码

    /usr/local/apache2/bin/htpasswd -c /home/apachepasswd 用户名

    3.加入认证

    <directory /home/xxx/>
    AddDefaultCharset UTF-8
    AllowOverride None
    Options All
    AddHandler cgi-script .fcgi .cgi
    Order allow,deny
    Allow from all
    AuthName "用户名"
    AuthType Basic
    AuthUserFile /home/apachepasswd
    Require valid-user
    </directory>



  • K8S安装部署教程

    一、准备

    1、修改hosts配置

    vi /etc/hosts

    192.168.5.10 k8s-master
    192.168.5.11 k8s-node1
    192.168.5.12 k8s-node2

    hostnamectl --static set-hostname k8s-master
    hostnamectl --static set-hostname k8s-node1
    hostnamectl --static set-hostname k8s-node2

    2、配置SSH免密登录

    [root@node1 ~]# ssh-keygen
    [root@node1 ~]# ssh-copy-id k8s-master
    [root@node1 ~]# ssh-copy-id k8s-node1
    [root@node1 ~]# ssh-copy-id k8s-node2

    3、关闭Swap分区

    临时关闭,重启恢复

    [root@node1 ~]# swapoff -a

    永久关闭

    echo vm.swappiness = 0 >> /etc/sysctl.conf
    [root@node1 ~]# sysctl -p
    [root@node1 ~]# cat /etc/fstab
    /dev/mapper/centos-swap swap swap defaults 0 0

    4、禁用SELinux

    5、关闭防火墙

    6、修改内核参数

    [root@node1 ~]# modprobe br_netfilter
    [root@node1 ~]# echo "modprobe br_netfilter" >> /etc/profile
    [root@node1 ~]# tee /etc/sysctl.d/k8s.conf << EOF
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF

    重新加载配置

    [root@node1 ~]# sysctl -p /etc/sysctl.d/k8s.conf

    7、配置集群时钟同步

    硬件时钟设置为UTC

    timedatectl set-local-rtc 0

    设置本地时区,显示本地时间

    timedatectl set-timezone Asia/Shanghai

    手动加载RTC设置

    hwclock --systohc

    验证

    [root@node1 ~]# timedatectl

    安装生效ipvs

    cat > /etc/sysconfig/modules/ipvs.modules <<EOF

    #!/bin/bash
    modprobe -- ip_vs
    modprobe -- ip_vs_rr
    modprobe -- ip_vs_wrr
    modprobe -- ip_vs_sh
    modprobe -- nf_conntrack
    EOF

    chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack

    yum install -y ipset ipvsadm

    8、配置k8s的Yum源

    [root@node1 ~]# vi /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    enabled=1
    gpgcheck=0

    二、安装Docker(参考另外一篇文章)

    三、安装K8S集群

    1.安装三大组件-kubeadm、kubelet、kubectl

    yum install kubelet kubeadm kubectl iproute-tc

    systemctl enable kubelet

    2.初始化k8s集群

    containerd config default > /etc/containerd/config.toml

    #在[plugins."io.containerd.grpc.v1.cri".registry.mirrors] 后新增镜像仓库地址

    [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
    endpoint = ["https://kvuwuws2.mirror.aliyuncs.com"]
    [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
    endpoint = ["https://registry.aliyuncs.com/k8sxio"]
    另外修改:
    sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9"

    SystemdCgroup = true

    增加执行

    cat > /etc/crictl.yaml <<EOF

    runtime-endpoint: unix:///var/run/containerd/containerd.sock
    image-endpoint: unix:///var/run/containerd/containerd.sock
    timeout: 0
    debug: false
    pull-image-on-create: false
    EOF

    重启

    systemctl daemon-reload

    systemctl restart containerd

    ctr version

    crictl version

    3.查看安装时所需要拉取的镜像

    kubeadm config print init-defaults > kubeadm-init.yaml

    kubeadm config images list --config kubeadm-init.yaml

    参考上面版本,更换阿里云下载镜像

    docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.0
    docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.0
    docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.0
    docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.28.0
    docker pull registry.aliyuncs.com/google_containers/pause:3.9
    docker pull registry.aliyuncs.com/google_containers/etcd:3.5.9-0
    docker pull registry.aliyuncs.com/google_containers/coredns:v1.10.1

    docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.0 registry.k8s.io/kube-apiserver:v1.28.0
    docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.0 registry.k8s.io/kube-controller-manager:v1.28.0
    docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.0 registry.k8s.io/kube-scheduler:v1.28.0
    docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.28.0 registry.k8s.io/kube-proxy:v1.28.0
    docker tag registry.aliyuncs.com/google_containers/pause:3.9 registry.k8s.io/pause:3.9
    docker tag registry.aliyuncs.com/google_containers/etcd:3.5.9-0 registry.k8s.io/etcd:3.5.9-0
    docker tag registry.aliyuncs.com/google_containers/coredns:v1.10.1 registry.k8s.io/coredns/coredns:v1.10.1

    4. 在主节点执行,初始k8s

    kubeadm init --apiserver-advertise-address=192.168.5.10 --control-plane-endpoint=k8s-master --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.28.2 --service-cidr=10.96.0.0/12 --pod-network-cidr=172.20.0.0/16 --apiserver-cert-extra-sans=dockerstorage.xx.com

    apiserver-advertise-address:apiserver监听地址
    control-plane-endpoint:控制平面的IP地址或DNS名称
    image-repository:镜像仓库,此处为国内阿里云镜像仓库加速下载
    service-cidr:为Service分配的IP地址段
    pod-network-cidr:为pod分配的IP地址段

    #如果需要重装,kubeadm参考下面命令

    kubeadm reset

    成功后,新建目录:

    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config

    #root用户执行以下命令:

    echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
    source /etc/profile

    //不操作scp -r /etc/kubernetes/pki/* root@k8s-node1:/etc/kubernetes/pki/
    //不操作scp -r /etc/kubernetes/pki/* root@k8s-node2:/etc/kubernetes/pki/
    scp -r /etc/kubernetes/admin.conf root@k8s-node1:/etc/kubernetes/
    scp -r /etc/kubernetes/admin.conf root@k8s-node2:/etc/kubernetes/

    安装calico网络插件

    wget https://docs.tigera.io/calico/latest/manifests/calico.yaml

    修改CALICO_IPV4POOL_CIDR 网络为: "172.20.0.0/16"

    kubectl create -f calico.yaml 或 kubectl apply -f calico.yml

    检查 Kubernetes 节点状态

    kubectl get pods --all-namespaces -o wide

    5.节点上操作,复制主节点信息,新建目录:

    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config

    或者配置环境变量
    echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
    source ~/.bash_profile

    主节点上查看kubeadm join内容

    kubeadm token create --print-join-command

    加入主节点

    kubeadm join cluster-endpoint:6443 --token oqpmc9.9d5v0v5mm \
    --discovery-token-ca-cert-hash sha256:3e43e8a1a1ab1709877feefb05d8d184d3280f802fb72fb6d090

    查看节点问题命令

    kubectl describe node 节点名称

    安装calico网络插件

    wget https://docs.tigera.io/calico/latest/manifests/calico.yaml

    修改CALICO_IPV4POOL_CIDR 网络为: "172.20.0.0/16"

    kubectl create -f calico.yaml 或 kubectl apply -f calico.yaml

    yum install kubernetes-cni(看网络日志情况分析执行,使用旧版本)

    6.------------k8s常用命令集合------------

    重启 kubelet 服务

    systemctl restart kubelet

    删除节点

    kubectl delete node 节点名称

    查看当前集群的所有的节点

    kubectl get node

    显示 Node 的详细信息(一般用不着)

    kubectl describe node node1

    查看所有的pod

    kubectl get pod --all-namespaces

    查看pod的详细信息

    kubectl get pods -o wide --all-namespaces

    查看所有创建的服务

    kubectl get service

    查看所有的deploy

    kubectl get deploy

    重启 pod(这个方式会删除原来的pod,然后再重新生成一个pod达到重启的目的)

    有yaml文件的重启

    kubectl replace --force -f xxx.yaml

    无yaml文件的重启

    kubectl get pod -n -o yaml | kubectl replace --force -f -

    查看pod的详细信息

    kubectl describe pod nfs-client-provisioner-65c77c7bf9-54rdp -n default

    根据 yaml 文件创建Pod资源

    kubectl apply -f pod.yaml

    删除基于 pod.yaml 文件定义的Pod

    kubectl delete -f pod.yaml

    查看容器的日志

    kubectl logs

    实时查看日志

    kubectl logs -f

    若 pod 只有一个容器,可以不加 -c

    kubectl log -c

    返回所有标记为 app=frontend 的 pod 的合并日志

    kubectl logs -l app=frontend

    通过bash获得 pod 中某个容器的TTY,相当于登录容器

    kubectl exec -it -c -- bash
    kubectl exec -it redis-master-cln81 -- bash

    查看 endpoint 列表

    kubectl get endpoints

    查看已有的token

    kubeadm token list

  • WordPress多站点设置

    一、多站点需要注意的是:

      1.不能对该WordPress文件进行移动,否则需要删除之后重新配置

      2.在激活之前建议对原有的数据库进行备份

      3.不能使用IP地址,比如:127.0.0.1

      4.网站需要支持伪静态。(即:后台设置->固定连接不能使用默认设置否则即便创建好多站点也不能进行访问)

    在WordPress根目录下的wp-config.php文件, 增加加上以下内容:

    define('WP_ALLOW_MULTISITE', true);

    二、后台-工具多出一个选项出来叫配置网络,点击配置网络后首先会提示你停用所有插件,全部停用之后再点击配置网络。

    三、下一步,它会给你提供两段代码,这两段代码都需要手动添加到指定的文件(都在根目录),添加之前一定要注意备份。

    四、完成后需重新登录,重新登录之后,多站点启用完毕。安装完成之后即可在后台的顶部导航上边看到进入多站点控制的面板链接。

  • IPv6地址使用ping、telnet命令汇总

    一、windows ping
    ping -6 fe80::20c:29ff:fea4:1509%22
    二、linux ping
    ping6 -I eno16777736 fe80::cd04:c16b:9adf:dfe7
    三、windows telnet
    telnet fe80::20c:29ff:feaa:9a1b%22 80
    四、linux telnet
    telnet -6 fe80::20c:29ff:feaa:9a1b%eno16777736 80

  • Apache Jmeter教程

    一. Apache Jmeter介绍

    官网地址:https://jmeter.apache.org/

    Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。

    基于Java,自带GUI界面工具,可直接在window下当做桌面软件运行。

    一. 使用样例
    2.1启动JMeter

    编辑apache-jmeter\bin\jmeter.properties文件,修改两处:

    sampleresult.default.encoding=UTF-8

    language=zh_CN

    windows操作系统下,双击apache-jmeter\bin\jmeter.bat,启动软件桌面

    测试任务可以保存为 jmx格式配置文件,下次打开配置文件可重新载入任务

    2.2模拟简单请求

    这里说明最简单的get请求 -> 运行 -> 生成报告的方案

    1. 添加线程组

    线程数:10 启动10个线程

    Ramp-Up时间:5 5秒内启动所有线程(这里10个)。为0时同时启动所有线程

    循环次数:100 线程组的执行次数,这里为执行100次线程数为10的线程组

    2. 添加HTTP请求

    现在要测试访问的地址为:http://x.x.x.x:9382/sms2/acegilogin.jsp,http请求参数填写如下:

    3. 添加 查看结果树、聚合报告、汇总报告
    4. 运行测试,查看结果

    执行结果查看:

    5. 导出报告

    将以上项目设置保存为: test.jmx 文件

    例如放到: d:\xx\test.jmx

    建立输出报告文件的文件夹: d:\xx\outputFile\test

    在命令提示行(cmd)下进入: d:\xx\apache-jmeter\bin目录

    执行:

    jmeter -n -t d:\xx\test.jmx -l d:\xx\test.txt -e -o d:\xx\outputFile\test

    基本命令格式: jmeter -n -t (test JMX file) -l (test log file) -e -o (Path to output folder)

    执行完毕后看到报告

    2.3模拟登录并执行业务

    1. 添加Http默认请求头

    由于本次测试涉及多个url,所以可以把服务器请求信息添加“默认请求值”。

    测试的地址为:http://x.x.x.x:9382/sms2/

    2. 加入Http Cookie管理器

    本次请求是登录后再访问全局参数管理栏目页面,期间需要使用Cookie进行状态传递,需要加入Http Cookie管理器进行cookie状态管理

    无额外的cookie设置的话,使用默认设置就可以。

    3.添加 setup线程组

    线程组:这个就是我们通常添加运行的线程。通俗的讲一个线程组,可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户。

    setup线程组:一种特殊类型的ThreadGroup的,可用于执行预测试操作。这些线程的行为完全像一个正常的线程组元件。线程执行测试开始前进行定期线程组的执行测试开始前进行初始化工作。

    teardown线程组:一种特殊类型的ThreadGroup的,可用于执行预测试操作。这些线程的行为完全像一个正常的线程组元件。线程执行测试结束后行定期线程组的执行测试结束时进行回收工作

    4.添加登录请求

    登录请求配置中,可以设置登录是的参数信息(j_username/j_password),此处默认所有线程使用admin / 123456  账号进行登录

    --------------------------------------------------------------------------------------------------------------------------

    问题:在测试并发访问时,需要多个不同的账号进行登录处理,怎么解决?

    通过 配置元件 CSV Data set config  记录多个登录账号密码

    CSV Data set config  可以有多个,但所有的变量名称不能重复

    建立文件:E:/xx/登录账号密码.txt

    填写内容:

    admin1,123456

    admin2,123456

    文本的内容格式注意要跟配置中的一致,例如”,”分隔列,列顺序为username,password

    重新配置登录请求:

    格式为${参数名字},参数名字与CVS数据文件中的配置一致

    要注意的问题:CVS数据文件中的账号数量要少于线程组设置的线程数量

    因为线程组中每个线程相相当于一个浏览器,如果CVS的账号数量多于线程数量,那么多出来的账号实际上没有登录成功。

    1. 添加全局设置栏目请求
    2. 添加 查看结果树、聚合报告 、汇总报告
    3. 运行测试,查看结果
    4. 导出报告

    2.4 基础概念说明

    1.配置元件

    1.Http Cookie 管理器 作用域所有线程组所有线程

    2.CSV Data set Config 可以有多个,但所有变量名称不能重复,所有线程组都可以使用

    2.线程组中每一个线程都是独立的浏览器实例,使用独立的Http Cookie管理器实例。

    3.线程中的单个线程会从上往下按照顺序执行线程中定义的取样器(如HTTP请求)/处理器(如JSON提取器),并将结果放入监听器(如各种报告)。

  • showmount -e NFS漏洞解决方案

    解决方案:
    通过hosts.allow和hosts.deny文件来限制挂载相关的权限。
    访问顺序:nfs服务先读取/etc/hosts.allow文件内容,然后再读取/etc/hosts.deny文件内容来获取的nfs相关权限信息
    hosts.allow内容:
    mountd: 172.16.10.210 #只允许172.16.10.210挂载172.16.10.211服务器nfs共享的目录
    hosts.deny内容:
    mountd: all #拒绝所有服务器挂载172.16.10.211服务器nfs共享的目录

  • Minio下载与安装及其多驱多节点部署

    1、Minio概述

    MinIO是一个开源的分布式对象存储服务器,它兼容Amazon S3服务接口。它是一个轻量级、高性能、高可用性的存储解决方案,可用于存储和检索大规模数据对象。

    2、Minio的下载与安装

    rpm方式部署

    https://min.io/

    sudo rpm -i minio_package.rpm

    配置MinIO:打开MinIO配置文件(通常在/etc/minio目录下),根据您的需求进行配置,包括监听地址、认证信息、存储路径等。

    sudo systemctl start minio

    二进制文件方式安装部署

    wget https://dl.min.io/server/minio/release/linux-amd64/minio

    chmod +x minio MINIO_ROOT_USER=admin

    MINIO_ROOT_PASSWORD=password ./minio server /mnt/data --console-address ":9001"

    3、Minio的多驱多节点安装

    wget https://dl.min.io/server/minio/release/linux-amd64/minio

    磁盘挂载

    lsblk -f
    创建分区
    fdisk /dev/vdb
    说明:开始分区后输入n,新增分区,然后选择p,分区类型为主分区。两次回车默认剩余全部空间,最后输入w写入分区并退出,若不保存退出输入q
    格式化磁盘
    mkfs -t xfs /dev/vdb1
    挂载分区
    mount /dev/vdb1 /minio

    创建运行脚本

    vim run.sh
    内容如下
    export MINIO_ROOT_USER=minio
    export MINIO_ROOT_PASSWORD=xxx
    export MINIO_ACCESS_KEY=minio
    export MINIO_SECRET_KEY=xxx
    nohup /usr/local//minio/minio server /minio/data{1…6} --console-address ":9001" --address ":9000" > /usr/local//minio/log/minio_server1.log 2>&1 &
    nohup /usr/local//minio/minio server /minio/data{1…6} --console-address ":9003" --address ":9002" > /usr/local//minio/log/minio_server2.log 2>&1 &
    nohup /usr/local//minio/minio server /minio/data{1…6} --console-address ":9005" --address ":9004" > /usr/local//minio/log/minio_server3.log 2>&1 &

    说明

    MINIO_ROOT_USER和MINIO_ROOT_PASSWORD是页面登录的账号密码
    MINIO_ACCESS_KEY和MINIO_SECRET_KEY是项目连接minio需要的密钥
    /minio/data{1…6}是存储数据的路径 ,需要挂载
    –console-address ":9001"进入web页面的端口
    address “:9004” 服务的端口


    minio在多台服务器

    export MINIO_ROOT_USER=minio
    export MINIO_ROOT_PASSWORD=xxx
    export MINIO_ACCESS_KEY=minio
    export MINIO_SECRET_KEY=xxx

    nohup /usr/local//minio/minio server /minio/data{1…6} --console-address ":9001" --address ":9000" > /usr/local//minio/log/minio_server1.log 2>&1 &
    修改成
    nohup /usr/local//minio/minio server 对应每一个minio的存储路径 --console-address ":9001" --address ":9000" > /usr/local//minio/log/minio_server1.log 2>&1 &
    类似于
    nohup /usr/local//minio/minio server http://192.168.1.200/minio1 http://192.168.1.200/minio2 http://192.168.1.200/minio3 http://192.168.1.200/minio4 http://192.168.1.141/minio1 http://192.168.1.141/minio2 http://192.168.1.141/minio3 http://192.168.1.141/minio4 --console-address ":9001" --address ":9000" > /usr/local//minio/log/minio_server1.log 2>&1 &

  • ubuntu设置开机进入命令行或图形界面

    1. 开机进入命令行
      sudo systemctl set-default multi-user.target
      sudo reboot
    2. 开机进入图形界面
      sudo systemctl set-default graphical.target
      sudo reboot
  • ubuntu 下使用vi时方向键乱码,退格键不能使用

    由于ubuntu 预安装的是tiny版本,所以会导致我们在使用时候产生上述不便,但是我们安装vim的full版本后,键盘所在键在vi下就很正常了。

    解决方法:
    卸载tiny 版本 sudo apt-get remove vim-common
    安装full 版本 sudo apt-get install vim

  • Ubuntu W: GPG error: http://archive.ubuntukey....NO_PUBKEY 8D5A09

    解决方案:
    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys
    这里 为8D5A09DC9B929006
    然后再

    cp /etc/apt/trusted.gpg /etc/apt/trusted.gpg.d/
    sudo apt-get update

  • 使用druid包生成数据库密码

    在命令行中执行如下命令:

    java -cp druid-xx.jar com.alibaba.druid.filter.config.ConfigTools xxxx

  • Ubuntu防火墙设置ufw

    1. apt-get install ufw
    2. ufw allow from 192.168.0.1/24
    3. ufw allow 80
    4. ufw allow 443
    5. ufw allow 22
    6. ufw enable
    7. ufw status numbered
    8. ufw delete rule_number
    9. ufw default deny

    注意:执行iptables -F、iptables -X、iptables -Z 前,防火墙需要设置成开放模式

    ufw default allow

    查看:iptables -nL

  • Ubuntu 设置自动启动rc.local文件

    1. 修改系统中的自动启动脚本

    sudo chmod 777 /lib/systemd/system/rc-local.service

    sudo vi /lib/systemd/system/rc-local.service

    增加以下内容修改部分如下:

    [Install]
    WantedBy=multi-user.target
    Alias=rc-local.service

    2.增加rc.local配置文件

    vi  /etc/rc.local 

    增加:
    #!/bin/bash
    # THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
    #
    # It is highly advisable to create own systemd services or udev rules
    # to run scripts during boot instead of using this file.
    #
    # In contrast to previous versions due to parallel execution during boot
    # this script will NOT be run after all other services.
    #
    # Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
    # that this script will be executed during boot.
     
    touch /var/lock/subsys/local

  • 新服务器初始化

    一、关闭firewalld,安装iptables
    1、systemctl status firewalld(查看firewalld的状态)
    2、systemctl stop firewalld(关闭firewalld)
    3、systemctl disable firewalld.service(禁止firewalld开机启动)

    4、yum install iptables-services(安装iptables)
    5、systemctl enable iptables.service(开启开机启动服务)
    6、systemctl start iptables.service(开启进程)
    7、systemctl status iptables.service(查看状态)
    8、分别执行iptables -F、iptables -X、iptables -Z(初始化设置)
    9、service iptables save(保存设置)

    二、安装以及升级组件(全部执行一次即可)
    1、yum install -y gcc gcc-c++ zlib-devel openssl-devel pam* pam-devel*
    2、yum install expat-devel -y
    3、yum install numactl* -y
    4、yum install libaio*
    5、yum install epel*
    6、yum install oniguruma*
    7、yum -y install openssl openssl-devel pcre pcre-devel libpng libpng-devel libjpeg-6b libjpeg-devel-6b freetype freetype-devel gd gd-devel zlib zlib-devel bzip2 bzip2-devel libXpm libXpm-devel ncurses ncurses-devel mcrypt libmcrypt libmcrypt-devel libxml2 libxml2-devel curl curl-devel libcurl libcurl-devel libjpeg libjpeg-devel gmp gmp-devel zip libzip libzip-devel sqlite sqlite-devel oniguruma oniguruma-devel readline readline-devel libxslt libxslt-devel ntp make fontconfig-devel libtiff-devel libevent-devel gcc gcc-c++ flex bison imake autoconf automake screen sysstat compat-libstdc++-33 php-gd gdbm-devel glib2 glib2-devel libdb4-devel libicu-devel libmemcached-devel xmlrpc-c xmlrpc-c-devel glibc glibc-devel

    8、yum install gcc \
    autoconf \
    gcc-c++ \
    libxml2 \
    libxml2-devel \
    openssl \
    openssl-devel \
    bzip2 \
    bzip2-devel \
    libcurl \
    libcurl-devel \
    libjpeg \
    libjpeg-devel \
    libpng \
    libpng-devel \
    freetype \
    freetype-devel \
    gmp \
    gmp-devel \
    readline \
    readline-devel \
    libxslt \
    libxslt-devel \
    systemd-devel \
    openjpeg-devel \
    oniguruma \
    oniguruma-devel

    9、yum update -y

  • apache httpd配置ajp报错:(13)Permission denied: proxy: AJP: attempt to connect to

    查看 can_network_connect  

     /usr/sbin/getsebool -a |grep httpd_can_network_connect  

    解决永久性问题

    /usr/sbin/setsebool -P httpd_can_network_connect 1

  • mysql增加max_join_size

    1.查询

    show variables like '%MAX_JOIN_SIZE%';

    2.设置

    set @@local.max_join_size=18446744073709551615, @@global.max_join_size=18446744073709551615;

  • 查看MySQL数据库大小的方法

    1、进入information_schema 数据库(存放了其他的数据库的信息)
    use information_schema;

    2、查询所有数据的大小:
    select concat(round(sum(data_length/1024/1024),2),'MB') as data from tables;

    3、查看指定数据库的大小:
    比如查看数据库home的大小
    select concat(round(sum(data_length/1024/1024),2),'MB') as data from tables where table_schema='database_name';

    4、查看指定数据库的某个表的大小
    比如查看数据库home中 members 表的大小
    select concat(round(sum(data_length/1024/1024),2),'MB') as data from tables where table_schema='database_name' and table_name='table_name';
     

  • 隐藏tomcat版本

    修改之前默认报错页面信息会暴露出版本号。

    进入tomcat的lib目录找到catalina.jar文件

    unzip catalina.jar之后会多出两个文件夹

    进入org/apache/catalina/util编辑配置文件ServerInfo.properties修改为:

    server.info=ApacheTomcat

    server.number=0.0.0.0

    server.built=Nov 72016 20:05:27 UTC

    将修改后的信息压缩回jar包:

    jar uvf catalina.jar  org/apache/catalina/util/ServerInfo.properties

    重启tomcat。

  • proxysql配置mysql读写分离

    一、安装ProxySQL

    1.源码及下载地址:

    https://github.com/sysown/proxysql

    https://repo.proxysql.com/ProxySQL/proxysql-2.4.x/centos/7/

    配置yum源:

    cat > /etc/yum.repos.d/proxysql.repo << EOF
    [proxysql]
    name=ProxySQL YUM repository
    baseurl=https://repo.proxysql.com/ProxySQL/proxysql-2.4.x/centos/$releasever
    gpgcheck=1
    gpgkey=https://repo.proxysql.com/ProxySQL/proxysql-2.4.x/repo_pub_key
    EOF

    2.安装

    # rpm -ivh proxysql-xx-centos7.x86_64.rpm

    # systemctl start proxysql

    # chkconfig proxysql on

    二、配置主从(参考Mysql 主从设置文章)

    从库可设置 mysql> set global read_only=on

    三、配置proxysql

    1.mysql主库添加proxysql可以增删改查的账号(mysql上操作)

    grant all on *.* to proxysql@'%' identified by '123456';

    添加健康检测的帐号

    grant select,show view on *.* to monitor@'%' identified by '123456';

    2.创建组(proxysql 上操作: /usr/local/mysql/bin/mysql -uadmin -padmin -h 127.0.0.1 -P 6032)

    insert into mysql_replication_hostgroups ( writer_hostgroup, reader_hostgroup, comment) values (10,20,'proxy');

    3.添加 mysql 主机到 mysql_servers 表中(proxysql 上操作)

    hostgroup_id 10表示写组,20表示读组

    insert into mysql_servers(hostgroup_id,hostname,port,weight,comment) values(10,'192.168.0.1',3306,1,'Write Group');

    insert into mysql_servers(hostgroup_id,hostname,port,weight,comment) values(20,'192.168.0.2',3306,1,'Read Group');

    //查询

    select * from mysql_servers;

    4.添加刚才在mysql上创建的账号 (proxysql 上操作)

    insert into mysql_users(username,password,default_hostgroup,transaction_persistent)values('proxysql','123456',10,1);

    //查询

    select* from mysql_users;

    5.在proxysql主机端修改变量设置健康检测的账号

    set mysql-monitor_username='monitor';

    set mysql-monitor_password='123456';

    四、添加读写分离的路由规则

    1.将 select 查询语句全部路由至 hostgroup_id=20的组(也就是读组)
    但是 select * from tb for update 这样的语句是会修改数据的,所以需要单独定义,将它路由至 hostgroup_id=10的组(也就是写组)
    其他没有被规则匹配到的组将会被路由至用户默认的组(mysql_users 表中的 default_hostgroup
    proxySQL是根据rule_id的顺序进行规则匹配的

    insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply)values(1,1,'^SELECT.*FOR UPDATE$',10,1);

    insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply)values(50,1,"^SHOW",20,1);

    insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply)values(51,1,'^SELECT',20,1);

    //查询

    select rule_id,active,match_digest,destination_hostgroup,apply from mysql_query_rules;

    在管理界面运行下面命令

    set mysql-set_query_lock_on_hostgroup=0;

    set mysql-default_charset='utf8mb4';
    set mysql-default_collation_connection='utf8mb4_general_ci';

    select * from global_variables;

    五、加载配置和变量

    -- 持久化(在ProxySQL中执行)
    save mysql servers to disk;
    save mysql users to disk;
    save mysql variables to disk;
    save mysql query rules to disk;

    -- 加载到线上(在ProxySQL中执行)
    load mysql servers to runtime;
    load mysql users to runtime;
    load mysql variables to runtime;
    load mysql query rules to runtime;

    六、验证读写分离

    1.登录 proxysql 客户端,测试访问

    # /usr/local/mysql/bin/mysql -uproxysql -p -h 127.0.0.1 -P6033  -e "select @@hostname";

    2.在 ProxySQL 中查看SQL请求路由信息stats_mysql_query_digest

    select * from stats_mysql_query_digest;

    select hostgroup,schemaname,username,digest_text,count_star from stats_mysql_query_digest;

    七、日志查看方式

    select * from mysql_server_ping_log;

  • df -hi 空间满,/var/spool/postfix/maildrop 出现大量文件原因和解决办法

    1.检查

    #df -hi

    2.删除文件

    rm -rf  /var/spool/postfix/maildrop/*

    3. 在crontab的第一行加入

    MAILTO=""

    如不需要输出的信息,将信息丢入黑洞,如需要输出信息,/dev/null换成一个其他文件名 crontab里面的命令后面加上 > /dev/null 2>&1

  • Ubuntu LTS 清理boot及升级最新版本

    #查看系统现有内核
    dpkg --get-selections|grep linux-image

    #查看现在使用的内核
    uname -a 或 uname -r

     #清理/boot分区
    sudo apt-get purge  内核名称

    # 升级系统组件并检查软件更新
    sudo apt update

    # 更新软件
    sudo apt upgrade

    # 更新发行版
    sudo do-release-upgrade

  • jar 启动/重启 脚本

    #!/bin/bash
    USER=sms
    HOME=/home/sms
    JAVA_HOME=/usr/java/jdk1.8.0_241-amd64
    jarpackage=lamp-boot-server.jar
    jarport=3604
    jarstartjob=true
    jarprofiles=prod

    CATALINA_HOME=$HOME/services
    CATALINA_HOME_LOGS=$HOME/data/logs/
    # check current user
    if [ $(id | awk '{print $1}') == 'uid=0(root)' ]; then
        echo '**************************************'
        echo '** Can not run this script as root. **'
        echo '**************************************'
        exit -1
    fi;

    start(){

          cd $CATALINA_HOME/
          nohup $JAVA_HOME/bin/java -jar -Xms1g -Xmx1g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -Dserver.port=$jarport -Dlamp.database.p6spy=false -XX:+HeapDumpOnOutOfMemoryError -DstartJob=$jarstartjob -Dspring.profiles.active=$jarprofiles -Dlogging.file.path=$CATALINA_HOME_LOGS $jarpackage >nohup$jarport.out 2>&1 &
          
    }

    restart(){
          echo  "`date` restarting ..."
          ps -ef | grep java | grep $USER | grep $jarpackage | grep $HOME | awk ' BEGIN { FS=" ";} { pid = "kill -9 "$2; system(pid); } '
          sleep 3
          start
          echo  "`date` restarting finished........"pid
    }

    cd $HOME
    case $1 in
    'start')
          start
          ;;
    'restart')
          restart
    esac
    cd $HOME

  • centos7 安装erlang 及rabbitmq

    一、卸载

    yum -y remove rabbitmq-server.noarch

    yum -y remove erlang-*

    二、安装erlang 

    1.增加rabbitmq-erlang.repo

    [rabbitma-erlang]
    name=rabbitmq-erlang
    baseurl=http://packages.erlang-solutions.com/erlang/rpm/centos/7/x86_64/
    gpgcheck=1
    gpgkey=http://packages.erlang-solutions.com/erlang/rpm/erlang_solutions.asc
    repo_gpgcheck=0
    enabled=1

    2.查看版本

    yum list | grep erlang

    3.安装

    yum install erlang.x86_64

    三、安装rabbitmq 

    1.下载安装包

    wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.9.13/rabbitmq-server-3.9.13-1.el7.noarch.rpm

    2.安装

    rpm -Uvh rabbitmq-server-3.9.13-1.el7.noarch.rpm

    四、配置
    # 启动rabbitmq
    systemctl start rabbitmq-server.service

    # 开启后台管理
    rabbitmq-plugins enable rabbitmq_management

    # 设置后台管理员
    rabbitmqctl add_user 账号 '密码'
    rabbitmqctl set_user_tags 账号 administrator
    rabbitmqctl set_permissions -p / 账号 '.*' '.*' '.*'

    # 重启rabbitmq
    systemctl restart rabbitmq-server.service

    #访问

    http://x.x.x.x:15672

  • centos7.9升级内核到5.*

    uname -sr
    rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
    rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
    yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
    yum --enablerepo=elrepo-kernel install kernel-ml
    vi /etc/default/grub
    修改GRUB_DEFAULT=0
    grub2-mkconfig -o /boot/grub2/grub.cfg
    reboot

    查看可用内核 :cat /boot/grub2/grub.cfg |grep menuentry

  • eclipse 安装及配置

    一、下载

    https://www.eclipse.org/downloads/packages/

    解压即可使用,关闭自动更新

    二、配置中文语言

    直接安装

    https://download.eclipse.org/technology/babel/babel_language_packs/latest/index.php

    或下载语言包,解压覆盖即可

    https://www.eclipse.org/babel/downloads.php

    三、eclipse配置maven仓库

    window-preferences-Maven-installations

    maven增加

    maven设置

    四、安装lombok

    地址:https://projectlombok.org/download

    双击下载好的lombak.jar,eclipse.ini文件里添加

    --illegal-access=permit

    五、eclipse 配置

    1.修改工作空间字符集为UTF-8

    utf8

    2.修改字体大小

    字体

    3.修改Java提示

    java提示

    html提示

    xml提示

    4.修改背景颜色为护眼豆沙色

    背景色

    5.设置注释模板

    注释

    6.采用 4 个空格缩进,禁止使用 tab 字符,在 eclipse 中,必须勾选 insert spaces for tabs。
    (阿里巴巴开发手册)

    i.勾选 insert spaces for tabs

    空格

    ii.首先要新建一个,是因为原来的不让改,必须新建,否则无法保存

    ①点击New...新建样式,在profile name处键入名字,点击ok;

     ②点击右侧的editor,选则 tab policy的值为Spaces only,点击确定,保存

    空格设置

    六、安装插件

    vue.js(codemix) 、mybatis

  • Window10修复*.DLL丢失问题

    搜索 powershell 右键以管理员身份打开,然后顺序执行下面两个命令,不仅可以修复hid.dll丢失的问题,还可以修复各种window原版的dll丢失的各种问题。
    DISM.exe /Online /Cleanup-image /Restorehealth
    sfc /scannow 

  • Apache的Rewrite规则详细介绍

    1. Rewrite标志

      R[=code](force redirect) 强制外部重定向

      G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。

      P(force proxy) 强制使用代理转发。

      L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。

      N(next round) 重新从第一条规则开始运行重写过程。

      C(chained with next rule) 与下一条规则关联

      如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过

      T=MIME-type(force MIME type) 强制MIME类型

      NS (used only if no internal sub-request) 只用于不是内部子请求

      NC(no case) 不区分大小写

      QSA(query string append) 追加请求字符串

      NE(no URI escaping of output) 不在输出转义特殊字符

      例如:

      RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zed

      PT(pass through to next handler) 传递给下一个处理

      例如:

      RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理

      Alias /def /ghi

      S=num(skip next rule(s)) 跳过num条规则

      E=VAR:VAL(set environment variable) 设置环境变量

    2. RewriteCond标志符

      'nocase|NC'(no case)忽略大小

      'ornext|OR' (or next condition)逻辑或,可以同时匹配多个RewriteCond条件RewriteRule适用的标志符

      'redirect|R [=code]' (force redirect)强迫重写为基于http开头的外部转向(注意URL的变化) 如:[R=301,L]

      'forbidden|F' (force URL to be forbidden)重写为禁止访问

      'proxy|P' (force proxy)重写为通过代理访问的http路径

      'last|L' (last rule)最后的重写规则标志,如果匹配,不再执行以后的规则

      'next|N' (next round)循环同一个规则,直到不能满足匹配

      'chain|C' (chained with next rule)如果匹配该规则,则继续下面的有Chain标志的规则。

      'type|T=MIME-type' (force MIME type)指定MIME类型

      'nosubreq|NS' (used only if no internal sub-request)如果是内部子请求则跳过

      'nocase|NC' (no case)忽略大小

      'qsappend|QSA' (query string append)附加查询字符串

      'noescape|NE' (no URI escaping of output)禁止URL中的字符自动转义成%[0-9]+的形式。

      'passthrough|PT' (pass through to next handler)将重写结果运用于mod_alias

      'skip|S=num' (skip next rule(s))跳过下面几个规则

      'env|E=VAR:VAL' (set environment variable)添加环境变量

    3. Rewrite时服务器变量:

      HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST, HTTP_ACCEPT

      connection & request: REMOTE_ADDR, QUERY_STRING

      server internals: DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL

      system stuff: TIME_YEAR, TIME_MON, TIME_DAY

    4. Rewrite规则表达式的说明:

      . 匹配任何单字符

      [chars] 匹配字符串:chars

      [^chars] 不匹配字符串:chars

      text1|text2 可选择的字符串:text1或text2

      ? 匹配0到1个字符

      * 匹配0到多个字符

      + 匹配1到多个字符

      ^ 字符串开始标志

      $ 字符串结束标志

      \n 转义符标志

      反向引用 $N 用于 RewriteRule 中匹配的变量调用(0 <= N <= 9)

      反向引用 %N 用于 RewriteCond 中最后一个匹配的变量调用(1 <= N <= 9)

    5. 实际操作:例子:RewriteEngine on

      RewriteCond %{HTTP_USER_AGENT} ^MSIE [NC,OR]

      RewriteCond %{HTTP_USER_AGENT} ^Opera [NC]

      RewriteRule ^.* - [F,L] 这里”-”表示没有替换,浏览器为IE和Opera的访客将被禁止访问。

      例子:

      RewriteEngine On

      RewriteBase /test

      RewriteCond %{REQUEST_FILENAME}.php -f

      RewriteRule ([^/]+)$ /test/$1.php

      #for example: /test/admin => /test/admin.php

      RewriteRule ([^/]+)\.html$ /test/$1.php [L]

      #for example: /test/admin.html => /test/admin.php

      限制目录只能显示图片

      < IfModule mod_rewrite.c>

      RewriteEngine on

      RewriteCond %{REQUEST_FILENAME} !^.*\.(gif|jpg|jpeg|png|swf)$

      RewriteRule .*$ - [F,L]

      < /IfModule>

  • centos6新的yum源

    参考:https://developer.aliyun.com/mirror/centos

    wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-6.10.repo --no-check-certificate

    yum makecache

  • 应用自动启动及日志删除

    一、自动启动

    vi /home/startup.sh

    #!/bin/bash
    # This is a ShellScript For Auto start

    sudo -u weblib /home/weblib/grouper.sh start
    sleep 3
    sudo -u weblib /home/weblib/resource.sh start

    添加到vi /etc/rc.local

    ./home/startup.sh
    二、日志删除

    vi /home/logsdel.sh

    #!/bin/bash
    # This is a ShellScript For Auto LogsDel
    #准备工作:上传到logs目录下,更改权限chmod 740 logsdel.sh

    #设置日志目录路径,需要删除的日志
    logs_path=/usr/local/apache2/logs
    logs_name_all='test1.log test2.log'

    #date1=$(date +%Y%m%d)
    date1=$(date -d "yesterday" +%Y%m%d)
    #删除旧备份日志
    date2=$(date -d "3 days ago" +%Y%m%d)

    #以下一般无需修改
    for logs_name in $logs_name_all
    do
    cp $logs_path/$logs_name $logs_path/"$logs_name"_backup_$date1
    /usr/bin/cat /dev/null > $logs_path/$logs_name

    if [ -e $logs_path/"$logs_name"_backup_$date2 ]
    then 
    /usr/bin/rm -rf  $logs_path/"$logs_name"_backup_$date2
    fi

    done

    添加到crontab 定时执行

  • gitlab runner安装

    一、安装

    Debian/Ubuntu 用户
    1.首先信任 GitLab 的 GPG 公钥:

    curl https://packages.gitlab.com/gpg.key 2> /dev/null | sudo apt-key add - &>/dev/null
    2.修改清华源:

    vim /etc/apt/sources.list.d/gitlab-runner.list
    deb http://mirrors.tuna.tsinghua.edu.cn/gitlab-runner/debian buster main
    3.安装 gitlab-runner:

    sudo apt-get update
    sudo apt-get install gitlab-runner
    CentOS/RHEL
    新建 /etc/yum.repos.d/gitlab-runner.repo,内容为

    [gitlab-runner]
    name=gitlab-runner
    baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-runner/yum/el$releasever/
    repo_gpgcheck=0
    gpgcheck=0
    enabled=1
    gpgkey=https://packages.gitlab.com/gpg.key
    再执行

    sudo yum makecache
    sudo yum install gitlab-runner
    4.启动
    gitlab-runner start

    5.注册runner
    gitlab-runner register

    运行:
    gitlab-runner run

    6.docker其他操作 (貌似可以忽略!)
    sudo groupadd docker     #添加docker用户组
    sudo gpasswd -a gitlab-runner docker     #将登陆用户加入到docker用户组中
    newgrp docker     #更新用户组
    su gitlab-runner #切换到runner用户组
    docker ps    #测试docker命令是否可以使用sudo正常使用

    7.docker gitlab部署安装
    docker pull beginor/gitlab-ce:11.3.0-ce.0
    docker run --detach --publish 8443:443 --publish 8880:80 --publish 8822:22 --name my-gitlab --restart unless-stopped --volume /Users/ys/svn_git/05Docker_workspace/gitlab/etc:/etc/gitlab --volume /Users/ys/svn_git/05Docker_workspace/gitlab/log:/var/log/gitlab --volume /Users/ys/svn_git/05Docker_workspace/gitlab/data:/var/opt/gitlab --privileged=true -d beginor/gitlab-ce:11.3.0-ce.0

    8.测试
    提交代码,测试,是否触发CI

    二、gitlab-ci.yml参考

    #20210811
    stages:
      - build
      - deploy
      
    variables:
      siteLocation: "/home"
      siteName: "weitest"
      sshuser: "root"
      sship: "xx"
      sshpasswd: "xx"
      ports: "8870,8871,8872"
      projectpath: "/root/dockerfile/"
      dockercomposepath: "/root/dockerfile/docker-compose.yml"
      autopushpath: "/root/dockerfile/autopush.sh"
     
    before_script:
      - echo "Before run..."
    # 清理项目目录
      - if [ -d "${siteLocation}/${siteName}" ]; then
      - rm -rf ${siteLocation}/${siteName}
      - fi
      - mkdir -p ${siteLocation}/${siteName}
     
    build_job:
      stage: build
      script:
      - echo "build run..."
      - pwd
      - ls -l
      - ifconfig
      - cat /root/.ssh/id_rsa.pub
    # 打包程序,上传到测试docker服务器
      - tar -czvf ${siteLocation}/${siteName}/gitlabwebapps.tar.gz .
    #  - scp -r ${siteLocation}/${siteName}/gitlabwebapps.tar.gz ${sshuser}@${sship}:${projectpath}
      - sshpass -p ${sshpasswd} scp -r ${siteLocation}/${siteName}/gitlabwebapps.tar.gz ${sshuser}@${sship}:${projectpath}
      only:
      - master
      tags:
      - abc
      
    deploy_job:
      stage: deploy
      script:
      - echo "deploy run..."
      - pwd
      - ls -l
      - ifconfig
    # 构建docker容器
    #  - ssh -Tq ${sshuser}@${sship} "docker-compose -f ${dockercomposepath} up -d --build --force-recreate --remove-orphans"
      - sshpass -p ${sshpasswd} ssh -Tq ${sshuser}@${sship} "docker-compose -f ${dockercomposepath} up -d --build --force-recreate --remove-orphans"
    # 上传images镜像
    #  - ssh -Tq ${sshuser}@${sship} "/bin/bash ${autopushpath}"
      - sshpass -p ${sshpasswd} ssh -Tq ${sshuser}@${sship} "/bin/bash ${autopushpath}"
      only:
      - master
      tags:
      - abc

    三、初始化

    1. Reset CI/CD variables
    sudo gitlab-rails dbconsole

    SELECT * FROM public."ci_group_variables";
    SELECT * FROM public."ci_variables";

    DELETE FROM ci_group_variables;
    DELETE FROM ci_variables;

    2.Reset runner registration tokens
    sudo gitlab-rails dbconsole

    -- Clear project tokens
    UPDATE projects SET runners_token = null, runners_token_encrypted = null;
    -- Clear group tokens
    UPDATE namespaces SET runners_token = null, runners_token_encrypted = null;
    -- Clear instance tokens
    UPDATE application_settings SET runners_registration_token_encrypted = null;
    UPDATE application_settings SET encrypted_ci_jwt_signing_key = null;
    -- Clear runner tokens
    UPDATE ci_runners SET token = null, token_encrypted = null;

    3.Reset pending pipeline jobs
    sudo gitlab-rails dbconsole

    -- Clear build tokens
    UPDATE ci_builds SET token = null, token_encrypted = null;

  • Docker harbor 安装和操作

    一、安装依赖

    1.安装docker-ce

    2.安装docker-compose

    二、下载Harbor安装包

    https://github.com/goharbor/harbor

    wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz

    1.解压

    tar -zxvf harbor-offline-installer-v2.1.5.tgz

    2. 复制并编辑配置文件,

    cp harbor.yml.tmpl harbor.yml

    vi harbor.yml

    修改内容:

    hostname: xx.xx.xx.xx# 这里配置的监听地址,可以是域名

    http: port: 80 # 端口

    https: port: 443 #开通并需要配置证书

    harbor_admin_password: Harbor12345 # 配置admin用户的密码

    database: # 配置数据库相关的信息

    password: root123 # 数据库密码

    data_volume: /data # 镜像存放的目录

    3.执行安装

    ./install.sh

    三、harbor的控制
    docker-compose up -d 启动
    docker-compose down 停止

    四、登陆及使用

    1.docker login http://xx.xx.xx.xx:端口

    2.docker tag eedf6ec39913(镜像) xx.xx.xx.xx:端口/项目目录/tomcat:20210524_v1

    3.docker push xx.xx.xx.xx:端口/项目目录/tomcat:20210524_v1

    五、生成https证书命令

    1.openssl genrsa -out ca.key 4096
    2.openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/ST=gz/L=gz/O=gz/OU=xxx/CN=dockerstorage.xxx.com" -key ca.key -out ca.crt
    3.openssl genrsa -out dockerstorage.xxx.com.key 4096
    4.openssl req -sha512 -new -subj "/C=CN/ST=gz/L=gz/O=gz/OU=xxx/CN=dockerstorage.xxx.com" -key dockerstorage.xxx.com.key -out dockerstorage.xxx.com.csr
    5.
    cat > v3.ext <<-EOF
    authorityKeyIdentifier=keyid,issuer
    basicConstraints=CA:FALSE
    keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
    extendedKeyUsage = serverAuth
    subjectAltName = @alt_names

    [alt_names]
    DNS.1=xxx.com
    DNS.2=dockerstorage.xxx.com
    DNS.3=hostname
    EOF

    6.openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in dockerstorage.xxx.com.csr -out dockerstorage.xxx.com.crt
    7.openssl x509 -inform PEM -in dockerstorage.xxx.com.crt -out dockerstorage.xxx.com.cert

    上传到每个docker服务器:

    centos:
    /etc/pki/ca-trust/source/anchors
    update-ca-trust

    Ubuntu:
    /usr/local/share/ca-certificates/
    update-ca-certificates

    证书生成工具

    https://gitee.com/gdhexuewei/ssl-tool

  • Docker安装及使用

    一、Docker安装

    1、安装依赖包
    yum install yum-utils device-mapper-persistent-data lvm2 -y
    2、设置stable镜像仓库
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    3、更新yum软件包索引
    yum makecache
    4、安装docker
    yum list docker-ce.x86_64  --showduplicates | sort -r    #从高到低列出Docker-ce的版本
    yum -y install docker-ce

    5.添加配置文件

    vi /etc/docker/daemon.json

    {
    "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
    "data-root": "/home/docker",
    "exec-opts": ["native.cgroupdriver=systemd"],
    "dns": [ "114.114.114.114","223.5.5.5","8.8.8.8" ]
    }
    5、启动docker

    useradd -g docker docker
    systemctl enable docker
    systemctl start docker

    注意:如果用journalctl -xe查看启动出现:Failed to listen on Docker Socket for the API.

    vi /usr/lib/systemd/system/docker.socket

    SocketGroup=root  # 这里原来是docker改成root即可,保存退出

    systemctl daemon-reload

    systemctl start docker

    6、测试docker
    docker  version

    安装docker-compose

    自动:yum install docker-compose -y

    手动:

    https://github.com/docker/compose/releases

    下载docker-compose-Linux-x86_64到/usr/local/bin/
    重命名docker-compose-Linux-x86_64为docker-compose
    添加可执行权限chmod +x /usr/local/bin/docker-compose

    二、镜像使用

    1、搜索镜像

    docker search <image>

    2、下载镜像

    docker pull <image>

    3、查看当前所有镜像

    docker images

    4、删除镜像

    docker rmi <image ID>

    三、容器使用

    1.使用镜像启动创建容器

    创建 docker 卷,命令将在/var/lib/docker/volumes目录中创建一个卷

    docker volume create data_volume1

    docker volume ls

    挂载启动

    docker run -v <data_volume1>:<容器目录> -itd <image ID> -p <host_port:contain_port> --name xxx --restart=always /bin/bash

    采用主机网络模式:

    docker run -v <data_volume1>:<容器目录> -itd <image ID> --net=host --name xxx --restart=always /bin/bash

    查看挂载:docker inspect (容器ID)

    日志查看:docker logs -ft --tail 1000 <container>

    2.查看容器

    docker ps -a

    3.开启/停止/重启容器

    docker start/stop/restart <container>

    4.进入正在运行的docker容器

    docker exec -it [container_id] /bin/bash

    5.删除容器

    docker rm <container...>

    6.查看docker占用宿主机的磁盘空间

    docker system df

    docker container ls:-a 选项会列出包括停止的所有容器。
    docker inspect containerId 去查看这container的详细信息
    docker image ls:-a 选项会列出 intermediate 镜像(就是其它镜像依赖的层)。
    docker volume ls:列出数据卷。
    docker network ls:列出 network。
    docker info:显示系统级别的信息,比如容器和镜像的数量等。

    7.删除某类资源

    docker container prune # 删除所有退出状态的容器
    docker volume prune # 删除未被使用的数据卷
    docker image prune # 删除 dangling 或所有未被使用的镜像

    四、生成持久化容器与镜像

    1.通过容器生成新的镜像

    docker commit <container> [repo:tag] # 将一个container固化为一个新的image,后面的repo:tag可选。

    2.导出容器

    docker export <CONTAINER ID> > /tmp/export.tar

    3.导出镜像

    docker save <IMAGES ID> > /tmp/save.tar

    4.导入容器(导入export.tar文件)

    cat /tmp/export.tar | docker import - export:latest

    5.导入镜像(导入save.tar文件)

    docker load < /tmp/save.tar

    6.对image打tag

    docker tag xxxx name:version

    五、宿主网络配置

    1.安装网络工具

    yum -y install bridge-utils

    2. 停止、删除网桥 docker0
    ip link set dev docker0 down

    3.删除:
    brctl delbr docker0

    4.创建新的网桥
    brctl addbr docker0

    5.设置网桥IP 为docker0分配物理网络中的ip地址
    ip addr add 192.168.99.111/24 dev docker0

    6.启动网桥
    ip link set dev docker0 up

    7.启动成功后,查看:
    brctl show

    8.修改 docker 启动设置
    这里要注意的是,不同的linux操作系统docker的配置文件所在不同
    vi /usr/lib/systemd/system/docker.service
    添加选项 -b docker0在
    ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
    这行中修改为
    ExecStart=/usr/bin/dockerd -b docker0 -H fd:// --containerd=/run/containerd/containerd.sock
    即让docker服务启动时使用docker0网卡进行桥接

    9.重启docker服务
    systemctl daemon-reload
    systemctl restart docker

    六.docker compose常用命令

    #验证(docker-compose.yml)文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息
    docker-compose config  -q

    # 在后台启动服务
    docker-compose up -d

    # -f  指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
    docker-compose -f docker-compose.yml up -d

    docker-compose -f docker-compose.yml up -d --build --force-recreate --remove-orphans (重建)

    #启动多个相同的容器

    docker-compose -f docker-compose.yml up -d --scale nginx=3

    # 查看启动的服务
    docker-compose ps

    #启动已经存在的服务容器
    docker-compose start

    #停止服务
    docker-compose stop

    #停用移除所有容器以及网络相关
    docker-compose down

    #查看服务容器的输出
    docker-compose logs

    七、其他

    1.autopush.sh

    #!/bin/bash
    for line in $(<"/root/.env"); do export $line; done
    /usr/bin/docker push money.xx.com:7070/nginx/school_name:system_name_${nowDate}
    /usr/bin/docker push money.xx.com:7070/tomcat/school_name:system_name_${nowDate}

    2.autossh.sh

    #!/usr/bin/expect
    #20210811
    set timeout -1
    spawn ssh-keygen -t rsa
    expect {
    "*(/root/.ssh/id_rsa)" {send "\n\r";exp_continue}
    "*(empty for no passphrase)" {send "\n\r";exp_continue}
    "*again" {send "\n\r"}
    }
    expect eof

    3.envrun.sh

    #!/bin/bash
    /bin/echo nowDate=$(date +"%Y-%m-%d_%H-%M-01") > "/root/.env";
    #在/root/.bashrc 下加入以下命令
    #for line in $(<"/root/.env"); do export PATH=$PATH:$line; done

  • firewall-cmd参考

    配置文件路径
    /etc/firewalld/zones

    1.设置、查看默认区域:
    iptables -vnL
    firewall-cmd --set-default-zone=public
    firewall-cmd --get-default-zone

    2.列出所有区域的设置:
    firewall-cmd --list-all
    firewall-cmd --list-all-zones
    firewall-cmd --zone=public --list-all

    #允许访问80、443端口
    firewall-cmd --zone=public --add-port=80/tcp --permanent
    firewall-cmd --zone=public --add-port=443/tcp --permanent

    #禁ping
    firewall-cmd --permanent --add-rich-rule='rule family=ipv4 protocol value=icmp drop'

    #允许访问25,110等邮件端口
    firewall-cmd --zone=public --add-port=110/tcp --permanent
    firewall-cmd --zone=public --add-port=25/tcp --permanent
    firewall-cmd --zone=public --add-port=143/tcp --permanent
    firewall-cmd --zone=public --add-port=995/tcp --permanent
    firewall-cmd --zone=public --add-port=993/tcp --permanent
    firewall-cmd --zone=public --add-port=465/tcp --permanent

    #应用端口
    firewall-cmd --zone=public --add-port=8080/tcp --permanent

    #允许办公IP段访问
    firewall-cmd --zone=public --permanent --add-rich-rule="rule family="ipv4" source address="10.0.0.0/8" accept"
    firewall-cmd --zone=public --permanent --add-rich-rule="rule family="ipv4" source address="111.207.85.0/24" accept"

    #限制访问基本规则
    默认是关闭

    3.删除已添加的iptables规则
    firewall-cmd --zone=public --permanent --remove-port=
    firewall-cmd --zone=public --permanent --remove-service=ssh
    firewall-cmd --zone=public --permanent --remove-rich-rule="rule family="ipv4" source address="221.4.34.0/24" accept"

    4.最后重新载入规则
    firewall-cmd --reload

    solaris IP Filter 基本配置
    ipfstat -io
    svcs -a |grep network |egrep "pfil|ipf"
    svcadm enable svc:/network/ipfilter:default
    svcadm disable svc:/network/ipfilter:default

  • 数据库连接池配置说明

        <!-- 阿里巴巴连接池工具 Druid   推荐使用 -->
        <!-- 资料来源:https://www.cnblogs.com/wuyun-blog/p/5679073.html -->
        <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"  init-method="init" destroy-method="close"> 
            <property name="driverClassName" value="${jdbc.driverClassName}" /> 
            <property name="url" value="${jdbc.url}" /> 
            <property name="username" value="${jdbc.username}" /> 
            <property name="password" value="${jdbc.password}" /> 
            <!-- 配置初始化大小、最小、最大 --> 
            <property name="initialSize" value="1" /> 
            <property name="minIdle" value="1" /> 
            <property name="maxActive" value="10" />
            <!-- 配置获取连接等待超时的时间,毫秒 --> 
            <property name="maxWait" value="30000" />
            <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> 
            <property name="minEvictableIdleTimeMillis" value="300000" />
            <!-- 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。默认为true --> 
            <property name="testOnBorrow" value="true" /> 
            <!-- 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 --> 
            <property name="testOnReturn" value="false" />
            <!-- 验证连接有效与否的SQL,不同的数据配置不同 --> 
            <property name="validationQuery" value="select 1 " />         
            <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> 
            <property name="timeBetweenEvictionRunsMillis" value="60000" />
            <property name="testWhileIdle" value="true" />
            <!-- 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。--> 
            <property name="poolPreparedStatements" value="true" /> 
            <!-- 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100 -->
            <property name="maxOpenPreparedStatements"  value="20" />
            <!-- 这里配置提交方式,默认就是TRUE,可以不用配置 -->
            <property name="defaultAutoCommit" value="true" />
            <property name="filters" value="stat" /> 
            <property name="proxyFilters"> 
            <list> 
                <ref bean="logFilter" /> 
            </list> 
            </property> 
        </bean>
        <bean id="logFilter" class="com.alibaba.druid.filter.logging.Slf4jLogFilter"> 
            <property name="statementExecutableSqlLogEnable" value="false" /> 
        </bean>

    <!-- Druid 扩展管理功能,web.xml中配置 -->
    <servlet> 
        <servlet-name>DruidStatView</servlet-name> 
        <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>DruidStatView</servlet-name> 
        <url-pattern>/druid/*</url-pattern> 
    </servlet-mapping> 
    <filter> 
        <filter-name>druidWebStatFilter</filter-name> 
        <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class> 
        <init-param> 
            <param-name>exclusions</param-name> 
            <param-value>/public/*,*.js,*.css,/druid*,*.jsp,*.swf</param-value> 
        </init-param> 
        <init-param> 
            <param-name>principalSessionName</param-name> 
            <param-value>sessionInfo</param-value> 
        </init-param> 
        <init-param> 
            <param-name>profileEnable</param-name> 
            <param-value>true</param-value> 
        </init-param> 
    </filter> 
    <filter-mapping> 
        <filter-name>druidWebStatFilter</filter-name> 
        <url-pattern>/*</url-pattern> 
    </filter-mapping>
     

        <!-- c3p0 连接池工具 -->
        <bean id="labtablesDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
            
            <property name="driverClass" value="com.mysql.jdbc.Driver" />
            <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&amp;characterEncoding=UTF-8&amp;sessionVariables=storage_engine=InnoDB" />
            <property name="user" value="test" />
            <property name="password" value="test" />    
            <!--连接池中保留的最大连接数。Default: 20 -->
            <property name="maxPoolSize" value="20" />
            <!--连接池中保留的最小连接数。Default: 20 -->
            <property name="minPoolSize" value="3" />
            <!--初始化时获取连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
            <property name="initialPoolSize" value="3" />        
            <!--当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒。Default: 0 -->
            <property name="checkoutTimeout" value="10000" />                <!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0-->
            <property name="maxStatements" value="100" />
            <!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 -->
            <property name="maxStatementsPerConnection" value="20" />        
            <!--定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意:测试的表必须在初始数据源的时候就存在。Default: null-->
            <property name="preferredTestQuery" value="select 1"></property>
            <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
            <property name="maxIdleTime" value="3600" />
            <!--每18000秒检查所有连接池中的空闲连接。Default: 0 -->
            <property name="idleConnectionTestPeriod" value="18000" />
            <!--如果设为true那么在取得连接的同时将校验连接的有效性。Default: false -->
            <property name="testConnectionOnCheckin" value="false" />        <!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable等方法来提升连接测试的性能。Default: false -->
            <property name="testConnectionOnCheckout" value="false" />
        </bean>

     

        <!-- dbcp 连接池工具 -->
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&amp;characterEncoding=UTF-8"/>
            <property name="username" value="mysqldev"/>
            <property name="password" value="mysqldev"/>        
            <!-- 连接池启动时创建的初始化连接数量(默认值为0) -->
            <property name="initialSize" value="5" />
            <!-- 连接池中可同时连接的最大的连接数(默认值为8,调整为20,高峰单机器在20并发左右,自己根据应用场景定) -->
            <property name="maxActive" value="20" />
            <!-- 连接池中最大的空闲的连接数,超过的空闲连接将被释放,如果设置为负数表示不限制(默认为8个,maxIdle不能设置太小,因为假如在高负载的情况下,连接的打开时间比关闭的时间快,会引起连接池中idle的个数 上升超过maxIdle,而造成频繁的连接销毁和创建,类似于jvm参数中的Xmx设置) -->
            <property name="maxIdle" value="20" />
            <!-- 连接池中最小的空闲的连接数,低于这个数量会被创建新的连接(默认为0,调整为5,该参数越接近maxIdle,性能越好,因为连接的创建和销毁,都是需要消耗资源的;但是不能太大,因为在机器很空闲的时候,也会创建低于minidle个数的连接,类似于jvm参数中的Xmn设置) -->
            <property name="minIdle" value="5" />
            <!-- 最大等待时间,当没有可用连接时,连接池等待连接释放的最大时间,超过该时间限制会抛出异常,如果设置-1表示无限等待(默认为无限,调整为60000ms,避免因线程池不够用,而导致请求被无限制挂起)-->
            <property name="maxWait" value="60000" />        

            <!-- 开启池的prepared(默认是false,未调整,经过测试,开启后的性能没有关闭的好。) 
            <property name="poolPreparedStatements" value="false"></property> -->
            <!-- 超过removeAbandonedTimeout时间后,是否进 行没用连接(废弃)的回收(默认为false,调整为true) -->
            <property name="removeAbandoned" value="true" />
            <!-- 超过时间限制,回收没有用(废弃)的连接(默认为 300秒,调整为180) -->
            <property name="removeAbandonedTimeout" value="180" />
            <!-- 连接池中连接,在时间段内一直空闲, 被逐出连接池的时间(默认为30分钟,可以适当做调整,需要和后端服务端的策略配置相关)-->
            <property name="minEvictableIdleTimeMillis" value="1800000" /> 
            <!-- 就是在进行borrowObject进行处理时,对拿到的connection进行validateObject校验 -->
            <property name="testOnBorrow" value="true" />
            <!-- 就是在进行returnObject对返回的connection进行validateObject校验 -->
            <property name="testOnReturn" value="true" />
            <!-- 关注的重点,GenericObjectPool中针对pool管理,起了一个Evict的TimerTask定时线程进行控制(可通过设置参数timeBetweenEvictionRunsMillis>0),定时对线程池中的链接进行validateObject校验,对无效的链接进行关闭后,会调用ensureMinIdle,适当建立链接保证最小的minIdle连接数。 -->
            <property name="testWhileIdle" value="true" />
            <!-- 检查的sql -->
            <property name="validationQuery" value="select 1" />
            <!-- 在执行检查时,通过statement设置,statement.setQueryTimeout(validationQueryTimeout)
            <property name="validationQueryTimeout" value="1" /> -->
            <!-- 设置的Evict线程的时间,单位ms,大于0才会开启evict检查线程 -->
            <property name="timeBetweenEvictionRunsMillis" value="3600000" />
            <!-- 每次检查链接的数量,建议设置和maxActive一样大,这样每次可以有效检查所有的链接 -->
            <property name="numTestsPerEvictionRun" value="20" />
        </bean>

  • Oracle dmp文件导入(还原)到不同的表空间和不同的用户

    方法一(常用):

    导出原表空和原用户的数据表结构(不含数据rows=n 表示不导出数据)。
    exp \'sys/pwd@orcl as sysdba\' file=xx.dmp buffer=65535 owner=user rows=n

    导出原表空间和原用户的数据库表及全部数据
    exp \'sys/pwd@orcl as sysdba\' file=xx.dmp buffer=65535 owner=user rows=y

    导入数据表,更换新用户和表空间, 加tablespaces=newtablespaces 参数
    imp \'sys/pwd@orcl as sysdba\' file=xx.dmp fromuser=user1 touser=user2 ignore=y tablespaces=newtablespaces log=xx.log
     
    注意:
    1.导入时如果不加参数 tablespace=XXX,总是报错:ORA-01950:对表空间无权限。
    2. 对临时表空间不能执行配额操作,对永久表空间可以。

     

    方法二:

    导出命令

    expdp username/password@orcl dumpfile=xxx.dmp directory=xxxxx schemas=username

    导入命令
      impdp onlinecolzs/onlinecozs dumpfile=XXX.dmp directory=dpdata1 remap_schema=onlinecol:onlinecolzs remap_tablespace=ts_onlinecol_prod:zaixianzs_data logfile=xxx.log
      参数说明
      dumpfile:需要导入的dmp文件名称
      directory:dmp文件所在的目录文件夹
      REMAP_SCHEMA: 该选项用于将源方案的所有对象装载到目标方案中。 REMAP_SCHEMA=source_schema:target_schema
      REMAP_TABLESPACE: 将源表空间的所有对象导入到目标表空间中。  REMAP_TABLESPACE=source_tablespace:target:tablespace 

    具体步骤:
       1、创建表空间和用户。
       2、创建目录
          create directory dpdata1 as 'D:\tempdmp'
       3、查询目录
          select * from dba_directories;
          把dmp文件复制到刚才创建的目录文件夹下(D:\tempdmp),这个文件夹需要自己手动创建。
       4、执行impdp导入命令:
          impdp onlinecolzs/onlinecozs dumpfile=XXX.dmp directory=dpdata1 remap_schema=onlinecol:onlinecolzs remap_tablespace=ts_onlinecol_prod:zaixianzs_data log=xxx.log
          其中:ts_onlinecol_prod:原先dmp文件的表空间名称,如果不知道原先的表空间名称是什么,先随便写个,到时候导入的时候会提示表空间不存在,把提示不存在的表空间名称写上去就可以。
                zaixianzs_data:需要导入到的表空间的名称(第一步创建的表空间名称)

  • mongodb之用户/认证/角色/权限管理

    一、安装

    1.下载解压

    wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.6.tgz

    tar -zxvf mongodb-linux-x86_64-rhel70-4.2.6.tgz  -C /usr/local/mongodb

    或 yum install mongodb -y

    3.新建目录

    mkdir /var/log/mongodb

    mkdir /home/mongo/data

    mkdir /var/run/mongodb

    4.增加配置文件内容

    vi /etc/mongod.conf
      dbPath: /home/mongo/data
      bindIp: 0.0.0.0

    启动:
    mongod --dbpath=/home/mongo/data --logpath=/var/log/mongodb/mongod.log --logappend --port=27017 --fork --auth

    停止:
    mongod --shutdown --config /etc/mongod.conf  或登陆后操作:db.shutdownServer();

    登录:

    mongo --port 27017 -u "username" -p "url编码" --authenticationDatabase "admin"

    启动报错:
    mongodb出现启动失败 child process failed, exited with 1 To see additional information in this output
    解决方式:

    i. 检查创建的mongod.conf文件中两个path指向路径跟创建路径名是否一致。
    ii.进入到数据存储路径,将该 “xxx.lock 文件” mongod.lock删除掉就好。

    二、内置角色
    1.数据库用户角色:read、readWrite
    2.数据库管理角色:dbAdmin、dbOwner、userAdmin
    3.集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager
    4.备份恢复角色:backup、restore
    5.所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
    6.超级用户角色:root
    7.内部角色:__system

    三、用户管理

    查看用户信息
    use admin
    db.getUser("username")
    1.添加用户,切换到需要添加用户的db
    use xxxx
    执行添加
    db.addUser(
        {
            user:"username",
            pwd:"password_url编码",
            roles:[
                {role:"read", db:"xxxx"},
                {role:"readWrite", db:"test"}
            ]
        }
    )

    添加超级用户,切换到admin数据库
    use admin
    执行添加
    db.addUser(
        {
            user:"username",
            pwd:"password_url编码",
            roles:[
                {role:"root", db:"admin"},
                {role:"dbAdminAnyDatabase",db:"admin"}
            ]
        }
    )

    2.删除用户,切换到用户授权的db
    use xx
    执行删除操作
    db.dropUser("username") 或者:db.system.users.remove({user:"test"})

    3.更新用户
    切换到用户授权的db
    use xx
    执行更新,字段会覆盖原来的内容
    db.updateUser("username",{
        pwd:"new password_url编码",
        customData:{
            "title":"PHP developer"
        }
    })

    更新用户密码
    use xx
    db.changeUserPassword("username","newpassword_url编码")

    删除用户角色
    use xx
    db.revokeRolesFromUser(
        "usename",
        [
          { role: "readWrite", db: "accounts" }
        ]
    )  

    添加用户角色
    use xx
    db.grantRolesToUser(
        "reportsUser",
        [
          { role: "root", db: "admin" }
        ]
    )

    四、基本操作

    查看帮助:db.help() 查询数据库:show dbs
    创建数据库:use dbName
    查看表:show tables;
    插入数据:db.<tableName>.insert();
    如:db.members.insert({name:"Michael",age:18,...});
    查询:db.<tableName>.find();   或  db.system.users.find();  或  show users;
    修改:如:db.members.update({name:"Michael"},{$set:{age:20}});
    删除表中的数据:如:db.members.remove({name:"Michael"});
    删除全部:db.members.remove({});
    删除表:db.members.drop();
    删除数据库:db.dropDatabase();

    五,角色管理

    查看角色信息
    use admin
    db.getRole("rolename",{showPrivileges:true})

    六,备份和恢复

    #备份
    mongodump -h ip:端口 -uroot -p密码 -d 数据库 -o 路径 #备份数据库
    mongodump -uroot -p密码 -d 数据库 -c 集合名 -o 路径 #备份数据库某个集合
    mongorestore -h ip:端口 -u用户名 -p密码 -d 数据库 --drop --dir /路径/数据库名/

    #加密后备份
    mongodump -h ip:端口-uroot -p密码 -d 数据库 --authenticationDatabase admin -o 路径
    mongodump -uroot -p密码 -d 数据库 -c 集合名 --authenticationDatabase admin -o 路径

    mongorestore -uroot -p密码 -d 数据库 --authenticationDatabase admin --drop --dir /路径/数据库名/

  • gitlab版本升级

    一、关闭部分gitlab服务

    备份

    /opt/gitlab/bin/gitlab-rake gitlab:backup:create

    gitlab 需要逐个版本进行升级,无需关闭gitlab服务,备份配置文件:

    mv  /etc/gitlab/gitlab.rb   /etc/gitlab/gitlab.rb_日期

    mv  /etc/gitlab/gitlab-secrets.json   /etc/gitlab/gitlab-secrets.json_日期

    二、下载gitlab文件

    centos

    https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/

    yum update gitlab-ce-版本号  -y

    或 rpm -Uvh gitlab-ce-版本号

    ubuntu

    https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu/pool/focal/main/g/gitlab-ce/

    dpkg -i gitlab-ce-版本号

    对比新旧配置文件:/etc/gitlab/gitlab.rb

    参考合并配置

    三、配置gitlab

    chmod -R 777 /var/opt/gitlab (可以不执行)

    gitlab-ctl reconfigure

    gitlab-ctl restart

    出现不能同步文件,需更新权限

    su - git

    chmod 700 /var/opt/gitlab/.ssh

    chmod 600 /var/opt/gitlab/.ssh/authorized_keys

    四、

    日志查看命令:gitlab-ctl tail

    日志进程启动命令(systemctl stop gitlab-runsvdir、systemctl start gitlab-runsvdir)

    出现CI/CD页面500错误,执行:

    # 官方说明,在操作后可能会将配置文件恢复为默认配置,建议操作前备份
    gitlab-rails console
    > ApplicationSetting.first.delete
    > ApplicationSetting.first
    => nill
    # 执行后重载配置文件发现问题解决
    gitlab-ctl reconfigure

  • openldap 安装

    1 、下载上传安装文件,使用二进制传送
    下载地址:http://www.oracle.com/technetwork/products/berkeleydb/downloads/index.html 
    下载地址:http://www.openldap.org/software/download/
     db-5.1.29.tar.gz    openldap-2.4.48.tgz

    2、修改安装文件权限
    #chmod u+x   db-5.1.29.tar.gz
    #chmod u+x   openldap-2.4.48.tgz

    3、解压db-5.1.29.tar.gz

    # tar -zxvf db-5.1.29.tar.gz

    4、cd到解压后的文件夹

    # cd db-5.1.29/build_unix

    5、运行源码安装配置
    #../dist/configure

    6、执行自动编译
    #make
    #make install

    7、在 /etc/ld.so.conf下添加
    # vi /etc/ld.so.conf
    include         /usr/local/BerkeleyDB.5.1/lib
    保存:wq
    运行ldconfig -v

    8、解压openldap-2.4.48.tgz

    # tar -zxvf openldap-2.4.48.tgz

    9、添加输出环境变量
    # vi /etc/profile
    添加
    export CPPFLAGS=-I/usr/local/BerkeleyDB.5.1/include
    export LDFLAGS=-L/usr/local/BerkeleyDB.5.1/lib
    export LD_LIBRARY_PATH=/usr/local/BerkeleyDB.5.1/lib:/usr/lib:/lib

    # source /etc/profile

    10、cd 到解压目录openldap-2.4.48

    # cd openldap-2.4.48
    11、运行源码安装配置
    # ./configure --enable-crypt --enable-passwd

    12、执行自动编译
    #make depend
    #make
    #make install

    13、修改/usr/local/etc/openldap下的slapd.conf
    #vi /usr/local/etc/openldap/slapd.conf
    加密密码方式:

    # /usr/local/sbin/slappasswd -s  password
    修改

    include        /usr/local/etc/openldap/schema/core.schema
    include         /usr/local/etc/openldap/schema/corba.schema
    include         /usr/local/etc/openldap/schema/cosine.schema
    include         /usr/local/etc/openldap/schema/inetorgperson.schema
    include         /usr/local/etc/openldap/schema/java.schema
    include         /usr/local/etc/openldap/schema/misc.schema
    include         /usr/local/etc/openldap/schema/nis.schema
    include         /usr/local/etc/openldap/schema/openldap.schema

    suffix          "dc=demo,dc=dcampus,dc=com"
    rootdn          "cn=Manager,dc=demo,dc=dcampus,dc=com"
    rootpw          password
    保存退出 :wq

    (如果启动出现error while loading shared libraries 错误
    检查/etc/ld.so.conf是否包含bdb的lib
    添加后运行
    ldconfig –v)

    14、复制文件

    # cd /usr/local/var/openldap-data/

    # cp DB_CONFIG.example DB_CONFIG

    # cp /usr/local/etc/openldap/DB_CONFIG.example /usr/local/var/openldap-data/DB_CONFIG 

    15、增加配置,属性与值之间通常使用三个Tab键进行分开

    # vi /usr/local/etc/openldap/slapd.conf

    access to *
            by self write
            by anonymous auth
            by * read
    loglevel 296
    checkpoint 2048 10
    logfile /usr/local/var/openldap-data/slapd.log

    16、编辑 /etc/rsyslog.conf,最后增加
    # vi /etc/rsyslog.conf
    local4.*   /var/log/ldap.log

    # /etc/init.d/rsyslog  restart

    17、启动: /usr/local/libexec/slapd

  • LDAP重启故障

    如果服务器意外重启,LDAP文件会损坏,需要删除,重新生成   

    1. 备份文件夹

    /usr/local/var/openldap-data

    1. 删除openldap-data 里下划线开头的文件,例如

    rm __db*

    3. 重新启动ldap

  • https证书转换

    证书转换参考:https://www.cnblogs.com/cuimiemie/p/6442668.html
    OpenSSL指令解释:https://blog.csdn.net/liao20081228/article/details/77159039
    在线工具:https://www.myssl.cn/tools/,https://csr.chinassl.net/index.html

    keytool和openssl生成的证书转换
    keytool生成证书示例
    生成私钥+证书:
    keytool -genkey -alias client -keysize 2048 -validity 3650 -keyalg RSA -dname "CN=localhost" -keypass $client_passwd -storepass $client_passwd -keystore ClientCert.jks
    生成文件文件ClientCert.jks。

    导出证书:

    ~/tmp/cert# keytool -export -alias client -keystore ClientCert.jks -storepass $client_passwd -file ClientCert.crt
    Certificate stored in file <ClientCert.crt>
    ~/tmp/cert# ll
    total 8
    -rw-r--r-- 1 root root  715 Jun 14 20:24 ClientCert.crt
    -rw-r--r-- 1 root root 2066 Jun 14 20:21 ClientCert.jks
    keytool工具不支持导出私钥。

    openssl生成证书示例
    生成公钥私钥:(备注:以下生成private.pem ,必须填写和确认密码,Enter pass phrase for private.pem和Verifying - Enter pass phrase for private.pem:,如果Apache使用这个钥匙启动,启动时需要输入密码)

    ~/tmp/cert# openssl genrsa -des3 -out private.pem 1024
    Generating RSA private key, 1024 bit long modulus
    .............................++++++
    ...........++++++
    e is 65537 (0x10001)
    Enter pass phrase for private.pem:
    Verifying - Enter pass phrase for private.pem:
    ~/tmp/cert# ll
    total 4
    -rw-r--r-- 1 root root 963 Jun 14 20:27 private.pem
    创建证书请求:

    ~/tmp/cert# openssl req -subj "/C=CN/ST=BJ/L=BJ/O=HW/OU=HW/CN=CL/emailAddress=xxx@xxx.com" -new -out cert.csr -key private.pem
    Enter pass phrase for private.pem:
    ~/tmp/cert# ll
    total 8
    -rw-r--r-- 1 root root 664 Jun 14 20:43 cert.csr
    -rw-r--r-- 1 root root 963 Jun 14 20:27 private.pem
    自签发证书:

    ~/tmp/cert# openssl x509 -req -in cert.csr -out public.crt -outform pem  -signkey private.pem -days 3650
    Signature ok
    subject=/C=CN/ST=BJ/L=BJ/O=HW/OU=HW/CN=CL/emailAddress=xxx@xxx.com
    Getting Private key
    Enter pass phrase for private.pem:
    ~/tmp/cert# ll
    total 12
    -rw-r--r-- 1 root root 664 Jun 14 20:43 cert.csr
    -rw-r--r-- 1 root root 963 Jun 14 20:27 private.pem
    -rw-r--r-- 1 root root 871 Jun 14 20:44 public.crt
    转换
    keytool和openssl生成的证书相互之间无法识别,keytool生成的为jsk文件,openssl默认生成的为PEM格式文件。需要先转换成pkcs12格式,然后再使用对方的命令转换成需要的格式。

    keytool生成的证书转换为PEM格式

    ~/tmp/cert# keytool -importkeystore -srcstoretype JKS -srckeystore ServerCert.jks -srcstorepass 123456 -srcalias server -srckeypass 123456 -deststoretype PKCS12 -destkeystore client.p12 -deststorepass 123456 -destalias client -destkeypass 123456 -noprompt
    root@SZV1000101361:~/tmp/cert# ll
    total 24
    -rw-r--r-- 1 root root  664 Jun 14 20:43 cert.csr
    -rw-r--r-- 1 root root 1708 Jun 14 21:01 client.p12
    -rw-r--r-- 1 root root  963 Jun 14 20:27 private.pem
    -rw-r--r-- 1 root root  871 Jun 14 20:44 public.crt
    -rw-r--r-- 1 root root 1372 Jun 14 20:57 ServerCert.jks
    -rw-r--r-- 1 root root 1682 Jun 14 20:55 server.p12
    导出证书:

    ~/tmp/cert# openssl pkcs12 -in client.p12 -passin pass:$passwd -nokeys -out client.pem
    MAC verified OK
    导出私钥:

    ~/tmp/cert# openssl pkcs12 -in client.p12 -passin pass:$passwd -nocerts -out client.crt
    MAC verified OK
    Enter PEM pass phrase:
    Verifying - Enter PEM pass phrase:
    root@SZV1000101361:~/tmp/cert# ll
    total 32
    -rw-r--r-- 1 root root  664 Jun 14 20:43 cert.csr
    -rw-r--r-- 1 root root 1184 Jun 14 21:10 client.crt
    -rw-r--r-- 1 root root 1708 Jun 14 21:01 client.p12
    -rw-r--r-- 1 root root 1127 Jun 14 21:07 client.pem
    -rw-r--r-- 1 root root  963 Jun 14 20:27 private.pem
    -rw-r--r-- 1 root root  871 Jun 14 20:44 public.crt
    -rw-r--r-- 1 root root 1372 Jun 14 20:57 ServerCert.jks
    -rw-r--r-- 1 root root 1682 Jun 14 20:55 server.p12
    PEM格式证书转换为jks文件

    转换为pkcs12格式:

    ~/tmp/cert# openssl pkcs12 -export -in public.crt -inkey private.pem -out server.p12 -name server -passin pass:${passwd} -passout pass:${passwd}
    ~/tmp/cert# ll
    total 16
    -rw-r--r-- 1 root root  664 Jun 14 20:43 cert.csr
    -rw-r--r-- 1 root root  963 Jun 14 20:27 private.pem
    -rw-r--r-- 1 root root  871 Jun 14 20:44 public.crt
    -rw-r--r-- 1 root root 1682 Jun 14 20:55 server.p12
    导入到jks中:

    ~/tmp/cert# keytool -importkeystore -srckeystore server.p12 -srcstoretype PKCS12 -srcstorepass ${passwd} -alias server -deststorepass ${passwd} -destkeypass ${passwd} -destkeystore ServerCert.jks
    ~/tmp/cert# ll
    total 20
    -rw-r--r-- 1 root root  664 Jun 14 20:43 cert.csr
    -rw-r--r-- 1 root root  963 Jun 14 20:27 private.pem
    -rw-r--r-- 1 root root  871 Jun 14 20:44 public.crt
    -rw-r--r-- 1 root root 1372 Jun 14 20:57 ServerCert.jks
    -rw-r--r-- 1 root root 1682 Jun 14 20:55 server.p12

  • CentOS7将firewalld换成iptables

    1.首先关闭firewalld服务
    systemctl stop firewalld
    systemctl disable firewalld
    systemctl mask firewalld

    2.安装iptables
    yum install  -y iptables  iptables-services

    3.开启iptables服务
    systemctl enable iptables
    systemctl start iptables

    4.保存
    service iptables save
    service iptables restart

    5.开机启动
    systemctl enable iptables

    systemctl status iptables

  • 使用keytool 生成证书

    keytool 简介
    keytool 是java 用于管理密钥和证书的工具
    其功能包括:
    创建并管理密钥
    创建并管理证书
    作为CA 为证书授权
    导入导出证书
    主要格式
    keytool 采用 keystore 文件来存储密钥及证书,其中可包括私钥、信任证书;
    keystore 文件主要使用 JKS格式(也可支持其他格式),带密钥存储;其中私钥的存储也有独立的密码;

    一、生成私钥和证书
    keytool -genkeypair -alias serverkey -keypass 123456 -storepass 123456 \
        -dname "C=cn,ST=gd,L=gz,O=gz,OU=gz,CN=xx.com" \
        -keyalg RSA -keysize 2048 -validity 3650 -keystore server.keystore
    参数说明
    storepass keystore 文件存储密码
    keypass 私钥加解密密码
    alias 实体别名(包括证书私钥)
    dname 证书个人信息
    keyalt 采用公钥算法,默认是DSA
    keysize 密钥长度(DSA算法对应的默认算法是sha1withDSA,不支持2048长度,此时需指定RSA)
    validity 有效期
    keystore 指定keystore文件
    二、查看keystore详情
    keytool -list -v -keystore server.keystore -storepass 123456

    三、证书导入导出
    导出证书(DER编码格式)
    keytool -exportcert -keystore server.keystore -file server.cer -alias serverkey -keypass 123456 -storepass 123456>
    使用openssl 查看
    openssl x509 -in server.cer -inform der -noout -text

    导出证书(PEM编码格式)
    keytool -exportcert -keystore server.keystore -rfc -file server.pem -alias serverkey -keypass 123456 -storepass 123456
    查看证书
    keytool -printcert -file server.cer/server.pem

    导入证书
    keytool -noprompt -importcert -keystore client_trust.keystore -file server.cer -alias client_trust -keypass 123456 -storepass 123456

    四、转换格式
    jks格式 转 pkcs12

    keytool -importkeystore -srckeystore server.keystore -destkeystore server.p12 -srcalias serverkey -destalias serverkey \
        -srcstoretype jks -deststoretype pkcs12 -srcstorepass 111111 -deststorepass 111111 -noprompt
    参数说明

    importkeystore 指示导入导出keystore文件,可用于同类型或不同类型的导入导出
    srckeystore 指示源keystore文件
    srcalias 指示源实体别名
    srcstoretype 指示源store类型(jks/pkcs12..)
    srcstorepass 指示源store密码
    noprompt 不弹出提示
    pkcs12 转jks格式与此同理

    六、场景示例

    Nginx 证书 转 JKS

    A pem证书和私钥合成p12

    openssl pkcs12 -export -in server.crt -inkey server.key -passin pass:111111 -password pass:111111 \
    -name server -out server.p12
    注意定义-name 选项,这将作为keystore识别实体的参数
    B p12 证书转jks 证书

    keytool -importkeystore -srckeystore server.p12 -destkeystore server.keystore \
    -srcstoretype pkcs12 -deststoretype jks -srcalias server -destalias server \
    -deststorepass 111111 -srcstorepass 111111
    如果p12 文件中未指定实体名称,使用keytool转换时则不需提供srcalias/destalias参数,而输出的keystore实体名称默认为1

    JKS 证书 转 Nginx证书

    A jks 证书转p12

    keytool -importkeystore -srckeystore server.keystore  -destkeystore server.p12 \
    -srcstoretype jks -deststoretype pkcs12 -srcalias server -destalias server \
    -deststorepass 111111 -srcstorepass 111111
    B p12 证书提取pem证书和私钥

    openssl pkcs12 -in server.p12 -clcerts -nokeys -password pass:111111 -out server.crt
    openssl pkcs12 -in server.p12  -nocerts -password pass:111111 -passout pass:111111 -out server.key
    其中得到的私钥文件为PKCS#8 加密格式,证书和密钥均为PEM文件编码。

  • Git常用命令整理与重要概念整理

    Git常用命令整理与重要概念整理

    Git重要概念

    master head

    每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。在Git里,有个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。

    一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点。

    每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长:

    当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上。

    从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变。

    假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并。

    合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支。

    工作区,暂存区

    • 工作区Workspace:就是你在电脑里能看到的目录,即你代码放的那个文件夹。即时性强,对文件的所有更改都会立刻提现在这里。
    • 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
    • 暂存区 Index / Stage:git add以后,当前对文件的更改会保存到这个区
    • 本地仓库Repository:git commit以后,当前暂存区里对文件的更改会提交到本地仓库
    • 远程仓库Remote:远程仓库名一般叫origin。git push以后,本地仓库里优先于远程仓库的commit会被push到远程仓库

    流程图

    下载安装

    git官网下载

    初始化

    初始化参数

    1. $ git config --global user.name "你的名字"  
    2. $ git config --global user.email "你的邮箱地址"  

    因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。

    注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

    初始化本地仓库

    1. $ git init 

    SSH key生成

    1. $ ssh-keygen -t rsa -C "你的邮箱地址" 

    clone代码

    1. // 克隆master分支  
    2. $ git clone <版本库的网址>  
    3. // 指定克隆的分支名  
    4. $ git clone -b <分支名> <版本库的网址>  

    .gitignore生效办法

    1. // 先把本地缓存删除(改变成未track状态)  
    2. $ git rm -r --cached .  
    3. // 然后再提交  
    4. $ git add .  
    5. $ git commit -m 'update .gitignore'  

    查看各种状态

    1. // 查看当前状态(分支名,有哪些改动,有哪些冲突,工作区暂存区中的内容,几个commit等等)  
    2. $ git status  
    3. // 查看本地仓库的提交历史  
    4. $ git log  
    5. // 查看本地仓库的提交历史,简洁版  
    6. $ git log --pretty=oneline  
    7. // 查看命令历史  
    8. $ git reflog  

    分支

    1. // 查看分支: 
    2. $ git branch -a  
    3. // 创建本地分支:  
    4. $ git branch <分支名>  
    5. // 切换本地分支:  
    6. $ git checkout <分支名>  
    7. // 创建+切换本地分支:  
    8. $ git checkout -b <name>  
    9. // 合并某分支到当前分支: 
    10. $ git merge <要合并的分支>
    11. // 将本地分支推送到远程
    12. $ git push origin <要推送的本地分支名>
    13. // 以远程分支为基础,建一个本地分支
    14. $ git checkout -b <本地分支名> origin/<远程分支名>
    15. // 删除本地分支:
    16. $ git branch -d <本地分支名>
    17. // 删除远程分支。将本地空分支推送到远程分支,相当于删除远程分支
    18. $ git push origin  :<要删除的远程分支名>

    更新和提交代码

    一个新的文件,或改动.刚开始只存在你的工作区。当你使用git add的时候,Git就会缓存这个改动并且跟踪。当你使用git commit的时候就会把你的改动提交到仓库里。

    1. // 缓存所有改动  
    2. $ git add --all  
    3. // 缓存单个文件的改动  
    4. $ git add <该文件的文件名,包含路径>  
    5. // 提交至本地仓库  
    6. $ git commit -m <提交备注>  
    7. // 更新本地代码  
    8. $ git pull origin <分支名>  
    9. // 将本地commit推送至远端  
    10. $ git push orign <分支名> 

    撤销

    1. // 撤销工作区某个文件的更改  
    2. $ git checkout [file]  
    3. // 撤销工作区所有文件的更改  
    4. $ git checkout .  
    5. // 重置暂存区的指定文件,与上一次commit保持一致。但更改并没有消失,而是更改打回工作区  
    6. $ git reset [file]  
    7. // 重置暂存区与工作区,与上一次commit保持一致。  
    8. $ git reset --hard <当前分支名>  
    9. // 重置当前分支的指针为指定commit,同时重置暂存区。但更改并没有消失,而是更改打回工作区  
    10. $ git reset [commit]    
    11. // 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致。  
    12. $ git reset --hard [commit]  
    13. // 重置当前HEAD为指定commit,但保持暂存区和工作区不变  
    14. $ git reset --keep [commit]  
    15. // 暂时将未提交的变化存入stash,稍后再弹出 
    16. $ git stash  
    17. $ git stash pop  
    18. git review  

    代码评审使用gerrit系统,git中使用git review <分支名>(默认是master) 命令执行review操作。

    规则

    • 提交reivew之前pull远程代码,保证提交以前是最新代码,有冲突需要本地合并处理。
    • 一个单一的功能的变更放入一个commit中,提交一次reivew。

    特殊情况

    • review没有通过怎么办?

    先回到要修改的那个commit

    1. $ git reset --soft  <要修改的那个commit的id> 

    继续修改你要改的文件。修改后add缓存文件,并执行

    1. $ git commit --amend 

    将刚生产的变更归并到上一次变更里,继续执行git review

    • 已经做了多个提交commits怎么办?

    如果多个提交是相关联的,请合并这个提交为一个提交

    1. // 查询最先提交的commit, 记住id.  
    2. $ git log   
    3. // 进行变基操作  
    4. $ git rebase -i  <上一步查到的id>  
    5. // 弹出的界面上罗列了最先提交的commit到现在的所有提交记录  
    6. //将每列开头的 'pick' 改成 's', 只保留第一列的 'pick'。  
    7. //保存修改后系统会自动把这些commits合并成一个commit.  
    8. // 如果遇到冲突需要手动解决。合并冲突后,继续变基, 直到所有commits都合并为止.  
    9. $ git rebase --continue  

    如果review中提交了多个commits,其中一个commit没review过怎么办(包括以前某个commit中没有生成change id)?一次commit对应生成一个review, 前一个review没通过的话,后面的review 通过了也提交不了。 必须把前面一个review 弄通过,后面的review才能提交。

    1. // 查询未通过的review对应的commit id(gerrit里有记录)  
    2. // 回到这个commit的前一个节点,注意有个^  
    3. $ 执行 git rebase -i  <未通过的review对应的commit id>^   
    4. // 修改并缓存要提交的文件后  
    5. $ git commit --amend  
    6. // 返回head处  
    7. $ git rebase --continue   
    8. // 提交对老review的更新  
    9. $ git review   
  • mariadb10.x 安全配置细节

    一、先下载mariadb ,新建mysql ,解压安装,按如下方式操作:

    useradd mysql

    tar -zxvf mariadb-10.3.4-linux-x86_64.tar.gz -C /usr/local/

    mv mariadb-10.3.4-linux-x86_64/ mysql/

    chown -R mysql:mysql mysql/

    ./scripts/mysql_install_db --user=mysql

    cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

    /etc/init.d/mysqld  start

    二、安全配置

    查询插件安装目录

    show variables like 'plugin_dir';

    1.安装simple_password_check,登录mysql

    #默认是8位,需大小字母,数字,特殊字符

    INSTALL SONAME 'simple_password_check';

    2.安装审计插件

    INSTALL PLUGIN server_audit SONAME 'server_audit';

    状态查看

    show global variables like '%audit%';

    show global status like '%audit%';

    去掉审计日志下前面#,配置参考my.cnf

    3.设置会话超时时间,最大尝试登陆失败次数,密码自动失效时间,参考my.cnf文件

    三、配置文件my.cnf

    # 2021-03-27
    # Example MariaDB config file for large systems.
    #
    # This is for a large system with memory = 512M where the system runs mainly
    # MariaDB.
    #
    # MariaDB programs look for option files in a set of
    # locations which depend on the deployment platform.
    # You can copy this option file to one of those
    # locations. For information about these locations, do:
    # 'my_print_defaults --help' and see what is printed under
    # Default options are read from the following files in the given order:
    # More information at: http://dev.mysql.com/doc/mysql/en/option-files.html
    #
    # In this file, you can use all long options that a program supports.
    # If you want to know which options a program supports, run the program
    # with the "--help" option.

    # The following options will be passed to all MariaDB clients
    [client]
    #password    = your_password
    port        = 3306
    default-character-set=UTF8
    socket        = /tmp/mysql.sock

    # Here follows entries for some specific programs

    # The MariaDB server
    [mysqld]
    port        = 3306
    socket        = /tmp/mysql.sock
    datadir         = /home/mysql/data
    #mysql 5.1
    #default-character-set=UTF8
    #mysql 5.5,10.x
    character-set-server=utf8
    default-storage-engine=innodb
    max_connections=1001
    skip-external-locking
    key_buffer_size = 512M
    max_allowed_packet = 1024M
    table_open_cache = 2048
    sort_buffer_size = 256M
    read_buffer_size = 256M
    read_rnd_buffer_size = 256M
    myisam_sort_buffer_size = 128M
    thread_cache_size = 256
    query_cache_size= 128M
    tmp_table_size = 1024M
    # Try number of CPU's*2 for thread_concurrency
    thread_concurrency = 32

    #log
    #log-error=/home/mysql/error.log
    #general_log = on
    #general_log_file=/home/mysql/mysql.log
    #slow_query_log = on
    #long_query_time=60
    #slow-query-log-file=/home/mysql/slowquery.log

    # 会话超时时间
    wait_timeout=36000
    interactive_timeout=3600

    # 审计日志
    #server_audit_logging=on
    #server_audit=FORCE_PLUS_PERMANENT
    #server_audit_file_rotate_size=100000000
    #server_audit_file_rotations=10
    #server_audit_file_rotate_now=on
    #server_audit_file_path=/home/mysql/server_audit.log

    # Point the following paths to different dedicated disks
    #tmpdir        = /tmp/

    # Don't listen on a TCP/IP port at all. This can be a security enhancement,
    # if all processes that need to connect to mysqld run on the same host.
    # All interaction with mysqld must be made via Unix sockets or named pipes.
    # Note that using this option without enabling named pipes on Windows
    # (via the "enable-named-pipe" option) will render mysqld useless!

    #skip-networking

    # Replication Master Server (default)
    # binary logging is required for replication
    #log-bin=mysql-bin

    # binary logging format - mixed recommended
    #binlog_format=mixed

    # required unique id between 1 and 2^32 - 1
    # defaults to 1 if master-host is not set
    # but will not function as a master if omitted
    server-id    = 1

    # Replication Slave (comment out master section to use this)
    #
    # To configure this host as a replication slave, you can choose between
    # two methods :
    #
    # 1) Use the CHANGE MASTER TO command (fully described in our manual) -
    #    the syntax is:
    #
    #    CHANGE MASTER TO MASTER_HOST=<host>, MASTER_PORT=<port>,
    #    MASTER_USER=<user>, MASTER_PASSWORD=<password> ;
    #
    #    where you replace <host>, <user>, <password> by quoted strings and
    #    <port> by the master's port number (3306 by default).
    #
    #    Example:
    #
    #    CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306,
    #    MASTER_USER='joe', MASTER_PASSWORD='secret';
    #
    # OR
    #
    # 2) Set the variables below. However, in case you choose this method, then
    #    start replication for the first time (even unsuccessfully, for example
    #    if you mistyped the password in master-password and the slave fails to
    #    connect), the slave will create a master.info file, and any later
    #    change in this file to the variables' values below will be ignored and
    #    overridden by the content of the master.info file, unless you shutdown
    #    the slave server, delete master.info and restart the slaver server.
    #    For that reason, you may want to leave the lines below untouched
    #    (commented) and instead use CHANGE MASTER TO (see above)
    #
    # required unique id between 2 and 2^32 - 1
    # (and different from the master)
    # defaults to 2 if master-host is set
    # but will not function as a slave if omitted
    #server-id       = 2
    #
    # The replication master for this slave - required
    #master-host     =   <hostname>
    #
    # The username the slave will use for authentication when connecting
    # to the master - required
    #master-user     =   <username>
    #
    # The password the slave will authenticate with when connecting to
    # the master - required
    #master-password =   <password>
    #
    # The port the master is listening on.
    # optional - defaults to 3306
    #master-port     =  <port>
    #
    # binary logging - not required for slaves, but recommended
    #log-bin=mysql-bin

    # Uncomment the following if you are using InnoDB tables
    #innodb_data_home_dir = /usr/local/mysql/data
    #innodb_data_file_path = ibdata1:10M:autoextend
    #innodb_log_group_home_dir = /usr/local/mysql/data
    # You can set .._buffer_pool_size up to 50 - 80 %
    # of RAM but beware of setting memory usage too high
    #innodb_buffer_pool_size = 256M
    #innodb_additional_mem_pool_size = 20M
    # Set .._log_file_size to 25 % of buffer pool size
    #innodb_log_file_size = 64M
    #innodb_log_buffer_size = 8M
    #innodb_flush_log_at_trx_commit = 1
    #innodb_lock_wait_timeout = 50

    [mysqldump]
    quick
    max_allowed_packet = 512M

    [mysql]
    no-auto-rehash
    # Remove the next comment character if you are not familiar with SQL
    #safe-updates

    [myisamchk]
    key_buffer_size = 256M
    sort_buffer_size = 256M
    read_buffer = 16M
    write_buffer = 16M

    [mysqlhotcopy]
    interactive-timeout

     

  • Linux安装clamav安全工具

    一、安装:

    CentOS:
    yum install pcre* zlib zlib-devel libssl-devel libssl wget libcurl-devel -y

    yum install -y epel-release

    yum install clamav -y

    yum install clamav-freshclam -y

    或:

    # tar -zxvf clamav-x.xxx.x.tar.gz

    # cd clamav-x.xxx.x

    # ./configure --prefix=/usr/local/clamav --with-pcre

    # make

    # make install

    # useradd clamav

    Ubuntu:

    wget http://www.clamav.net/downloads/production/clamav-1.0.0.linux.x86_64.deb
    dpkg -i clamav-1.0.0.linux.x86_64.deb

    useradd -r -m -s /bin/bash clamav

    备注:病毒库默认所在存储位置目录, ll -h /var/lib/clamav/

    #日志存放目录
    # mkdir -p /usr/local/clamav/logs     
    # touch /usr/local/clamav/logs/clamd.log
    # touch /usr/local/clamav/logs/freshclam.log

    #病毒更新目录
    # mkdir -p /usr/local/clamav/updata

    #病毒存放 目录
    # mkdir /usr/local/clamav/data

    二、配置clamav
    # cd  /usr/local/clamav/etc 或  /usr/local/etc
    # cp clamd.conf.sample clamd.conf
    # cp freshclam.conf.sample freshclam.conf

    vi clamd.conf
    #Example    注释掉这一行.
    添加下面三行:
    DatabaseDirectory /usr/local/clamav/data
    LogFile /usr/local/clamav/logs/clamd.log 
    PidFile /usr/local/clamav/data/clamd.pid

    vi freshclam.conf
    #Example    注释掉这一行. 
    添加下面三行 
    DatabaseDirectory /usr/local/clamav/updata
    UpdateLogFile /usr/local/clamav/logs/freshclam.log
    PidFile /usr/local/clamav/updata/freshclam.pid

    # chown -R clamav:clamav /usr/local/clamav

    三、更新病毒库
    # cd /usr/local/clamav/updata

    # /usr/local/clamav/bin/freshclam 或  /usr/local/bin/freshclam
    或者
    # wget http://database.clamav.net/main.cvd
    #wget http://database.clamav.net/daily.cvd
    #wget http://database.clamav.net/bytecode.cvd

    # chown -R clamav:clamav /usr/local/clamav

    #创建软链接
    ln -s /usr/local/clamav/bin/clamscan /usr/local/sbin/clamscan

    执行病毒查杀

    # 指定目录查杀并将结果输出到文件
    /usr/local/bin/clamscan -vri / --move=/usr/local/clamav/data/ -l /usr/local/clamav/logs/clamd.log

    四、定时更新及杀毒
    01 04 * * * /usr/local/clamav/bin/freshclam
    30 04 * * * /usr/local/clamav/bin/clamscan -r /home --remove -l /var/log/clamscan.log

  • mysql 5.7-8.0 安装及安全配置

    一、安装和初始化mysql数据库

    # tar -zxvf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz -C /usr/local/

    # mv mysql-5.7.22-linux-glibc2.12-x86_64/ mysql/

    #useradd mysql

    # chown -R mysql:mysql  mysql

    上传my.cnf 到/etc下

    # yum install numactl* -y

    #初始化数据库

    # /usr/local/mysql/bin/mysqld  --defaults-file=/etc/my.cnf  --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/home/mysql/data

    #启动数据库,设置自动启动

    # cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

    Centos7:

    # chkconfig --add mysqld

    Ubuntu:

    #systemctl enable mysqld

    查看管理员密码:

    在/home/mysql/error.log 查看最后一行:A temporary password is generated for root@localhost:初始密码

    Centos7:

    #/etc/init.d/mysqld start

    Ubuntu:

    #systemctl start mysqld

    登录后修改管理员密码

    (1)mysql 5.7:

    set password=PASSWORD('新密码');

    set sql_safe_updates=off;

    update mysql.user set authentication_string=PASSWORD('新密码');

    flush privileges;

    (2)mysql 8.0:

    /usr/local/mysql/bin/mysqladmin -u root -p'初始密码' password '新密码'

    set sql_safe_updates=off;

    alter user root@'localhost' identified with mysql_native_password by '新密码';

    alter user 'mysql.sys'@'localhost' identified with mysql_native_password by '新密码';

    alter user 'mysql.session'@'localhost' identified with mysql_native_password by '新密码';

    alter user 'mysql.infoschema'@'localhost' identified with mysql_native_password by '新密码';

    新建用户:

    create user user@'%' identified with mysql_native_password by '密码';

    grant all on *.* to user@'%';

    二、安全项配置

    三、配置文件my.cnf参考

    # 2023-07-13
    # For advice on how to change settings please see
    # http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
    # *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
    # *** default location during install, and will be replaced if you
    # *** upgrade to a newer version of MySQL.
    [client]
    port=3306
    default-character-set=utf8mb4
    socket = /tmp/mysql.sock

    [mysqld]
    #skip_grant_tables(root password reset)
    # Remove leading # and set to the amount of RAM for the most important data
    # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
    innodb_buffer_pool_size = 4G

    # Remove leading # to turn on a very important data integrity option: logging
    # changes to the binary log between backups.
    # log_bin

    # These are commonly set, remove the # and set as required.
    basedir = /usr/local/mysql
    datadir = /home/mysql/data
    port = 3306
    server-id = 10
    socket = /tmp/mysql.sock
    default-storage-engine=InnoDB
    max_connections = 2048
    max_connect_errors = 200
    max_allowed_packet = 1024M
    table_open_cache = 2048
    transaction_isolation = REPEATABLE-READ
    sort_buffer_size = 256M
    read_buffer_size = 256M
    read_rnd_buffer_size = 256M
    join_buffer_size = 512M
    bulk_insert_buffer_size = 512M
    thread_cache_size = 2048
    thread_stack = 512K
    tmp_table_size = 1024M
    max_heap_table_size = 1024M
    ft_min_word_len = 1
    innodb_temp_data_file_path=ibtmp1:12M:autoextend:max:8G

    #数据库默认区分大小,1不区分大小写
    lower_case_table_names=0

    #数据库默认字符集,排序规则
    character-set-server = utf8mb4
    collation-server = utf8mb4_general_ci

    #log
    #general_log = on
    #general_log_file=/home/mysql/mysql.log
    log-error=/home/mysql/error.log
    slow_query_log = on
    long_query_time=60
    slow-query-log-file=/home/mysql/slowquery.log

    #5.7安全策略插件
    plugin-load=validate_password.so
    validate-password=FORCE_PLUS_PERMANENT

    # 会话超时时间
    wait_timeout=36000
    interactive_timeout=3600
    #控制密码自动失效时间
    default_password_lifetime=3600
    #启用update和delete操作
    #sql_safe_updates=0
    #禁用访问底层文件系统
    local_infile=0

    # 最大尝试登陆失败3次
    plugin-load-add=connection_control.so
    connection-control=FORCE_PLUS_PERMANENT
    connection-control-failed-login-attempts=FORCE_PLUS_PERMANENT
    connection_control_failed_connections_threshold=3
    connection_control_min_connection_delay=60000

    #二进制日志
    #mysql binlog日志文件保存的过期时间,过期后自动删除
    #expire_logs_days = 7
    #log-bin=mysql-bin
    #binlog_format=mixed

    # Remove leading # to set options mainly useful for reporting servers.
    # The server defaults are faster for transactions and fast SELECTs.
    # Adjust sizes as needed, experiment to find the optimal values.
    # join_buffer_size = 128M
    # sort_buffer_size = 2M
    # read_rnd_buffer_size = 2M

    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

    [mysqldump]
    quick
    max_allowed_packet = 512M

    [mysql]
    no-auto-rehash
    default-character-set=utf8mb4
    safe-updates

    [myisamchk]
    key_buffer_size = 256M
    sort_buffer_size = 256M
    read_buffer = 16M
    write_buffer = 16M

    [mysqlhotcopy]
    interactive-timeout

    [mysqld_safe]
    open-files-limit = 8192

  • 黑客寻找网站真实IP手段揭秘

    一、 什么是CDN

    首先,我们来认识下最寻常的真实ip隐藏的方法“CDN”。

    内容分发网络(content delivery network或content distribution network,缩写作CDN)指一种通过互联网互相连接的电脑网络系统,利用最靠近每位用户的服务器,更快、更可靠地将音乐、图片、视频、应用程序及其他文件发送给用户,来提供高性能、可扩展性及低成本的网络内容传递给用户。

    CDN节点会在多个地点,不同的网络上摆放。这些节点之间会动态的互相传输内容,对用户的下载行为最优化,并借此减少内容供应者所需要的带宽成本,改善用户的下载速度,提高系统的稳定性。国内常见的CDN有ChinanNet Center(网宿科技)、ChinaCache(阿里云)等,国外常见的有Akamai(阿卡迈)、Limelight Networks(简称LLNW)等;如下图,国内外主流的CDN市场格局:

    1

    图1

    如图:用户先经由CDN节点,然后再访问web服务器。

    2

    二. 如何判断ip是否是网站真实ip

    1.Nslookup法

    黑客一般nslookup想要查的域名,若是有多个ip就是用了cdn,多半为假ip;如图:

    3

    2.多地ping域名法

    黑客也可以从多个地点ping他们想要确认的域名,若返回的是不同的ip,那么服务器确定使用了cdn,返回的ip也不是服务器的真实ip;

    常用的网址有just ping:http://itools.com/tool/just-ping等等。

    4

    图4

    黑客寻找网站真实IP手段大揭秘!

    3.“常识”判断法

    为啥叫“常识”判断法呢?

    ①.在反查网站ip时,如果此网站有1000多个不同域名,那么这个ip多半不是真实ip。常用的ip反查工具有站长工具(http://s.tool.chinaz.com/same)、微步在线(https://x.threatbook.cn/)等等。微步在线支持同服域名查询、子域名查询、服务查询、whois反查等,要注意的是,查询部分信息有次数限制,需先注册账号。

    ②.如果一个asp或者asp.net网站返回的头字段的server不是IIS、而是Nginx,那么多半是用了nginx反向代理,而不是真实ip。

    ③.如果ip定位是在常见cdn服务商的服务器上,那么是真实ip的可能性就微乎其微了。

    三. 如何寻找真实ip

    1、子域名查找法

    因为cdn和反向代理是需要成本的,有的网站只在比较常用的域名使用cdn或反向代理,有的时候一些测试子域名和新的子域名都没来得及加入cdn和反向代理,所以有时候是通过查找子域名来查找网站的真实IP。下面介绍些常用的子域名查找的方法和工具:

    ①.微步在线(https://x.threatbook.cn/)

    上文提到的微步在线功能强大,黑客只需输入要查找的域名(如baidu.com),点击子域名选项就可以查找它的子域名了,但是免费用户每月只有5次免费查询机会。如图:

    5

    图5

    ②.Dnsdb查询法。(https://dnsdb.io/zh-cn/)

    黑客只需输入baidu.com type:A就能收集百度的子域名和ip了。如图:

    6

    图6

    ③.Google 搜索

    Google site:baidu.com -www就能查看除www外的子域名,如图:

    7

    图7

    ④.各种子域名扫描器

    这里,主要为大家推荐子域名挖掘机和lijiejie的subdomainbrute(https://github.com/lijiejie/subDomainsBrute)

    子域名挖掘机仅需输入域名即可基于字典挖掘它的子域名,如图:

    8

    图8

    Subdomainbrute以windows为例,黑客仅需打开cmd进入它所在的目录输入Python subdomainbrute.py baidu.com --full即可收集百度的子域名,如图:

    9

    图9

    总结:收集子域名后尝试以解析ip不在cdn上的ip解析主站,真实ip成功被获取到。

    2、ip历史记录解析查询法

    有的网站是后来才加入CDN的,所以只需查询它的解析历史即可获取真实ip,这里我们就简单介绍几个网站:微步在线,dnsdb.ionetcraft(http://toolbar.netcraft.com/),Viewdns(http://viewdns.info/)等等。

    3、网站漏洞查找法

    通过网站的信息泄露如phpinfo泄露,github信息泄露,命令执行等漏洞获取真实ip。

    4、网站订阅邮件法

    黑客可以通过网站订阅邮件的功能,让网站给自己发邮件,查看邮件的源代码即可获取网站真实ip。

    5、理想zmap法

    首先从 apnic 网络信息中心获取ip段,然后使用Zmap的 banner-grab 对扫描出来 80 端口开放的主机进行banner抓取,最后在 http-req中的Host写我们需要寻找的域名,然后确认是否有相应的服务器响应。

    6、网络空间引擎搜索法

    常见的有以前的钟馗之眼,shodan(https://www.shodan.io/),fofa搜索(https://fofa.so/)。以fofa为例,只需输入:title:“网站的title关键字”或者body:“网站的body特征”就可以找出fofa收录的有这些关键字的ip域名,很多时候能获取网站的真实ip。

    10

    图10

    7、F5 LTM解码法

    当服务器使用F5 LTM做负载均衡时,通过对set-cookie关键字的解码真实ip也可被获取,例如:Set-Cookie: BIGipServerpool_8.29_8030=487098378.24095.0000,先把第一小节的十进制数即487098378取出来,然后将其转为十六进制数1d08880a,接着从后至前,以此取四位数出来,也就是0a.88.08.1d,最后依次把他们转为十进制数10.136.8.29,也就是最后的真实ip。

    通过以上的方法,被获取到的ip可能是真实的ip、亦可能是真实ip的同c段ip,还需要要对其进行相关测试,如与域名的绑定测试等,最后才能确认它是不是最终ip。

    所以,为了保护我们服务器,我们不好轻易暴露我们的真实ip,可以使用CDN、WAF等,在使用CDN的同时先确认ip历史记录中,是否存在你的真实ip,记得更换ip后再开启cdn。若网站有订阅邮件或发邮件的需求,可选择独立的服务器发取。子域名的ip记得隐匿,或者采取与主服务不同c段的服务器。

  • 如何排查MySQL执行死锁原因

    今天碰到一次因死锁导致更新操作的sql事务执行时间过长,特将排查过程记录如下:

    首先该sql事务的where条件已经命中了主键索引,而且表也不大,故可以排除扫表过慢原因。通过 show processlist;发现也只有该sql事务在操作这个表,初看起来似乎也不像是死锁的原因:

    1

    但通过咨询yellbehuang后发现,判断sql事务是否死锁不能简单通过show processlist来判断,而是要通过查询innodb锁的相关表来确定,和innodb锁有关的主要有三个表,

    innodb_trx         ## 当前运行的所有事务 
    innodb_locks       ## 当前出现的锁 
    innodb_lock_waits  ## 锁等待的对应关系

    上面表的各个字段的含义如下:

    innodb_locks: 
    +————-+———————+——+—–+———+——-+ 
    | Field       | Type                | Null | Key | Default | Extra | 
    +————-+———————+——+—–+———+——-+ 
    | lock_id     | varchar(81)         | NO   |     |         |       |#锁ID 
    | lock_trx_id | varchar(18)         | NO   |     |         |       |#拥有锁的事务ID 
    | lock_mode   | varchar(32)         | NO   |     |         |       |#锁模式 
    | lock_type   | varchar(32)         | NO   |     |         |       |#锁类型 
    | lock_table  | varchar(1024)       | NO   |     |         |       |#被锁的表 
    | lock_index  | varchar(1024)       | YES  |     | NULL    |       |#被锁的索引 
    | lock_space  | bigint(21) unsigned | YES  |     | NULL    |       |#被锁的表空间号 
    | lock_page   | bigint(21) unsigned | YES  |     | NULL    |       |#被锁的页号 
    | lock_rec    | bigint(21) unsigned | YES  |     | NULL    |       |#被锁的记录号 
    | lock_data   | varchar(8192)       | YES  |     | NULL    |       |#被锁的数据 
    innodb_lock_waits: 
    +-------------------+-------------+------+-----+---------+-------+ 
    | Field | Type | Null | Key | Default | Extra | 
    +-------------------+-------------+------+-----+---------+-------+ 
    | requesting_trx_id | varchar(18) | NO | | | |#请求锁的事务ID 
    | requested_lock_id | varchar(81) | NO | | | |#请求锁的锁ID 
    | blocking_trx_id | varchar(18) | NO | | | |#当前拥有锁的事务ID 
    | blocking_lock_id | varchar(81) | NO | | | |#当前拥有锁的锁ID 
    +-------------------+-------------+------+-----+---------+-------+ 
    innodb_trx : 
    +—————————-+———————+——+—–+———————+——-+ 
    | Field | Type | Null | Key | Extra | 
    +—————————-+———————+——+—–+———————+——-+ 
    | trx_id | varchar(18) | NO | | |#事务ID 
    | trx_state | varchar(13) | NO | | |#事务状态: 
    | trx_started | datetime | NO | | |#事务开始时间; 
    | trx_requested_lock_id | varchar(81) | YES | | |#innodb_locks.lock_id 
    | trx_wait_started | datetime | YES | | |#事务开始等待的时间 
    | trx_weight | bigint(21) unsigned | NO | | |# 
    | trx_mysql_thread_id | bigint(21) unsigned | NO | | |#事务线程ID 
    | trx_query | varchar(1024) | YES | | |#具体SQL语句 
    | trx_operation_state | varchar(64) | YES | | |#事务当前操作状态 
    | trx_tables_in_use | bigint(21) unsigned | NO | | |#事务中有多少个表被使用 
    | trx_tables_locked | bigint(21) unsigned | NO | | |#事务拥有多少个锁 
    | trx_lock_structs | bigint(21) unsigned | NO | | |# 
    | trx_lock_memory_bytes | bigint(21) unsigned | NO | | |#事务锁住的内存大小(B) 
    | trx_rows_locked | bigint(21) unsigned | NO | | |#事务锁住的行数 
    | trx_rows_modified | bigint(21) unsigned | NO | | |#事务更改的行数 
    | trx_concurrency_tickets | bigint(21) unsigned | NO | | |#事务并发票数 
    | trx_isolation_level | varchar(16) | NO | | |#事务隔离级别 
    | trx_unique_checks | int(1) | NO | | |#是否唯一性检查 
    | trx_foreign_key_checks | int(1) | NO | | |#是否外键检查 
    | trx_last_foreign_key_error | varchar(256) | YES | | |#最后的外键错误 
    | trx_adaptive_hash_latched | int(1) | NO | | |# 
    | trx_adaptive_hash_timeout | bigint(21) unsigned | NO | | |# 

    可以通过select * from INNODB_LOCKS a inner join INNODB_TRX b on a.lock_trx_id=b.trx_id and trx_mysql_thread_id=线程id 来获取该sql的锁状态,线程id可以通过上面的show processlist来获得,执行结果如下:

    2

    此时发现,该sql连接确实处于LOCK WAIT锁等待状态

    通过select * from innodb_lock_waits where requesting_trx_id=75CB26E5(即上面查询得到的lock_trx_id)可以得到当前拥有锁的事务ID 75CB26AE。

    3

    再通过select * from innodb_trx where lock_trx_id=75CB26AE获取sql语句与线程id

    4

    从上面的结果中看出,该事务处于running状态,但sql却为null,该线程id即对于上面show processlist的206机器的30764端口的连接,该连接处于sleep状态。为什么sql为null却依然占有锁?在查询相关资料和咨询jameszhou后,知道了这个实际和innodb 引擎的写机制有关,innodb执行写事务操作时,实际是先取得索引中该行的行锁(即使该表上没有任何索引,那么innodb会在后台创建一个隐藏的聚集主键索引),再在缓存里写入,最后事务commit后正式写入DB中并释放锁。之所以sql为null,是因为该连接已经把sql update操作执行写入缓存中了,但是由于代码bug没有最后commit,导致一直占用着行锁,后续新的连接想写这一行数据却因为一直取不到行锁而处于长时间的等待状态。

    那为什么innodb需要两次写?下面是我查询相关资料得出来的结论:

    因为innodb中的日志是逻辑的,所谓逻辑就是比如当插入一条记录时,它可能会导致在某一个页面(这条记录最终被插入的位置)的多个偏移位置写入某个长度的值,比如页头的记录数,槽数,页尾槽数据,页中的记录值等等,这些本是一些物理操作,而innodb为了节约日志量及其它一些原因,设计为逻辑处理的方式,那就是它会在一个页面的基础上,把一条记录插入,那么在日志记录中记录的内容为表空间号、页面号、记录的各个列的值等等,在内部转换为上面的物理操作。

    但这里的一个问题是,如果那个页面本身是错误的,这种错误有可能是因为写断裂(1个页面为16K,分多次写入,后面的有可能没有写成功,导致这个页面不完整)引起的,那么这个逻辑操作就没办法完成了,因为它的前提是这个页面还是正确的,完整的,因为如果这个页面不正确的话,这个页面里的数据是无效的,有可能产生各种不可预料的问题。

    那么正是因为这个问题,所以必须要首先保证这个页面是正确的,方法就是两次写,它的思想最终是一种备份思想,也就是一种镜像。

    innodb两次写的过程:

    可以将两次写看作是在Innodb表空间内部分配的一个短期的日志文件,这一日志文件包含100个数据页。Innodb在写出缓冲区中的数据页时采用的是一次写多个页的方式,这样多个页就可以先顺序写入到两次写缓冲区并调用fsync()保证这些数据被写出到磁盘,然后数据页才被定出到它们实际的存储位置并再次调用fsync()。故障恢复时Innodb检查doublewrite缓冲区与数据页原存储位置的内容,若数据页在两次写缓冲区中处于不一致状态将被简单的丢弃,若在原存储位置中不一致则从两次写缓冲区中还原。

  • Oracle常用数据字典表、视图的总结

    一数据字典的分类

    1. 静态数据字典表
    2. 静态数据字典视图 
    3. 动态数据字典表
    4. 动态数据字典视图

    二 数据字典的使用

    1. 静态数据字典表的使用

    静态数据字典表只能由 ORACLE 进行维护。

    2. 静态数据字典视图的使用 *

    通常用户通过对静态数据字典视图的查询可以获取所需要的所有数据库信息。

    Oracle 静态数据字典分类

    名称前缀                         含义

    user_            包含了当前数据库用户所拥有的所有的模式对象的信息

    all_                包含了当前数据库用户可以访问的所有的模式对象的信息

    dba_             包含了所有数据库对象信息,只有具有 DBA 角色的用户才能而过访

    这些视图 
    例如:
    select * from dba_tables
    select  * from all_tables
    select   * from user_tables;
    注: dba_ 开头的 必须是 sys 用户所有 ,非 sys 用户 需要在前面加 sys 前缀
    下面都是一些常用的视图家族,都有一个 DBA_ ALL_ USER_ 的视图

    常用的视图家族

    col_privs   包含了表的列权限信息,包含授予者,被授予者和权限名称等信息, 
    extents     存储分配信息,包括数据段名 表空间名和分区编号,分区大小 
    indexes    索引信息  包含索引类型, 唯一性, 索引作用等表的信息 
    ind_columns   索引列信息  包括索引上的列的排序方式等信息 
    object      对象信息, 包括对象名称 类型  创建时间 等信息 
    segments  表和索引的数据段信息,包括表空间,存储设置等信息 
    sequences   序列信息 包含序列名称 ,循环性,最大值等信息 
    source    除触发器之外的所有存储过程,函数,包的源代码信息  
    synonyms 同义词信息   包括引用的对象等信息 
    sys_privs   系统权限信息 包括系统权限名称 授予者 
    tab_columns   表和视图的列信息 ,包括列的数据类型等信息  
    tab_privs  表权限信息  
    tables  表信息 包括表所属的表空间 ,存储参数 ,数据行数量等信息。 
    triggers   触发器信息 包括触发器的类型,事件。触发器体等信息 
    users 用户信息 。包括用户临时和默认的表空间的类型 
    views   视图 信息  col_privs   包含了表的列权限信息,包含授予者,被授予者和权限名称等信息, 
    extents     存储分配信息,包括数据段名 表空间名和分区编号,分区大小 
    indexes    索引信息  包含索引类型, 唯一性, 索引作用等表的信息 
    ind_columns   索引列信息  包括索引上的列的排序方式等信息 
    object      对象信息, 包括对象名称 类型  创建时间 等信息 
    segments  表和索引的数据段信息,包括表空间,存储设置等信息 
    sequences   序列信息 包含序列名称 ,循环性,最大值等信息 
    source    除触发器之外的所有存储过程,函数,包的源代码信息  
    synonyms 同义词信息   包括引用的对象等信息 
    sys_privs   系统权限信息 包括系统权限名称 授予者 
    tab_columns   表和视图的列信息 ,包括列的数据类型等信息  
    tab_privs  表权限信息  
    tables  表信息 包括表所属的表空间 ,存储参数 ,数据行数量等信息。 
    triggers   触发器信息 包括触发器的类型,事件。触发器体等信息 
    users 用户信息 。包括用户临时和默认的表空间的类型 
    views   视图 信息  

    权限视图 

    role_sys_privs  角色拥有的系统权限视图
    role_tab_privs  角色拥有的对象权限
    user_role _ privs  用户拥有的角色 
    user_sys_privs   用户拥有的权限的角色
    user_tab_privs_mads    用户分配的关于表对象权限
    user_tab_privs_recd  用户拥有的关于表对象权限
    user_col_privs_mads  用户分配的关于列的对象权限
    user_col_privs_recd  用户拥有的关于列的对象权限 

    3.  动态性能表是数据库实例启动后 创建的表。

    动态性能表都数据 SYS 用户; 用于存放数据库在运行的过程中的性能相关的信息。

    通过以下的视图查看

    select name from  v_$fixed_table;

    4. 动态性能视图的使用;

    只有 sys 用户和拥有 DBA 角色的用户可以访问 。

    在数据库启动到 NOMOUNT 的状态时 可以访问 v$ parameter v$sga  v$session v$process v$instance v$version v$option 

    当数据库启动到 mount 的状态时 我们还可以访问 v$ log v$logfiel v$datafile v$controlfile  v$ database v$thread  v$datafile_header

    当数据库完全启动后。可以访问 v_$fixed_table

    动态性能视图的使用

    v$access   包含当前被锁定的数据库对象及正在访问他们的会话
    v$archive  包含归档所需的重做日志文件中的信息
    v$ archived_log   包含从控制文件中获取的归档日志信息。
    v$archive_processes  包含于一个实例相关的 arch 进程的状态信息 
    v$ backup   包含联机数据文件的备份状态信息 
    v$backup_async_io   包括从控制文件中获取的备份集的信息 
    v$ backup_corruption   包含从控制文件中获取的有关数据文件备份中损坏的信息。
    v$ backup_datafile   包含从控制文件中获取的备份的数据文件和备份控制文件的信息
    v$ backup_device   包含支持备份设备的信息
    v$backup_piece     包含从控制文件中获取的备份块的信息
    v$backup_redolog    包含从控制文件中获取的关于备份集的归档日志的信息
    v$backup_set    包含从控制文件中获取的备份集的信息
    v$bgprocess 包含数据库后台进程信息
    v$ buffer_pool   包含当前实例中所有可用缓冲池的信息
    v$ buffer_pool_statistics  包含当前实例所有可用缓冲池的统计信息
    v$ cache   包含当前实例的 SGA 中的每一块的头部信息
    v$context   包含当前对话的属性信息。
    v$controlfile   包含控制文件信息
    v$ controlfile_record_section   包含控制文件记录部分的信息
    v$ copy_curruption 包含从控制问价中获取的数据文件副本损坏的信息 
    v$database  包含从控制文件中获取的数据库信息 
    v$datafile   包含从控制文件中获取的数据文件信息
    v$datafile_copy  包括从控制文件中获取的数据文件副本的信息
    v$datafile_header  包含数据文件头部信息
    v$ db_object_cache  包含缓存在库高速缓冲中的数据库对象信息
    v$db_pipes   包含当前数据库中的管道信息
    v$deleted_object   包含从控制文件中获取的被删除的归档日志,数据文件副本和备份块的信息
    v$ dispatcher_rate   包含调度进程速率统计量的信息
    v$ dispatche   包含调度进程的信息
    v$ DLM_ALL_LOCKS  包含当前所有锁
    v$ DLM_CONVERT_LOCAL   包含本地锁转换操作所消耗的时间的信息 
    v$ EVENT_NAME   包含等待时间的信息
    v$ fixed_table   包含所有可用的动态性能视图和动态性能表的信息 
    v$ sysstat   包含当前实例的性能统计信息
    v$ instance  包含当前实例的详细信息 
    v$sga  包含 SGA 区的主要组成部分的信息 
    v$ sgainfo   包含 SGA 区的详细消息 
    v$ parameter 包含初始化参数信息 
    v$ sversion   包含 Oracle 版本信息 
    v$ option  包含已安装的 Oraclette 组件的选项信息 
    v$session   包含当前所有会话信息 
    v$process   包含当前系统所有进程信息 
    v$ bgprocess  包含数据库所有后台进程信息 
    v$ database  包含当前数据库信息
    v$ controlfile  包含当前数据库所有控制文件信息
    v$ datafile   包含当前数据库所有的数据文件的信息
    v$ dbfile   包含所有数据文件的编号信息 
    v$ logfile   包含当前数据库所有的重做日志文件信息
    v$ log  包含当前数据库重做日志文件信息 
    v$ log_history  包含重做日志文件切换情况的历史信息
    v$ thread  包含当前数据库线程的信息
    v$ lock 包含锁的信息 
    v$ locked_object   包含被加锁的数据库对象信息 
    v$ rollname 包含当前处于联机状态的回退信息 
    v$ rollstat    包含当前所有的回退段的统计信息 
    v$ tablespace  包含当前数据库所有表空间信息
    v$ tempfile   包含当前数据库多有的临时数据文件的信息 ;

    查看

    查看当前用户的缺省表空间
    SQL>select username,default_tablespace from user_users; 
    查看当前用户的角色
    SQL>select * from user_role_privs;
    查看当前用户的系统权限和表级权限
    SQL>select * from user_sys_privs;
    SQL>select * from user_tab_privs;
    查看用户下所有的表
    SQL>select * from user_tables;
    查看用户下所有的表的列属性
    SQL>select * from USER_TAB_COLUMNS where table_name=:table_Name; 
    显示用户信息 (所属表空间)
    select default_tablespace,temporary_tablespace
    from dba_users where username='GAME';

    1、用户

    查看当前用户的缺省表空间
    SQL>select username,default_tablespace from user_users; 
    查看当前用户的角色
    SQL>select * from user_role_privs; 
    查看当前用户的系统权限和表级权限
    SQL>select * from user_sys_privs;
    SQL>select * from user_tab_privs; 
    显示当前会话所具有的权限
    SQL>select * from session_privs; 
    显示指定用户所具有的系统权限
    SQL>select * from dba_sys_privs where grantee='GAME'; 
    显示特权用户
    select * from v$pwfile_users; 
    显示用户信息 (所属表空间)
    select default_tablespace,temporary_tablespace 
    from dba_users where username='GAME'; 
    显示用户的 PROFILE
    select profile from dba_users where username='GAME'; 

    2、表

    查看用户下所有的表
    SQL>select * from user_tables;
    查看名称包含 log 字符的表
    SQL>select object_name,object_id from user_objects
    where instr(object_name,'LOG')>0;
    查看某表的创建时间
    SQL>select object_name,created from user_objects where object_name=upper('&table_name');
    查看某表的大小
    SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments
    where segment_name=upper('&table_name');
    查看放在 Oracle 的内存区里的表
    SQL>select table_name,cache from user_tables where instr(cache,'Y')>0; 

    3、索引

    查看索引个数和类别
    SQL>select index_name,index_type,table_name from user_indexes order by table_name;
    查看索引被索引的字段
    SQL>select * from user_ind_columns where index_name=upper('&index_name');
    查看索引的大小
    SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments
    where segment_name=upper('&index_name'); 

    4、序列号

    查看序列号,last_number 是当前值
    SQL>select * from user_sequences; 

    5、视图

    查看视图的名称
    SQL>select view_name from user_views;
    查看创建视图的 select 语句
    SQL>set view_name,text_length from user_views;
    SQL>set long 2000; 说明:可以根据视图的 text_length 值设定 set long 的大小
    SQL>select text from user_views where view_name=upper('&view_name'); 

    6、同义词

    查看同义词的名称
    SQL>select * from user_synonyms; 

    7、约束条件

    查看某表的约束条件
    SQL>select constraint_name, constraint_type,search_condition, r_constraint_name
    from user_constraints where table_name = upper('&table_name');
    SQL>select c.constraint_name,c.constraint_type,cc.column_name
    from user_constraints c,user_cons_columns cc
    where c.owner = upper('&table_owner') and c.table_name = upper('&table_name')
    and c.owner = cc.owner and c.constraint_name = cc.constraint_name
    order by cc.position; 

    8、存储函数和过程

    查看函数和过程的状态
    SQL>select object_name,status from user_objects where object_type='FUNCTION';
    SQL>select object_name,status from user_objects where object_type='PROCEDURE';
    查看函数和过程的源代码
    SQL>select text from all_source where owner=user and name=upper('&plsql_name'); 
  • 量化交易平台

    国内在线量化平台:

    国外量化平台:

    相关平台:

    • 掘金量化 - 支持C/C++、C#、MATLAB、Python和R的量化交易平台
    • DigQuant - 提供基于matlab量化工具
    • SmartQuant - 策略交易平台
    • OpenQuant - 基于C#的开源量化回测平台

    基于图表的量化交易平台

    • 文华赢智 、TB、金字塔、MultiCharts 中国版 - 程序化交易软件、MT4、TradeStation
    • Auto-Trader - 基于MATLAB的量化交易平台
    • BotVS - 首家支持传统期货与股票证券与数字货币的量化平台

    开源框架

    • Pandas - 数据分析包
    • Zipline - 一个Python的回测框架
    • vnpy - 基于python的开源交易平台开发框架
    • tushare - 财经数据接口包
    • easytrader - 进行自动的程序化股票交易
    • pyalgotrade - 一个Python的事件驱动回测框架
    • pyalgotrade-cn - Pyalgotrade-cn在原版pyalgotrade的基础上加入了A股历史行情回测,并整合了tushare提供实时行情。
    • zwPython - 基于winpython的集成式python开发平台
    • quantmod - 量化金融建模
    • rqalpha - 基于Python的回测引擎
    • quantdigger - 基于python的量化回测框架
    • pyktrader - 基于pyctp接口,并采用vnpy的eventEngine,使用tkinter作为GUI的python交易平台
    • QuantConnect/Lean - Lean Algorithmic Trading Engine by QuantConnect (C#, Python, F#, VB, Java)
    • QUANTAXIS - 量化金融策略框架

    其他量化交易平台:

    Progress Apama、龙软DTS、国泰安量化投资平台、飞创STP、易盛程序化交易、盛立SPT平台、天软量化回测平台 、量邦天语、EQB-Quant

    数据源

    数据库

    网站、论坛、社区、博客

    国外:

    国内:

    交易API

    编程

    Python

    安装

    教程

    R

    安装

    教程

    C++

    教程

    Julia

    教程

    编程论坛

    编程能力在线训练

    • Solve Programming Questions | HackerRank - 包含常用语言(C++, Java, Python, Ruby, SQL)和相关计算机应用技术(算法、数据结构、数学、AI、Linux Shell、分布式系统、正则表达式、安全)的教程和挑战。
    • LeetCode Online Judge - C, C++, Java, Python, C#, JavaScript, Ruby, Bash, MySQL在线编程训练

    Quant Books

    • 《投资学》第6版[美]兹维·博迪.文字版 (link)
    • 《打开量化投资的黑箱》 里什·纳兰
    • 《宽客》[美] 斯科特·帕特森Scott Patterson) 著;译科卢开济 译
    • 《解读量化投资:西蒙斯用公式打败市场的故事》 忻海 
    • 《Trends in Quantitative Finance》 Frank J. Fabozzi, Sergio M. Focardi, Petter N. Kolm
    • 《漫步华尔街》麦基尔
    • 《海龟交易法则》柯蒂斯·费思
    • 《交易策略评估与最佳化》罗伯特·帕多
    • 《统计套利》 安德鲁·波尔《信号与噪声》纳特•西尔弗
    • 《期货截拳道》朱淋靖
    • 《量化投资—策略与技术》 丁鹏
    • 《量化投资—以matlab为工具》 李洋faruto
    • 《量化投资策略:如何实现超额收益Alpha》 吴冲锋
    • 《中低频量化交易策略研发(上)》 杨博理
    • 《走出幻觉走向成熟》 金融帝国
    • 《失控》凯文·凯利 《通往财务自由之路》范K撒普
    • 《以交易为生》 埃尔德
    • 《超越技术分析》图莎尔·钱德
    • 《高级技术分析》布鲁斯·巴布科克
    • 《积极型投资组合管理》格里纳德,卡恩
    • 《金融计量学:从初级到高级建模技术》 斯维特洛扎
    • 《投资革命》Bernstein
    • 《富可敌国》Sebastian Mallaby
    • 《量化交易——如何建立自己的算法交易事业》欧内斯特·陈
    • 聪明的投资者》 巴菲特
    • 《黑天鹅·如何应对不可知的未来》 纳西姆·塔勒布
    • 《期权、期货和其他衍生品》 约翰·赫尔
    • 《Building Reliable Trading Systems: Tradable Strategies That Perform As They Backtest and Meet Your Risk-Reward Goals》 Keith Fitschen
    • 《Quantitative Equity Investing》by Frank J. Fabozzi, Sergio M. Focardi, Petter N. Kolm
    • Barra USE3 handbook
    • 《Quantitative Equity Portfolio Management》 Ludwig Chincarini
    • 《Quantitative Equity Portfolio Management》 Qian & Hua & Sorensen

     

    Quant Papers

    Machine Learning Related

    • Cavalcante, Rodolfo C., et al. "Computational Intelligence and Financial Markets: A Survey and Future Directions." Expert Systems with Applications 55 (2016): 194-211.(link)

    Low Frequency Prediction

    • Atsalakis G S, Valavanis K P. Surveying stock market forecasting techniques Part II: Soft computing methods. Expert Systems with Applications, 2009, 36(3):5932–5941. (link)

    • Cai X, Lin X. Feature Extraction Using Restricted Boltzmann Machine for Stock Price Predic- tion. 2012 IEEE International Conference on Computer Science and Automation Engineering (CSAE), 2012. 80–83.(link)

    • Nair B B, Dharini N M, Mohandas V P. A stock market trend prediction system using a hybrid decision tree-neuro-fuzzy system. Proceedings - 2nd International Conference on Advances in Recent Technologies in Communication and Computing, ARTCom 2010, 2010. 381–385. (link)

    • Lu C J, Lee T S, Chiu C C. Financial time series forecasting using independent component analysis and support vector regression. Decision Support Systems, 2009, 47(2):115–125. (link)

    • Creamer G, Freund Y. Automated trading with boosting and expert weighting. Quantitative Finance, 2010, 10(4):401–420. (link)

    • Batres-Estrada, Bilberto. "Deep learning for multivariate financial time series." (2015). (link)

    • Xiong, Ruoxuan, Eric P. Nicholas, and Yuan Shen. "Deep Learning Stock Volatilities with Google Domestic Trends." arXiv preprint arXiv:1512.04916 (2015).(link)

    • Sharang, Abhijit, and Chetan Rao. "Using machine learning for medium frequency derivative portfolio trading." arXiv preprint arXiv:1512.06228 (2015).(link)

    Reinforcement Learning

    • Dempster, Michael AH, and Vasco Leemans. "An automated FX trading system using adaptive reinforcement learning." Expert Systems with Applications 30.3 (2006): 543-552. (link)

    • Tan, Zhiyong, Chai Quek, and Philip YK Cheng. "Stock trading with cycles: A financial application of ANFIS and reinforcement learning." Expert Systems with Applications 38.5 (2011): 4741-4755. (link)

    • Rutkauskas, Aleksandras Vytautas, and Tomas Ramanauskas. "Building an artificial stock market populated by reinforcement‐learning agents." Journal of Business Economics and Management 10.4 (2009): 329-341.(link)

    • Deng, Yue, et al. "Deep Direct Reinforcement Learning for Financial Signal Representation and Trading." (2016).(link)

    Natual Language Processing Related

    • Bollen J, Mao H, Zeng X. Twitter mood predicts the stock market. Journal of Computational Science, 2011, 2(1):1–8. (link)

    • Preis T, Moat H S, Stanley H E, et al. Quantifying trading behavior in financial markets using Google Trends. Scientific reports, 2013, 3:1684. (link)

    • Moat H S, Curme C, Avakian A, et al. Quantifying Wikipedia Usage Patterns Before Stock Market Moves. Scientific Reports, 2013, 3:1–5. (link)

    • Ding, Xiao, et al. "Deep learning for event-driven stock prediction." Proceedings of the 24th International Joint Conference on Artificial Intelligence (ICJAI’15). 2015. (link)

    • Fehrer, R., & Feuerriegel, S. (2015). Improving Decision Analytics with Deep Learning: The Case of Financial Disclosures. arXiv preprint arXiv:1508.01993. (link)

    High Frequency Trading

    • Nevmyvaka Y, Feng Y, Kearns M. Reinforcement learning for optimized trade execution. Proceedings of the 23rd international conference on Machine learning ICML 06, 2006, 17(1):673–680. (link)

    • Ganchev K, Nevmyvaka Y, Kearns M, et al. Censored exploration and the dark pool problem. Communications of the ACM, 2010, 53(5):99. (link)

    • Kearns M, Nevmyvaka Y. Machine learning for market microstructure and high frequency trading. High frequency trading - New realities for traders, markets and regulators, 2013. 1–21. (link)

    • Sirignano, Justin A. "Deep Learning for Limit Order Books." arXiv preprint arXiv:1601.01987 (2016). (link)

    • Deng, Yue, et al. "Sparse coding-inspired optimal trading system for HFT industry." IEEE Transactions on Industrial Informatics 11.2 (2015): 467-475.(link)

    • Ahuja, Saran, et al. "Limit order trading with a mean reverting reference price." arXiv preprint arXiv:1607.00454 (2016). (link)

    • Aït-Sahalia, Yacine, and Jean Jacod. "Analyzing the spectrum of asset returns: Jump and volatility components in high frequency data." Journal of Economic Literature 50.4 (2012): 1007-1050. (link)

    Portfolio Management

    • B. Li and S. C. H. Hoi, “Online portfolio selection,” ACM Comput. Surv., vol. 46, no. 3, pp. 1–36, 2014. (link)

    • Heaton, J. B., Polson, N. G., & Witte, J. H. (2016). Deep Portfolio Theory. (link)

    • Eugene F. Fama, Kenneth R. French. The cross-section of expected stock returns. Journal of Finance, 47 (1992), pp. 427–465.

    学术期刊

    一堆学术期刊可以常常去浏览一下,也会有许多思路,作者常常看的有:

    • Journal of FinanceJournal of Financial Economics
    • Review of Financial Studies
    • Journal of Accounting and Economics
    • Review of Accounting Studies
    • Journal of Accounting Research
    • Accounting Review
    • Journal of Financial and Quantitative Analysis
    • Financial Analysts Journal
    • Financial Management
    • Journal of Empirical Finance
    • Quantitative Finance
    • Journal of Alternative Investments
    • Journal of Fixed Income
    • Journal of Investing
    • Journal of Portfolio Management
    • Journal of Trading
    • Review of Asset Pricing Studies
    • 经济研究
    • 经济学(季刊)
    • 金融研究
    • 管理世界
    • 会计研究
    • 投资研究
  • Iptables 参考

    1.清除已有iptables规则
    iptables -F
    iptables -X
    iptables -Z

    2.开放指定的端口
    #允许本地回环接口(即运行本机访问本机),允许loopback!(不然会导致DNS无法正常关闭等问题)
    iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
    iptables -A INPUT -i lo -p all -j ACCEPT

    #允许访问80、443端口
    iptables -A INPUT -p tcp --dport 80 -j ACCEPT
    iptables -A INPUT -p tcp --dport 443 -j ACCEPT

    #允许访问25,110等邮件端口
    iptables -A INPUT -p tcp --dport 110 -j ACCEPT
    iptables -A INPUT -p tcp --dport 25 -j ACCEPT
    iptables -A INPUT -p tcp --sport 25 -j ACCEPT
    iptables -A INPUT -p tcp --dport 143 -j ACCEPT
    iptables -A INPUT -p tcp --dport 995 -j ACCEPT
    iptables -A INPUT -p tcp --dport 993 -j ACCEPT
    iptables -A INPUT -p tcp --dport 465 -j ACCEPT

    #应用端口
    iptables -A INPUT -p tcp --dport 8080 -j ACCEPT

    #允许办公IP段访问
    iptables -A INPUT -s 10.0.0.0/8 -p tcp -m tcp -j ACCEPT
    iptables -A INPUT -s 111.207.85.0/24 -p tcp -m tcp -j ACCEPT

    #限制访问基本规则
    iptables -A INPUT -p tcp --dport 3306 -j DROP
    iptables -A INPUT -p tcp --dport 1521 -j DROP
    iptables -A INPUT -p tcp --dport 389 -j DROP
    iptables -A INPUT -p tcp --dport 22 -j DROP
    iptables -A INPUT -p tcp --dport 6379 -j DROP
    iptables -A INPUT -p tcp -j DROP

    3.删除已添加的iptables规则
    iptables -L -n --line-numbers
    iptables -D INPUT xxx

    最后
    /etc/init.d/iptables save
    /etc/init.d/iptables restart

    4.drop非法连接
    iptables -A INPUT     -m state --state INVALID -j DROP
    iptables -A OUTPUT    -m state --state INVALID -j DROP
    iptables -A FORWARD -m state --state INVALID -j DROP

    5.允许所有已经建立的和相关的连接
    iptables-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

    6.端口转发
    iptables -t nat -A PREROUTING -d 210.38.224.226 -p tcp -m tcp --dport 22022 -j DNAT --to-destination 172.16.20.236:22
    iptables -t nat -A POSTROUTING -d 172.16.20.236 -p tcp -m tcp --dport 22 -j SNAT --to-source 210.38.224.226

    7.透明模式
    iptables -t nat -A PREROUTING -d 202.116.48.21 -p tcp -m tcp --dport 1158 -j DNAT --to-destination 172.19.13.20
    iptables -t nat -A POSTROUTING -d 172.19.13.20 -p tcp --dport 1158 -j MASQUERADE

    solaris IP Filter 基本配置
    ipfstat -io
    svcs -a |grep network |egrep "pfil|ipf"
    svcadm enable svc:/network/ipfilter:default
    svcadm disable svc:/network/ipfilter:default

  • Centos 5的yum源无法使用的解决方法

    通过修改CentOS-Base.repo文件中的源地址来处理

    vi /etc/yum.repos.d/CentOS-Base.repo

    将原mirrorlist行注释掉,并在原baseurl下分别添加新的源地址。
    新的源地址为http://vault.centos.org,我的操作系统是5.11可以找对应的源。

    最终更改CentOS-Base.repo文件内容如下,加粗部分为新加的内容,斜体部分为注释掉的内容。

    [base]
    name=CentOS-5.11 - Base - mirrors.aliyun.com
    failovermethod=priority
    baseurl=http://mirrors.aliyun.com/centos-vault/5.11/os/$basearch/
    gpgcheck=1
    gpgkey=http://mirrors.aliyun.com/centos-vault/RPM-GPG-KEY-CentOS-5
    #released updates
    [updates]
    name=CentOS-5.11 - Updates - mirrors.aliyun.com
    failovermethod=priority
    baseurl=http://mirrors.aliyun.com/centos-vault/5.11/updates/$basearch/
    gpgcheck=1
    gpgkey=http://mirrors.aliyun.com/centos-vault/RPM-GPG-KEY-CentOS-5
    #additional packages that may be useful
    [extras]
    name=CentOS-5.11 - Extras - mirrors.aliyun.com
    failovermethod=priority
    baseurl=http://mirrors.aliyun.com/centos-vault/5.11/extras/$basearch/
    gpgcheck=1
    gpgkey=http://mirrors.aliyun.com/centos-vault/RPM-GPG-KEY-CentOS-5
    #additional packages that extend functionality of existing packages
    [centosplus]
    name=CentOS-5.11 - Plus - mirrors.aliyun.com
    failovermethod=priority
    baseurl=http://mirrors.aliyun.com/centos-vault/5.11/centosplus/$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=http://mirrors.aliyun.com/centos-vault/RPM-GPG-KEY-CentOS-5
    #contrib - packages by Centos Users
    [contrib]
    name=CentOS-5.11 - Contrib - mirrors.aliyun.com
    failovermethod=priority
    baseurl=http://mirrors.aliyun.com/centos-vault/5.11/contrib/$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=http://mirrors.aliyun.com/centos-vault/RPM-GPG-KEY-CentOS-5
     
    

    文件修改完毕后,执行清空yum源缓存。完成后即可正常使用yum命令了。

    yum clean all

  • Mysql 解除正在死锁的状态

    解除正在死锁的状态有两种方法:

    第一种:

    1.查询是否锁表

    show OPEN TABLES where In_use > 0;

    2.查询进程(如果您有SUPER权限,您可以看到所有线程。否则,您只能看到您自己的线程)

    show processlist

    3.杀死进程id(就是上面命令的id列)

    kill id

     

    第二种:

    1.查看下在锁的事务 

    SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

    2.杀死进程id(就是上面命令的trx_mysql_thread_id列)

    kill 线程ID

     

    其它关于查看死锁的命令:

    1:查看当前的事务
    SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

    2:查看当前锁定的事务

    SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

    3:查看当前等锁的事务
    SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; 

  • 修改Linux 系统的最大进程数和最大文件打开数限制

    第一步:

    vi /etc/security/limits.conf

    最后增加:

    *               soft    nproc           65535
    *               hard    nproc           65535
    *               soft    nofile          65535
    *               hard    nofile          65535

    第二步:

    vi /etc/security/limits.d/90-nproc.conf

    注销:

    #*          soft    nproc     1024

     

     

  • LDAP的手工备份与恢复

    [方法1]

    一、备份数据库
    #/usr/sbin/slapcat  > mail_ldap.ldif 
    #/usr/local/bin/ldapsearch -x -b  "dc=demo,dc=abc,dc=com"  > /root/backup.ldif (不推荐,没成功)

    二、清空数据
    #/usr/local/bin/ldapdelete -x -D "cn=Manager,dc=demo,dc=abc,dc=com"  -w 'password' -r "dc=demo,dc=abc,dc=com" 

    直接删除/usr/local/var/openldap-data 下文件

    三、关闭LDAP
    #pkill slapd
    #kill -INT `cat /var/run/slapd.pid`

    四、导入备份文件
    #/usr/local/sbin/slapadd  -l  mail_ldap.ldif  -f  /usr/local/etc/openldap/slapd.conf
    #/usr/local/bin/ldapadd -x –c -D "dc=demo,dc=abc,dc=com" -w 'password' –f /root/backup.ldif (不推荐,没成功)

    [方法2]

    系统突然掉电或重启引起LDAP数据库意外关闭造成的。
    进入ldap数据目录(/openldap/var/openldap-data),执行db_recover,再启动服务.
    /var/lib/ldap slapd db_recover

  • 缺少动态连接库.so--cannot open shared object file: No such file or directory

    1. 用ln将需要的so文件链接到/usr/lib或者/lib这两个默认的目录下边

    ln -s /where/you/install/lib/*.so /usr/lib

    ln -s /where/you/install/lib/*.so /usr/lib64

    sudo ldconfig

    2.修改LD_LIBRARY_PATH

    export LD_LIBRARY_PATH=/where/you/install/lib:$LD_LIBRARY_PATH

    sudo ldconfig

    3.修改/etc/ld.so.conf,然后刷新

    vim /etc/ld.so.conf

    add /where/you/install/lib

    sudo ldconfig

  • MySQL服务器和客户机启用SSL

    一、创建Server SSL证书和私钥

    1.自动方式:

    /usr/local/mysql/bin/mysql_ssl_rsa_setup --datadir=/home/mysql/data

    2.手动方式:

    首先,创建一个临时的工作目录,我们将把私钥和证书文件放在该目录下。

    $ sudo mkdir /home/mysql/data
    $ cd /home/mysql/data

    检查Linux发行版在默认情况下都安装了OpenSSL。

    $ openssl version
    OpenSSL 1.0.1f 6 Jan 2014

    现在,继续创建CA私钥和证书。填好字段

    $ openssl genrsa 2048 > ca-key.pem
    $ openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem
    

    下一步是为服务器创建私钥。

    $ openssl req -sha1 -newkey rsa:2048 -days 3650 -nodes -keyout server-key.pem > server-req.pem

    填写上一步中提供的相同答案。

    下一步,使用下面这个命令,将服务器的私钥导出成RSA类型的密钥。

    $ openssl rsa -in server-key.pem -out server-key.pem

    最后,使用CA证书,创建服务器证书。

    $ openssl x509 -sha1 -req -in server-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem

     

    客户端SSL证书

    在服务器的CA私钥和证书驻留于其中的MySQL服务器主机上运行下列命令。

    $ openssl req -sha1 -newkey rsa:2048 -days 3650 -nodes -keyout client-key.pem > client-req.pem

    类似服务器端配置,上述命令会询问几个问题。只管填好字段,就像前面所做的那样。

    我们还需要将创建的客户机私钥转换成RSA类型,如下所示。

    $ openssl rsa -in client-key.pem -out client-key.pem

    最后,我们需要使用服务器的CA私钥和证书,创建客户机证书。

    $ openssl x509 -sha1 -req -in client-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem

    二、配置MySQL服务器上的SSL

    1.检查一下SSL选项已被启用还是被禁用。

    mysql> SHOW GLOBAL VARIABLES LIKE 'have_%ssl';
    

    2. 使用文本编辑工具,打开服务器的my.cnf配置文件。添加或去掉注释[mysqld]部分中类似下面内容的几行。这些应该指向你放在/etc/mysql-ssl中的私钥和证书。

    [mysqld]

    ssl-ca=/home/mysql/data/ca-cert.pem

    ssl-cert=/home/mysql/data/server-cert.pem

    ssl-key=/home/mysql/data/server-key.pem

    [client]

    ssl-ca=/home/mysql/data/ca-cert.pem

    ssl-cert=/home/mysql/data/client-cert.pem

    ssl-key=/home/mysql/data/client-key.pem

    3. 重启MySQL服务。

    $ sudo service mysql restart
    或
    $ sudo systemctl restart mysql
    或
    $ sudo /etc/init.d/mysql restart

    你只要查看MySQL错误日志文件(比如/home/mysql/mysql.log),就可以检查SSL配置有没有问题。

    创建拥有SSL权限的用户

    服务器端的SSL配置完成后,下一步就是创建有权通过SSL访问MySQL服务器的用户。为此,登录进入到MySQL服务器,输入下面内容:

    mysql> GRANT ALL PRIVILEGES ON *.* TO ‘ssluser’@’%’ IDENTIFIED BY ‘password‘ REQUIRE SSL;
    mysql> FLUSH PRIVILEGES;

    把“ssluser”(用户名)和“password”(密码)换成你自己的用户名和密码。

     

  • 服务器SSL不安全漏洞修复方案

    关于SSL POODLE漏洞 
    POODLE = Padding Oracle On Downgraded Legacy Encryption.是最新安全漏洞(CVE-2014-3566)的代号,俗称“贵宾犬”漏洞。 此漏洞是针对SSL3.0中CBC模式加密算法的一种padding oracle攻击,可以让攻击者获取SSL通信中的部分信息明文,如果将明文中的重要部分获取了,比如cookie,session,则信息的安全出现了隐患。 
    从本质上说,这是SSL设计上的缺陷,SSL先认证再加密是不安全的。

    如何检测漏洞 
    可以是通过在线检测工具https://wosign.ssllabs.com/来进行检测。

    修复措施: 
    禁用sslv3协议 
    不同的web server不尽相同。这边列举主流的服务器的禁用方式

    Nginx服务器: 
    注意:nginx和openssl套件版本过低可能会导致无法启用新型加密套件和算法,请升级最新版本。 
    (openssl1.0.1+版本支持TLS1.1和TLS1.2协议)

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;

    复制代码 
    apache服务器: 
    注意:apache和openssl套件版本过低可能会导致无法启用新型加密套件和算法,请升级最新版本。 
    (openssl1.0.1+版本支持TLS1.1和TLS1.2协议)

    apache2.X版本:

    SSLProtocol all -SSLv2 -SSLv3

    SSLCipherSuite AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL

    Tomcat服务器: 
    JDK版本过低也会带来不安全漏洞,请升级JDK为最新版本。升级JDK风险请安按照系统升级风险酌情考虑。 
    (先备份再配置,低版本的配置后有启动不了的风险,请升级tomcat和jdk版本,JDK1.7及以上支持TLS1.2协议)

    Tomcat 6 (prior to 6.0.38)

    <Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol"
                   maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
         keystoreFile="keystore/domain.jks"  keystorePass="证书密码"
                   clientAuth="false" sslProtocols="TLSv1,TLSv1.1,TLSv1.2"
                    ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,
                                    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
                                    TLS_RSA_WITH_AES_128_CBC_SHA256,
                                    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
                                    TLS_RSA_WITH_3DES_EDE_CBC_SHA,
                                    TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA" />

    Tomcat 7 and later

    < Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol"
                   maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
                   keystoreFile="keystore/SSL.jks"  keystorePass="证书密码"
                   clientAuth="false" sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2"
                   ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,
                                   TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
                                   TLS_RSA_WITH_AES_128_CBC_SHA256,
                                   TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
                                   TLS_RSA_WITH_3DES_EDE_CBC_SHA,
                                   TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA" />

    使用apr的tomcat(windows环境路径请使用“\”)

    <Connector port="443" maxHttpHeaderSize="8192"
                   maxThreads="150"
                   protocol="HTTP/1.1"
                   enableLookups="false" disableUploadTimeout="true"
                   acceptCount="100" scheme="https" secure="true"
                   SSLEnabled="true"
                   sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2"
                   SSLCertificateFile="conf/2_domian.com.crt"
                   SSLCertificateKeyFile="conf/3_domian.com.key"
                   SSLCertificateChainFile="conf/1_root_bundle.crt" />

    IIS服务器: 
    使用我们的套件工具,按照如下图进行修复。 
    下载地址: 
    windows server 2008 http://www.wosign.com/download/IISCrypto.exe 
    windows server 2012 https://www.nartac.com/Downloads/IISCrypto/IISCrypto40.exe 
    备注:windows server 2003不支持tls1.1和1.2请升级至2008 R2或2012 

    根据图示进行选择,修改完成后重启服务器。

  • Linux调整系统时区/时间的方法

    linux调整系统时区/时间的方法

    一、找到相应的时区文件

    /usr/share/zoneinfo/Asia/Shanghai

    用这个文件替换当前的/etc/localtime文件。

    步骤: cp -i /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

    选择覆盖

    二、安装ntpd

    1.安装
    yum install ntp
    systemctl start ntpd.service
    systemctl enable ntpd.service

    2.修改配置
    修改为阿里云ntp服务器
    vim /etc/ntp.conf

    # Use public servers from the pool.ntp.org project.
    # Please consider joining the pool (http://www.pool.ntp.org/join.html).
    #server 0.centos.pool.ntp.org iburst
    #server 1.centos.pool.ntp.org iburst
    #server 2.centos.pool.ntp.org iburst
    #server 3.centos.pool.ntp.org iburst
    server ntp.aliyun.com iburst
    server ntp1.aliyun.com iburst
    server ntp2.aliyun.com iburst
    server ntp3.aliyun.com iburst
    server ntp4.aliyun.com iburst
    server ntp5.aliyun.com iburst

    3.同步
    # ntpdate ntp1.aliyun.com

    01 01 * * * ntpdate ntp1.aliyun.com

  • 备份脚本(文件系统,Mysql,Oracle,openldap,MongoBackup,scpcommon)

    一、FileBackup.sh

    #! /bin/bash # This is a ShellScript For Auto File Backup # Power by wei # 2024-03-25 #准备工作:先在home目录下新建filebackup目录,再到filebackup目录新建logs目录 #上传到filebackup目录下,更改权限chmod 700 FileBackup.sh #设置备份程序文件,其所在目录,备份天数 File_NAME_Mart='xx1 xx2 xx3' File_DIR=/home FileBackupDay=60 #先配置好无密码登陆备份服务器 #设置备份服务器用户名、IP地址、scpcommom位置,注意 scpcommon 的File_NAME_Mart 应该和这里的一样 scpuser='' scpip=127.0.0.1 scpcommon_dir=/home/scpcommon scpport=22 #设置程序备份路径,日志备份路径 FileBackup_DIR=/home/filebackup FileBackup_DIR_logs=/home/filebackup/logs #以下一般无需更改 for File_NAME in $File_NAME_Mart do #新建程序备份文件夹,程序备份日志文件夹 FileBackup_DIR_=$FileBackup_DIR/$File_NAME FileBackup_DIR_logs_=$FileBackup_DIR_logs/$File_NAME if [ -d $FileBackup_DIR_ ] then echo " [ $FileBackup_DIR_ ] The FileBackup_DIR_ is exists, Can't Mkdir!" else mkdir $FileBackup_DIR/$File_NAME echo " [ $FileBackup_DIR_ ] Mkdir the FileBackup_DIR_ Success!" fi if [ -d $FileBackup_DIR_logs_ ] then echo " [ $FileBackup_DIR_logs_ ] The FileBackup_DIR_logs_ is exists, Can't Mkdir!" else mkdir $FileBackup_DIR_logs/$File_NAME echo " [ $FileBackup_DIR_logs_ ] Mkdir the FileBackup_DIR_logs_ Success!" fi #设置程序备份文件名,程序备份日志名 NewFile=$FileBackup_DIR_/"$File_NAME"backup$(date +"%Y.%m.%d-*").tar.gz DumpFile=$FileBackup_DIR_/"$File_NAME"backup$(date +"%Y.%m.%d-%H.%M.%S").tar OldFile=$FileBackup_DIR_/"$File_NAME"backup$(date +"%Y.%m.%d-*" --date=''$FileBackupDay' days ago').tar.gz DumpLogsFile=$FileBackup_DIR_logs_/"$File_NAME"logsbackup$(date +"%Y.%m.%d-%H.%M.%S").log OldLogsFile=$FileBackup_DIR_logs_/"$File_NAME"logsbackup$(date +"%Y.%m.%d-*" --date=''$FileBackupDay' days ago').log #记录备份开始时间 echo " ---start--- "$(date +"%y-%m-%d %H:%M:%S") >> $DumpLogsFile cd $File_DIR #删除旧程序文件,日志文件 find $FileBackup_DIR_logs_ -ctime +$FileBackupDay -name "*.log" -exec rm -rf {} \; >> $DumpLogsFile 2>&1 find $FileBackup_DIR_ -ctime +$FileBackupDay -name "*.tar.gz" -exec rm -rf {} \; >> $DumpLogsFile 2>&1 #开始备份程序 if [ -f $NewFile ] then echo " [ $NewFile ] The File Backup File is exists, Can't Backup!" >> $DumpLogsFile else tar -cf $DumpFile $File_NAME >> $DumpLogsFile 2>&1 gzip $DumpFile >> $DumpLogsFile 2>&1 echo " [ $NewFile ] File Backup Success!" >> $DumpLogsFile fi #备份结束 echo " ---end--- "$(date +"%y-%m-%d %H:%M:%S") >> $DumpLogsFile done #判断是否有用户名 if [ -n "$scpuser" ] then #远程登录并执行本地scpcommon文件 ssh -p ${scpport} $scpuser@${scpip} "$(<$scpcommon_dir)" for File_NAME in $File_NAME_Mart do scp_DumpLogsFile=$FileBackup_DIR_logs/$File_NAME/"$File_NAME"logsbackup_scp$(date +"%Y.%m.%d-%H.%M.%S").log scp_OldLogsFile=$FileBackup_DIR_logs/$File_NAME/"$File_NAME"logsbackup_scp$(date +"%Y.%m.%d-*" --date=''$FileBackupDay' days ago').log echo " ---start-scp--- "$(date +"%y-%m-%d %H:%M:%S") >> $scp_DumpLogsFile #删除旧的日志文件 find $FileBackup_DIR_logs/$File_NAME -ctime +$FileBackupDay -name "*.log" -exec rm -rf {} \; >> $scp_DumpLogsFile 2>&1 #传输应用备份文件 scp -P ${scpport} $FileBackup_DIR/$File_NAME/"$File_NAME"backup$(date +"%Y.%m.%d-*").tar.gz $scpuser@$scpip:./scp_filebackup/$File_NAME/ echo " scp $File_NAME Backup File success! " >> $scp_DumpLogsFile echo " ---end-scp--- "$(date +"%y-%m-%d %H:%M:%S") >> $scp_DumpLogsFile done else for File_NAME in $File_NAME_Mart do scp_DumpLogsFile=$FileBackup_DIR_logs/$File_NAME/"$File_NAME"logsbackup_scp$(date +"%Y.%m.%d-%H.%M.%S").log scp_OldLogsFile=$FileBackup_DIR_logs/$File_NAME/"$File_NAME"logsbackup_scp$(date +"%Y.%m.%d-*" --date=''$FileBackupDay' days ago').log echo " ---start-scp--- "$(date +"%y-%m-%d %H:%M:%S") >> $scp_DumpLogsFile #删除旧的日志文件 find $FileBackup_DIR_logs/$File_NAME -ctime +$FileBackupDay -name "*.log" -exec rm -rf {} \; >> $scp_DumpLogsFile 2>&1 echo " scp_user or scp_ip not set! " >> $scp_DumpLogsFile echo " ---end-scp--- "$(date +"%y-%m-%d %H:%M:%S") >> $scp_DumpLogsFile done fi

    二、MysqlBackup.sh

    # !/bin/bash # This is a ShellScript For Auto Mysql Backup # Power by wei # 2024-03-25 #准备工作:先在home目录下新建mysqlbackup目录,再到mysqlbackup目录新建logs目录 #上传到mysqlbackup目录下,更改权限chmod 700 MysqlBackup.sh #设置数据库名,数据库登陆名,密码,数据库IP地址,备份天数 MysqlDBMart='xx1 xx2 xx3' MysqlDBUser=root MysqlDBUserPasswd=root MysqlIP=127.0.0.1 MysqlBackupDay=100 MysqlPort=3306 #先配置好无密码登陆备份服务器 #设置备份服务器用户名、IP地址、scpcommom位置,注意 scpcommon 的MysqlDBMart 应该和这里的一样 scpuser='' scpip=127.0.0.1 scpcommon_dir=/home/scpcommon scpport=22 #设置数据库BIN路径,主备份文件路径,主日志文件路径 MysqlDBBinPath=/usr/local/mysql/bin MysqlBackupPath=/home/mysqlbackup MysqlLogsPath=/home/mysqlbackup/logs #以下一般无需更改 for MysqlDB in $MysqlDBMart do #新建数据库备份文件夹,日志文件夹 MysqlDBFile=$MysqlBackupPath/$MysqlDB MysqlDBLogsFile=$MysqlLogsPath/$MysqlDB if [ -d $MysqlDBFile ] then echo " [ $MysqlDBFile ] The MysqlDBFile is exists, Can't Mkdir!" else mkdir $MysqlBackupPath/$MysqlDB echo " [ $MysqlDBFile ] Mkdir the MysqlDBFile Success!" fi if [ -d $MysqlDBLogsFile ] then echo " [ $MysqlDBLogsFile ] The MysqlDBLogsFile is exists, Can't Mkdir!" else mkdir $MysqlLogsPath/$MysqlDB echo " [ $MysqlDBLogsFile ] Mkdir the MysqlDBLogsFile Success!" fi #设置备份数据文件名,日志文件名 NewFile=$MysqlDBFile/"$MysqlDB"backup$(date +"%Y.%m.%d-*").sql.gz DumpFile=$MysqlDBFile/"$MysqlDB"backup$(date +"%Y.%m.%d-%H.%M.%S").sql OldFile=$MysqlDBFile/"$MysqlDB"backup$(date +"%Y.%m.%d-*" --date=''$MysqlBackupDay' days ago').sql.gz DumpLogsFile=$MysqlDBLogsFile/"$MysqlDB"logsbackup$(date +"%Y.%m.%d-%H.%M.%S").log OldLogsFile=$MysqlDBLogsFile/"$MysqlDB"logsbackup$(date +"%Y.%m.%d-*" --date=''$MysqlBackupDay' days ago').log #记录备份开始时间 echo " ---start--- "$(date +"%y-%m-%d %H:%M:%S") >> $DumpLogsFile #删除旧数据文件,日志文件 find $MysqlDBLogsFile -ctime +$MysqlBackupDay -name "*.log" -exec rm -rf {} \; >> $DumpLogsFile 2>&1 find $MysqlDBFile -ctime +$MysqlBackupDay -name "*.sql.gz" -exec rm -rf {} \; >> $DumpLogsFile 2>&1 #开始备份数据 if [ -f $NewFile ] then echo " [ $NewFile ] The MySql Backup File is exists, Can't Backup!" >> $DumpLogsFile elif [ -z $MysqlIP ] then $MysqlDBBinPath/mysqldump -u $MysqlDBUser -p$MysqlDBUserPasswd --opt $MysqlDB > $DumpFile else $MysqlDBBinPath/mysqldump -h $MysqlIP -u $MysqlDBUser -p$MysqlDBUserPasswd -P$MysqlPort --opt $MysqlDB > $DumpFile fi gzip $DumpFile >> $DumpLogsFile 2>&1 echo " [ $DumpFile ] MySql Backup Success!" >> $DumpLogsFile #备份结束 echo " ---end--- "$(date +"%y-%m-%d %H:%M:%S") >> $DumpLogsFile done #判断是否有用户名 if [ -n "$scpuser" ] then #远程登录并执行本地scpcommon文件 ssh -p ${scpport} $scpuser@${scpip} "$(<$scpcommon_dir)" for MysqlDB in $MysqlDBMart do scp_DumpLogsFile=$MysqlLogsPath/$MysqlDB/"$MysqlDB"logsbackup_scp$(date +"%Y.%m.%d-%H.%M.%S").log scp_OldLogsFile=$MysqlLogsPath/$MysqlDB/"$MysqlDB"logsbackup_scp$(date +"%Y.%m.%d-*" --date=''$MysqlBackupDay' days ago').log echo " ---start-scp--- "$(date +"%y-%m-%d %H:%M:%S") >> $scp_DumpLogsFile #删除旧日志文件 find $MysqlLogsPath/$MysqlDB -ctime +$MysqlBackupDay -name "*.log" -exec rm -rf {} \; >> $scp_DumpLogsFile 2>&1 #传输数据库备份文件 scp -P ${scpport} $MysqlBackupPath/$MysqlDB/"$MysqlDB"backup$(date +"%Y.%m.%d-*").sql.gz $scpuser@$scpip:./scp_mysqlbackup/$MysqlDB/ echo " scp $MysqlDB Backup File success! " >> $scp_DumpLogsFile echo " ---end-scp--- "$(date +"%y-%m-%d %H:%M:%S") >> $scp_DumpLogsFile done else for MysqlDB in $MysqlDBMart do scp_DumpLogsFile=$MysqlLogsPath/$MysqlDB/"$MysqlDB"logsbackup_scp$(date +"%Y.%m.%d-%H.%M.%S").log scp_OldLogsFile=$MysqlLogsPath/$MysqlDB/"$MysqlDB"logsbackup_scp$(date +"%Y.%m.%d-*" --date=''$MysqlBackupDay' days ago').log echo " ---start-scp--- "$(date +"%y-%m-%d %H:%M:%S") >> $scp_DumpLogsFile #删除旧日志文件 find $MysqlLogsPath/$MysqlDB -ctime +$MysqlBackupDay -name "*.log" -exec rm -rf {} \; >> $scp_DumpLogsFile 2>&1 echo " scp_user or scp_ip not set! " >> $scp_DumpLogsFile echo " ---end-scp--- "$(date +"%y-%m-%d %H:%M:%S") >> $scp_DumpLogsFile done fi

    三、OracleBackup.sh

    #!/bin/bash # This is a ShellScript For Auto Oracle Backup # Power by wei # 2024-03-25 #准备工作:现在home目录下新建oraclebackup目录,再到oraclebackup目录新建logs目录 #上传到oraclebackup目录下,更改权限chmod 700 OracleBackup.sh #---start---复制oracle用户环境变量到此 export PATH export TMP=/home/oracle/tmp export TMPDIR=$TMP export ORACLE_BASE=/u01/oracle export ORACLE_HOME=$ORACLE_BASE/product/10.2.0 export ORACLE_SID=dcyx export ORACLE_TERM=xterm export PATH=$ORACLE_HOME/bin:$PATH export PATH=/usr/sbin:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin:$PATH export PATH=$ORACLE_BASE/common/oracle/bin:$PATH export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/network/jlib:$CLASSPATH #---end--- #设置表空间用户名,数据库登陆名,密码,备份天数 OracleDBMart='xx1 xx2 xx3' OracleDBName=orcl OracleDBUser=sys OracleDBUserPasswd= OracleBackupDay=100 #先配置好无密码登陆备份服务器 #设置备份服务器用户名、IP地址、scpcommom位置,注意 scpcommon 的OracleDBMart 应该和这里的一样 scpuser='' scpip=127.0.0.1 scpcommon_dir=/home/scpcommon scpport=22 #设置数据库BIN路径,主备份文件路径,主日志文件路径 OracleDBBinPath=/u01/oracle/product/10.2.0/bin OracleBackupPath=/home/oraclebackup OracleLogsPath=/home/oraclebackup/logs #以下一般无需更改 for OracleDB in $OracleDBMart do OracleDBFile=$OracleBackupPath/$OracleDB OracleDBLogsFile=$OracleLogsPath/$OracleDB #新建数据库备份文件夹,日志文件夹 if [ -d $OracleDBFile ] then echo " [ $OracleDBFile ] The OracleDBFile is exists, Can't Mkdir!" else mkdir $OracleBackupPath/$OracleDB echo " [ $OracleDBFile ] Mkdir the OracleDBFile Success!" fi if [ -d $OracleDBLogsFile ] then echo " [ $OracleDBLogsFile ] The OracleDBLogsFile is exists, Can't Mkdir!" else mkdir $OracleLogsPath/$OracleDB echo " [ $OracleDBLogsFile ] Mkdir the OracleDBLogsFile Success!" fi #设置备份数据文件名,日志文件名 NewFile=$OracleDBFile/"$OracleDB"backup$(date +"%Y.%m.%d-*").dmp.gz DumpFile=$OracleDBFile/"$OracleDB"backup$(date +"%Y.%m.%d-%H.%M.%S").dmp OldFile=$OracleDBFile/"$OracleDB"backup$(date +"%Y.%m.%d-*" --date=''$OracleBackupDay' days ago').dmp.gz DumpLogsFile=$OracleDBLogsFile/"$OracleDB"logsbackup$(date +"%Y.%m.%d-%H.%M.%S").log OldLogsFile=$OracleDBLogsFile/"$OracleDB"logsbackup$(date +"%Y.%m.%d-*" --date=''$OracleBackupDay' days ago').log #记录备份开始时间 echo " ---start--- "$(date +"%y-%m-%d %H:%M:%S") >> $DumpLogsFile #删除旧数据文件,日志文件 find $OracleDBLogsFile -ctime +$OracleBackupDay -name "*.log" -exec rm -rf {} \; >> $DumpLogsFile 2>&1 find $OracleDBFile -ctime +$OracleBackupDay -name "*.dmp.gz" -exec rm -rf {} \; >> $DumpLogsFile 2>&1 #开始备份数据 if [ -f $NewFile ] then echo " [ $NewFile ] The Oracle Backup File is exists, Can't Backup!" >> $DumpLogsFile else $OracleDBBinPath/exp userid=\'$OracleDBUser/$OracleDBUserPasswd@$OracleDBName as sysdba\' buffer=65536 rows=y owner=$OracleDB file=$DumpFile log=$DumpLogsFile gzip $DumpFile >> $DumpLogsFile 2>&1 echo " [ $DumpFile ] Oracle Backup Success!" >> $DumpLogsFile fi #备份结束 echo " ---end--- "$(date +"%y-%m-%d %H:%M:%S") >> $DumpLogsFile done #判断是否有用户名 if [ -n "$scpuser" ] then #远程登录并执行本地scpcommon文件 ssh -p ${scpport} $scpuser@${scpip} "$(<$scpcommon_dir)" for OracleDB in $OracleDBMart do scp_DumpLogsFile=$OracleLogsPath/$OracleDB/"$OracleDB"logsbackup_scp$(date +"%Y.%m.%d-%H.%M.%S").log scp_OldLogsFile=$OracleLogsPath/$OracleDB/"$OracleDB"logsbackup_scp$(date +"%Y.%m.%d-*" --date=''$OracleBackupDay' days ago').log echo " ---start-scp--- "$(date +"%y-%m-%d %H:%M:%S") >> $scp_DumpLogsFile #删除旧日志文件 find $OracleLogsPath/$OracleDB -ctime +$OracleBackupDay -name "*.log" -exec rm -rf {} \; >> $scp_DumpLogsFile 2>&1 #传输数据库备份文件 scp -P ${scpport} $OracleBackupPath/$OracleDB/"$OracleDB"backup$(date +"%Y.%m.%d-*").dmp.gz $scpuser@$scpip:./scp_oraclebackup/$OracleDB/ echo " scp $OracleDB Backup File success! " >> $scp_DumpLogsFile echo " ---end-scp--- "$(date +"%y-%m-%d %H:%M:%S") >> $scp_DumpLogsFile done else for OracleDB in $OracleDBMart do scp_DumpLogsFile=$OracleLogsPath/$OracleDB/"$OracleDB"logsbackup_scp$(date +"%Y.%m.%d-%H.%M.%S").log scp_OldLogsFile=$OracleLogsPath/$OracleDB/"$OracleDB"logsbackup_scp$(date +"%Y.%m.%d-*" --date=''$OracleBackupDay' days ago').log echo " ---start-scp--- "$(date +"%y-%m-%d %H:%M:%S") >> $scp_DumpLogsFile #删除旧日志文件 find $OracleLogsPath/$OracleDB -ctime +$OracleBackupDay -name "*.log" -exec rm -rf {} \; >> $scp_DumpLogsFile 2>&1 echo " scp_user or scp_ip not set! " >> $scp_DumpLogsFile echo " ---end-scp--- "$(date +"%y-%m-%d %H:%M:%S") >> $scp_DumpLogsFile done fi

    四、OpenldapBackup.sh

    #! /bin/bash # This is a ShellScript For Auto File Backup # Power by wei # 2024-03-25 #准备工作:现在home目录下新建openldapbackup目录,再到openldapbackup目录新建logs目录 #上传到openldapbackup目录下,更改权限chmod 700 OpenldapBackup.sh #增加系统环境变量 export CPPFLAGS=-I/usr/local/BerkeleyDB.4.8/include export LDFLAGS=-L/usr/local/BerkeleyDB.4.8/lib export LD_LIBRARY_PATH=/usr/local/BerkeleyDB.4.8/lib:/usr/lib:/lib #Openldap备份天数 OpenldapBackupDay=100 #设置备份路径,日志备份路径 OpenldapBackupPath=/home/openldapbackup OpenldapBackupLogsPath=/home/openldapbackup/logs #设置slapcat命令路径,slapcat配置文件路径 OpenldapBinPath=/usr/local/sbin/slapcat OpenldapSlapdPath=/usr/local/etc/openldap/slapd.conf #先配置好无密码登陆备份服务器 #设置备份服务器用户名、IP地址、scpcommom位置 scpuser='' scpip=127.0.0.1 scpcommon_dir=/home/scpcommon scpport=22 #设置Openldap备份文件名,程序备份日志名 NewFile=$OpenldapBackupPath/openldapbackup$(date +"%Y.%m.%d-*").ldif DumpFile=$OpenldapBackupPath/openldapbackup$(date +"%Y.%m.%d-%H.%M.%S").ldif OldFile=$OpenldapBackupPath/openldapbackup$(date +"%Y.%m.%d-*" --date=''$OpenldapBackupDay' days ago').ldif DumpLogsFile=$OpenldapBackupLogsPath/openldaplogsbackup$(date +"%Y.%m.%d-%H.%M.%S").log OldLogsFile=$OpenldapBackupLogsPath/openldaplogsbackup$(date +"%Y.%m.%d-*" --date=''$OpenldapBackupDay' days ago').log #记录备份开始时间 echo " ---start--- "$(date +"%y-%m-%d %H:%M:%S") >> $DumpLogsFile #删除旧Openldap文件,日志文件 find $OpenldapBackupLogsPath -ctime +$OpenldapBackupDay -name "*.log" -exec rm -rf {} \; >> $DumpLogsFile 2>&1 find $OpenldapBackupPath -ctime +$OpenldapBackupDay -name "*.ldif" -exec rm -rf {} \; >> $DumpLogsFile 2>&1 #开始备份Openldap if [ -f $NewFile ] then echo " [ $NewFile ] The OpenLdap Backup File is exists, Can't Backup!" >> $DumpLogsFile else $OpenldapBinPath -f $OpenldapSlapdPath -l $DumpFile >> $DumpLogsFile 2>&1 echo " [ $DumpFile ] OpenLdap Backup Success!" >> $DumpLogsFile fi #备份结束 echo " ---end--- "$(date +"%y-%m-%d %H:%M:%S") >> $DumpLogsFile #判断是否有用户名 if [ -n "$scpuser" ] then #远程登录并执行本地scpcommon文件 ssh -p ${scpport} $scpuser@${scpip} "$(<$scpcommon_dir)" scp_DumpLogsFile=$OpenldapBackupLogsPath/openldaplogsbackup_scp$(date +"%Y.%m.%d-%H.%M.%S").log scp_OldLogsFile=$OpenldapBackupLogsPath/openldaplogsbackup_scp$(date +"%Y.%m.%d-*" --date=''$OpenldapBackupDay' days ago').log echo " ---start-scp--- "$(date +"%y-%m-%d %H:%M:%S") >> $scp_DumpLogsFile #删除旧日志文件 find $OpenldapBackupLogsPath -ctime +$OpenldapBackupDay -name "*.log" -exec rm -rf {} \; >> $scp_DumpLogsFile 2>&1 #传输Openldap备份文件 scp -P ${scpport} $OpenldapBackupPath/openldapbackup$(date +"%Y.%m.%d-*").ldif $scpuser@$scpip:./scp_openldapbackup/ echo " scp $File_NAME Backup File success! " >> $scp_DumpLogsFile echo " ---end-scp--- "$(date +"%y-%m-%d %H:%M:%S") >> $scp_DumpLogsFile else scp_DumpLogsFile=$OpenldapBackupLogsPath/openldaplogsbackup_scp$(date +"%Y.%m.%d-%H.%M.%S").log scp_OldLogsFile=$OpenldapBackupLogsPath/openldaplogsbackup_scp$(date +"%Y.%m.%d-*" --date=''$OpenldapBackupDay' days ago').log echo " ---start-scp--- "$(date +"%y-%m-%d %H:%M:%S") >> $scp_DumpLogsFile #删除旧日志文件 find $OpenldapBackupLogsPath -ctime +$OpenldapBackupDay -name "*.log" -exec rm -rf {} \; >> $scp_DumpLogsFile 2>&1 echo " scp_user or scp_ip not set! " >> $scp_DumpLogsFile echo " ---end-scp--- "$(date +"%y-%m-%d %H:%M:%S") >> $scp_DumpLogsFile fi

    五、MongoBackup.sh

    # !/bin/bash # This is a ShellScript For Auto Mongo Backup # Power by wei # 2024-03-25 #准备工作:先在home目录下新建mongobackup目录,再到mongobackup目录新建logs目录 #上传到mongobackup目录下,更改权限chmod 700 MongoBackup.sh #设置数据库名,数据库登陆名,密码,数据库IP地址,备份天数 MongoDBMart='xx1 xx2 xx3' MongoDBUser=root MongoDBUserPasswd= MongoIP=127.0.0.1 MongoBackupDay=100 MongoPort=27017 #先配置好无密码登陆备份服务器 #设置备份服务器用户名、IP地址、scpcommom位置,注意 scpcommon 的MongoDBMart 应该和这里的一样 scpuser='' scpip=127.0.0.1 scpcommon_dir=/home/scpcommon scpport=22 #设置数据库BIN路径,主备份文件路径,主日志文件路径 MongoDBBinPath=/usr/bin MongoBackupPath=/home/mongobackup MongoLogsPath=/home/mongobackup/logs #以下一般无需更改 for MongoDB in $MongoDBMart do #新建数据库备份文件夹,日志文件夹 MongoDBFile=$MongoBackupPath/$MongoDB MongoDBLogsFile=$MongoLogsPath/$MongoDB if [ -d $MongoDBFile ] then echo " [ $MongoDBFile ] The MongoDBFile is exists, Can't Mkdir!" else mkdir $MongoBackupPath/$MongoDB echo " [ $MongoDBFile ] Mkdir the MongoDBFile Success!" fi if [ -d $MongoDBLogsFile ] then echo " [ $MongoDBLogsFile ] The MongoDBLogsFile is exists, Can't Mkdir!" else mkdir $MongoLogsPath/$MongoDB echo " [ $MongoDBLogsFile ] Mkdir the MongoDBLogsFile Success!" fi #设置备份数据文件名,日志文件名 NewFile=$MongoDBFile/"$MongoDB"backup$(date +"%Y.%m.%d-%H.%M.%S").tar.gz DumpFile=$MongoDBFile/$MongoDB OldFile=$MongoDBFile/"$MongoDB"backup$(date +"%Y.%m.%d-*" --date=''$MongoBackupDay' days ago').tar.gz DumpLogsFile=$MongoDBLogsFile/"$MongoDB"logsbackup$(date +"%Y.%m.%d-%H.%M.%S").log OldLogsFile=$MongoDBLogsFile/"$MongoDB"logsbackup$(date +"%Y.%m.%d-*" --date=''$MongoBackupDay' days ago').log #记录备份开始时间 echo " ---start--- "$(date +"%y-%m-%d %H:%M:%S") >> $DumpLogsFile #删除旧数据文件,日志文件 find $MongoDBLogsFile -ctime +$MongoBackupDay -name "*.log" -exec rm -rf {} \; >> $DumpLogsFile 2>&1 find $MongoDBFile -ctime +$MongoBackupDay -name "*.tar.gz" -exec rm -rf {} \; >> $DumpLogsFile 2>&1 #开始备份数据 if [ -f $NewFile ] then echo " [ $NewFile ] The Mongo Backup File is exists, Can't Backup!" >> $DumpLogsFile elif [ -z $MongoIP ] then $MongoDBBinPath/mongodump --db $MongoDB --username $MongoDBUser --password $MongoDBUserPasswd --out $MongoDBFile --authenticationDatabase admin >> $DumpLogsFile else $MongoDBBinPath/mongodump --host $MongoIP --port $MongoPort --db $MongoDB --username $MongoDBUser --password $MongoDBUserPasswd --out $MongoDBFile --authenticationDatabase admin >> $DumpLogsFile fi tar -czvf $NewFile $DumpFile rm -rf $DumpFile #gzip $DumpFile >> $DumpLogsFile 2>&1 echo " [ $DumpFile ] Mongo Backup Success!" >> $DumpLogsFile #备份结束 echo " ---end--- "$(date +"%y-%m-%d %H:%M:%S") >> $DumpLogsFile done #判断是否有用户名 if [ -n "$scpuser" ] then #远程登录并执行本地scpcommon文件 ssh -p ${scpport} $scpuser@${scpip} "$(<$scpcommon_dir)" for MongoDB in $MongoDBMart do scp_DumpLogsFile=$MongoLogsPath/$MongoDB/"$MongoDB"logsbackup_scp$(date +"%Y.%m.%d-%H.%M.%S").log scp_OldLogsFile=$MongoLogsPath/$MongoDB/"$MongoDB"logsbackup_scp$(date +"%Y.%m.%d-*" --date=''$MongoBackupDay' days ago').log echo " ---start-scp--- "$(date +"%y-%m-%d %H:%M:%S") >> $scp_DumpLogsFile #删除旧日志文件 find $MongoLogsPath/$MongoDB -ctime +$MongoBackupDay -name "*.log" -exec rm -rf {} \; >> $scp_DumpLogsFile 2>&1 #传输数据库备份文件 scp -P ${scpport} $MongoBackupPath/$MongoDB/"$MongoDB"backup$(date +"%Y.%m.%d-*").tar.gz $scpuser@$scpip:./scp_mongobackup/$MongoDB/ echo " scp $MongoDB Backup File success! " >> $scp_DumpLogsFile echo " ---end-scp--- "$(date +"%y-%m-%d %H:%M:%S") >> $scp_DumpLogsFile done else for MongoDB in $MongoDBMart do scp_DumpLogsFile=$MongoLogsPath/$MongoDB/"$MongoDB"logsbackup_scp$(date +"%Y.%m.%d-%H.%M.%S").log scp_OldLogsFile=$MongoLogsPath/$MongoDB/"$MongoDB"logsbackup_scp$(date +"%Y.%m.%d-*" --date=''$MongoBackupDay' days ago').log echo " ---start-scp--- "$(date +"%y-%m-%d %H:%M:%S") >> $scp_DumpLogsFile #删除旧日志文件 find $MongoLogsPath/$MongoDB -ctime +$MongoBackupDay -name "*.log" -exec rm -rf {} \; >> $scp_DumpLogsFile 2>&1 echo " scp_user or scp_ip not set! " >> $scp_DumpLogsFile echo " ---end-scp--- "$(date +"%y-%m-%d %H:%M:%S") >> $scp_DumpLogsFile done fi

    六、scpcommon

    # !/bin/bash # This is a ShellScript For Auto Backup # 2020-03-11 #上传到home目录下,更改权限chmod 700 scpcommon #注意File_NAME_Mart、MysqlDBMart、OracleDBMart、MongoDBMart应该和FileBackup.sh、MysqlBackup.sh、OracleBackup.sh、MongoBackup.sh 一致 File_NAME_Mart='' MysqlDBMart='' OracleDBMart='' MongoDBMart='' #备份服务器上备份天数 scp_FileBackupDay=100 scp_MysqlBackupDay=100 scp_OpenldapBackupDay=100 scp_OracleBackupDay=100 scp_MongoBackupDay=100 #备份服务器上的目录 scp_file_dir=scp_filebackup scp_mysql_dir=scp_mysqlbackup scp_openldap_dir=scp_openldapbackup scp_oracle_dir=scp_oraclebackup scp_mongo_dir=scp_mongobackup #循环新建File目录 for File_NAME in $File_NAME_Mart do if [ -d $scp_file_dir/$File_NAME ] then echo " [ $scp_file_dir/$File_NAME ] The filebackup is exists, Can't Mkdir! " find $scp_file_dir/$File_NAME -ctime +$scp_FileBackupDay -name "*.tar.gz" -exec rm -rf {} \; else mkdir -p $scp_file_dir/$File_NAME echo " [ $scp_file_dir/$File_NAME ] Mkdir the filebackup Success! " fi done #循环新建Mysql目录 for MysqlDB in $MysqlDBMart do if [ -d $scp_mysql_dir/$MysqlDB ] then echo " [ $scp_mysql_dir/$MysqlDB ] The mysqlbackup is exists, Can't Mkdir! " find $scp_mysql_dir/$MysqlDB -ctime +$scp_MysqlBackupDay -name "*.sql.gz" -exec rm -rf {} \; else mkdir -p $scp_mysql_dir/$MysqlDB echo " [ $scp_mysql_dir/$MysqlDB ] Mkdir the mysqlbackup Success! " fi done #循环新建Mongo目录 for MongoDB in $MongoDBMart do if [ -d $scp_mongo_dir/$MongoDB ] then echo " [ $scp_mongo_dir/$MongoDB ] The mongobackup is exists, Can't Mkdir! " find $scp_mongo_dir/$MongoDB -ctime +$scp_MongoBackupDay -name "*.sql.gz" -exec rm -rf {} \; else mkdir -p $scp_mongo_dir/$MongoDB echo " [ $scp_mongo_dir/$MongoDB ] Mkdir the mongobackup Success! " fi done #循环新建openldap目录 if [ -d $scp_openldap_dir ] then echo " [ $scp_openldap_dir ] The openldapbackup is exists, Can't Mkdir! " find $scp_openldap_dir -ctime +$scp_OpenldapBackupDay -name "*.ldif" -exec rm -rf {} \; else mkdir -p $scp_openldap_dir echo " [ $scp_openldap_dir ] Mkdir the openldapbackup Success! " fi #循环新建Oracle目录 for OracleDB in $OracleDBMart do if [ -d $scp_oracle_dir/$OracleDB ] then echo " [ $scp_oracle_dir/$OracleDB ] The oraclebackup is exists, Can't Mkdir! " find $scp_oracle_dir/$OracleDB -ctime +$scp_OracleBackupDay -name "*.dmp.gz" -exec rm -rf {} \; else mkdir -p $scp_oracle_dir/$OracleDB echo " [ $scp_oracle_dir/$OracleDB ] Mkdir the oraclebackup Success! " fi done
  • 安装两个Mysql 5.7

    如果/etc/profile 有mysql 环境变量请删除

    1、解压安装
       修改目录名称及权限

    2、修改my.cnf,放在安装目录

    [client]
    port=3306
    default-character-set=utf8mb4
    socket = /tmp/mysql2.sock

    [mysqld]
    basedir = /usr/local/mysql2
    datadir = /home/mysql2/data
    port = 3307
    server-id = 102
    socket = /tmp/mysql2.sock

    3、修改support-files/mysql.server

    basedir=/usr/local/mysql2
    datadir=/home/mysql2/data
    mysqld_pid_file_path=/home/mysql2/data/mysql2.pid
    conf=/usr/local/mysql2/my.cnf
    lock_file_path="$lockdir/mysql2"

    增加 --defaults-file及--user=mysql2

    $bindir/mysqld_safe --defaults-file="/usr/local/mysql2/my.cnf" --user=mysql2 --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null &

    如果不能启动,则写死修改为:

    /usr/local/mysql2/bin/mysqld_safe --defaults-file=/usr/local/mysql2/my.cnf --user=mysql2 --datadir=/home/mysql2/data --pid-file=/home/mysql2/data/mysql2.pid >/dev/null &

    4、初始化数据库
    /usr/local/mysql2/bin/mysqld --defaults-file=/usr/local/mysql2/my.cnf --initialize --user=mysql2 --basedir=/usr/local/mysql2 --datadir=/home/mysql2/data

    5、启动启动数据库

    cp /usr/local/mysql2/support-files/mysql.server /etc/init.d/mysqld2

    chkconfig --add mysqld2

    6、登陆数据库
    /usr/local/mysql2/bin/mysql -u root -p --socket=/tmp/mysql2.sock

    登录后修改管理员密码
    set password=PASSWORD('新密码');
    flush privileges;
    set sql_safe_updates=off;
    update mysql.user set authentication_string=PASSWORD('新密码');
    flush privileges;

  • 在Linux命令行下安装Oracle 10g(文本模式)

    Oracle 10g支持在命令行下用静默模式(Silent)安装,给那些没有安装图形界面的Linux系统提供了极大的便利。
    下面以Fedora Core 6为例,介绍在命令行下安装OracleOracle 10g的方法。

    1 安装前的准备
    准备工作要用登录为root用户来进行。

    1.1 选择安装环境的语言
    Oracle安装时可以通过环境变量LANG指定安装语言,如果Linux命令行不能显示中文,就要将语言环境设置为英语。
    例如:export LANG=en_US.UTF-8

    1.2 修改gennttab
    Oracle 10g在一些Linux系统下安装可能会被中断,在安装日志文件
    $ORACLE_HOME/install/make.log
    里可以看见以下错误信息
    /bin/sed: -e expression #1, char 7: unterminated `s' command
    要解决这个问题就必须编辑文件 gennttab。

    先解压Oracle安装目录下的 stage/Components/oracle.network.rsf/10.2.0.1.0/1/DataFiles/filegroup6.jar,可以用以下方法之一进行解压
    用jar解压:jar -xf filegroup6.jar bin/gennttab
    用unzip解压:unzip filegroup6.jar bin/gennttab

    再用文本编辑器(例如vi)打开解压出来的 gennttab,将以下内容
    LIB=`$ECHO ${TtoLIB} | $SED 's/ ///
    /g' | $GREP "^${T}:" | $AWK -F: '{print $2}'`
    INI=`$ECHO ${TtoINI} | $SED 's/ ///
    /g' | $GREP "^${T}:" | $AWK -F: '{print $2}'`
    BAS=`$ECHO ${TtoBAS} | $SED 's/ ///
    /g' | $GREP "^${T}:" | $AWK -F: '{print $2}'`
    改为
    LIB=`$ECHO ${TtoLIB} | $SED 's/ //n/g' | $GREP "^${T}:" | $AWK -F:
    '{print $2}'`
    INI=`$ECHO ${TtoINI} | $SED 's/ //n/g' | $GREP "^${T}:" | $AWK -F:
    '{print $2}'`
    BAS=`$ECHO ${TtoBAS} | $SED 's/ //n/g' | $GREP "^${T}:" | $AWK -F:
    '{print $2}'`

    保存后再用将gennttab更新到filegroup6.jar里面,可以用以下方法之一进行更新
    用jar更新:jar -uvf filegroup6.jar bin/gennttab
    用zip更新:zip -vu filegroup6.jar bin/gennttab

    //_____________________________________________________________________

    1.3 修改内核参数
    编辑文件 /etc/sysctl.conf,修改以下项目,如果没有可以自己添加。
    kernel.shmall = 2097152 # 可以使用的共享内存的总量。
    kernel.shmmax = 2147483648 # 最大共享内存段大小。
    kernel.shmmni = 4096 # 整个系统共享内存段的最大数目。
    kernel.sem = 250 32000 100 128 # 每个信号对象集的最大信号对象数;系统范围内最大信号对象数;每个信号对象支持的最大操作数;系统范围内最大信号对象集数。
    fs.file-max = 65536 # 系统中所允许的文件句柄最大数目。
    net.ipv4.ip_local_port_range = 1024 65000 # 应用程序可使用的IPv4端口范围。
    net.core.rmem_default = 1048576 # 套接字接收缓冲区大小的缺省值
    net.core.rmem_max = 1048576 # 套接字接收缓冲区大小的最大值
    net.core.wmem_default = 262144 # 套接字发送缓冲区大小的缺省值
    net.core.wmem_max = 262144 # 套接字发送缓冲区大小的最大值

    注:内核参数并非必须修改,可以根据自己实际情况而定。

    1.4 为Oracle创建DBA组和用户
    安装Oracle必须指定拥有DBA权限的组和运行Oracle的用户。
    创建组:groupadd oradba
    创建用户:useradd -g oradba oracle

    注:组名和用户名可以任意指定,不一定要照搬本文。

    1.5 创建安装Oracle的目标目录
    创建Oracle系统目录:mkdir /oracle
    创建Oracle服务器主目录:mkdir /oracle/10g
    将该目录的所有者设置为oracle:chown oracle /oracle -R
    编辑 /etc/profile,在后面追加以下两行
    export ORACLE_BASE=/oracle
    export ORACLE_HOME=/oracle/10g

    注:安装Oracle的目标目录可以任意指定,但是安装和运行Oracle的用户必须有完全修改该目录的权限。

    2 安装
    2.1 编辑安装需要的应答文件
    静默模式(Silent)安装必须指定一个应答文件来完成安装过程所须的各类参数。
    在Oracle安装目录的response子目录里有enterprise.rsp有enterprise.rsp、standard.rsp和custom.rsp三个应答文件,分别对应企业版、标准版和定制的安装。
    以enterprise.rsp为例,用任意的文本编辑器打它,修改以下这些项目的值。
    ORACLE_HOME Oracle服务器的主目录位置,必须是绝对路径。
    ORACLE_HOME_NAME Oracle服务器的名称,必须以字母开头。
    COMPONENT_LANGUAGES Oracle服务器支持的语言,默认只有英语,可以添加多个语言。
    s_nameForDBAGrp 用于Oracle系统管理的linux用户组名,该组的用户拥有管理Oracle服务器的权限,在本例中设置为 oradba。
    s_nameForOPERGrp 用于Oracle数据库常规操作的linux用户组名,该组的用户拥有常规操作Oracle数据库的权限,在本例中设置为 oracle。
    n_configurationOption 安装类型(1为在安装后创建数据库,2为安装后创建一个自动存储管理实例,3为只安装服务器软件),在本例中选择3。
    其它项目用默认值即可,也可以根据自己的须要进行修改。

    注:如果Oracle从光盘安装,必须先将应答文件复制到硬盘上,才能修改。

    2.2 开始安装
    现在万事具备,可以安装了。
    用oracle用户登录,然后在Oracle安装目录里执行
    ./runInstaller -ignoreSysPrereqs -silent -responseFile<应答文件的绝对路径>/standard.rsp
    接下来就是等待安装结束了。
    各安装参数的含义如下
    ignoreSysPrereqs 让Oracle忽略系统检查,因为Oracle官方声明只支持Linux服务器产品,所以要在非服务器产品的Linux上安装就必须指定此参数。
    silent 让安装程序以静默模式运行。
    responseFile 指定一个应答文件。

    //_____________________用oracle用户安装________________________________

    3 安装后要做的工作
    3.1 Oracle系统初始化
    用root用户登录,然后运行$ORACLE_HOME/root.sh进行Oracle的系统初始化工作,通常一路按回车用默认值即可。

    3.2 安装网络监听器
    没有网络监听器,客户端就无法通过网络连接Oralce服务器。要在命令行安装网络监听器,也只能使用静默模式。
    编辑Oracle安装目录里response子目录下的应答文件 netca.rsp,修改以下项目。
    INSTALL_TYPE=""custom"" 安装的类型
    LISTENER_NUMBER=1 监听器数量
    LISTENER_NAMES={"LISTENER"} 监听器的名称列表
    LISTENER_PROTOCOLS={"TCP;1521"} 监听器使用的通讯协议列表
    LISTENER_START=""LISTENER"" 监听器启动的名称
    然后运行
    $ORACLE_HOME/bin/netca (空格)/silent /responseFile <应答文件的绝对路径> /netca.rsp

    3.3 修改dbstart
    用任意的文本编辑器打开 $ORACLE_HOME/bin/dbstart,将
    ORACLE_HOME_LISTNER=/ade/vikrkuma_new/oracle
    改为
    ORACLE_HOME_LISTNER=$ORACLE_HOME
    否则网络监听器可能无法自动启动。

    3.4 安装数据库实例
    编辑Oracle安装目录里response子目录下的应答文件 dbca.rsp,修改以下项目。
    GDBNAME 数据库全局名称
    SID 数据库的SID
    SYSPASSWORD SYS用户的初始密码
    SYSTEMPASSWORD SYSTEM用户的初始密码
    CHARACTERSET 数据库字符集(中文为 ZHS16GBK)
    NATIONALCHARACTERSET 数据库国家字符集

    然后运行
    $ORACLE_HOME/bin/dbca (空格) -silent -responseFile <应答文件的绝对路径> /dbca.rsp -cloneTemplate
    数据库创建成功后须要注册一些信息,运行
    $ORACLE_BASE/oraInventory/orainstRoot.sh
    然后编辑 /etc/oratab

    <Oracle的SID>:<Oracle的主目录>:N
    修改为
    <Oracle的SID>:<Oracle的主目录>:Y
    使数据库实例能够自动启动。

    3.5 让Oracle运行为服务
    创建文件 /etc/init.d/oracle,输入下列内容

    #!/bin/sh
    #
    export ORACLE_HOME=<Oracle服务器主目录的绝对路径>
    export ORACLE_HOME_LISTNER=$ORACLE_HOME
    export ORACLE=oracle

    . /etc/init.d/functions

    export PATH=${PATH}:$ORACLE_HOME/bin

    start()
    {
        daemon --user $ORACLE $ORACLE_HOME/bin/dbstart
        daemon --user $ORACLE "$ORACLE_HOME_LISTNER/bin/lsnrctl start"
    }

    stop()
    {
        daemon --user $ORACLE "$ORACLE_HOME_LISTNER/bin/lsnrctl stop"
        daemon --user $ORACLE $ORACLE_HOME/bin/dbshut
    }

    case $1 in
    'start')
        start
        RETVAL=$?
        ;;
    'stop')
        stop
         RETVAL=$?
        ;;
    'restart')
        stop
        start
        RETVAL=$?
        ;;
    *)
        echo "usage: $0 {start|stop|restart}"
         exit
         ;;
    esac
    #
    exit

    然后将这个文件赋予可执行的权限,运行
    chmod a+x /etc/init.d/oracle
    让Oracle的服务在Linux启动时自动运行
    ln -s /etc/init.d/oracle /etc/rc.d/rc3.d/S99oracle
    ln -s /etc/init.d/oracle /etc/rc.d/rc5.d/S99oracle
    这样就可以用service来启动和停止Oracle了。

    附1 Oracle 10g对硬件环境的要求
    物理内存
    基本 - 512MB
    推荐 - 1024MB
    内存交换分区相对于物理内存的比例
    物理内存1024MB~2048MB - 150%
    物理内存2049MB~8192MB - 100%
    物理内存大于8192MB - 75%
    磁盘空间
    /tmp目录所在的分区至少要有400MB空闲磁盘空间。
    根据安装类型,安装Oracle服务器软件的分区至少要有1.5GB到3.5GB的空闲磁盘空间。
    1.2GB磁盘空间用于数据库预配置文件系统存储(可选)

    附2 Oracle 10g对软件环境的要求
    操作系统
    Red Hat Enterprise Linux AS/ES 3.0 (Update 4 or later)
    Red Hat Linux 4.0
    SUSE Linux Enterprise Server 9.0 with SP 2 or later
    Asianux 1.0
    Asianux 2.0
    软件包
    X11相关的库 (软件包名视操作系统而定,故不一一列出)
    gcc (版本至少为2.96-124)
    make (版本至少为3.79)
    binutils (版本至少为2.11)
    openmotif (版本至少为2.1.30)
    setarch (版本至少为1.3)
    compat-db (版本至少为4.0.14.5)
    compat-gcc (版本至少为7.3-2.96.122)
    compat-gcc-c++ (版本至少为7.3-2.96.122)
    compat-libstdc++ (版本至少为7.3-2.96.122)
    compat-libstdc++-devel (版本至少为7.3-2.96.122)
    sysstat (版本至少为5.0.5-1)
    libaio (版本至少为0.3.103-3)
    libaio-devel (版本至少为0.3.103-3)

    附3 相关链接
    在 Linux x86 上安装 Oracle 数据库 10g
    自动安装 Oracle 数据库 10g 和 Red Hat Enterprise Linux
    Oracle® Database Installation Guide for Linux x86
    Oracle数据库静默安装实践 
    Oracle的全球化支持 
    Oracle 10g文档库

    4 结束语
    现在Oracle 10g的安装已经完成,在任何一台电脑上装个Oracle客户端就可以对它进行管理了。
    如果要卸载Oracle,只须运行
    $./runInstaller -silent -deinstall -removeallfiles -removeAllPatches "REMOVE_HOMES={$ORACLE_HOME}" -responseFile <安装时使用的应答文件>

    #gunzip 10201_database_linux_x86_64.cpio.gz
    #cpio -idmv < 10201_database_linux_x86_64.cpio
    #ls
    10201_database_linux_x86_64.cpio  database

  • Oracle 创建表空间,用户及授权

    一、命令模式

    /*第1步:创建临时表空间 */

    create temporary tablespace user_temp

    tempfile 'D:\oracle\oradata\Oracle9i\user_temp.dbf'

    size 50m

    autoextend on

    next 50m maxsize 20480m

    extent management local;

    /*第2步:创建数据表空间 */

    create tablespace user_data

    logging

    datafile 'D:\oracle\oradata\Oracle9i\user_data.dbf'

    size 50m

    autoextend on

    next 50m maxsize unlimited

    extent management local;

    /*第3步:创建用户并指定表空间 */

    create user username identified by password

    default tablespace user_data

    temporary tablespace user_temp;

    /*第4步:给用户授予权限 */

    grant connect,resource,dba to username;

    (一个用户的默认表空间只能有一个,但是你可以试下用下面的语句为其授权在别的表空间中创建对像:

    alter user  username quota unlimited on tablespace_name;)

    二、运行OEMConsole图形模式

    emctl start dbconsole  (启动)

    emctl stop dbconsole  (停止)

    emctl status dbconsole  (查看状态)

    1)通过浏览器访问console:    http://hostname:portnumber/em,如图1所示:

    1

    图1.登录界面
    2)登录后出现数据库主页面,列出数据库里相关的主目录信息,如图2所示:

    2

    图2.数据库主界面
    4配置数据库
    在管理界面如图3所示:

    3

    图3.管理界面
    4.1创建表空间
    1)点击“表空间”进入创建表空间界面,点击“创建”,如图4所示:

    4

    图4.创建表空间
    2)输入相关表空间信息后点击确定即可,如图5所示:

    5

    图5.表空间界面
    4.1.1添加数据文件
    1)点击“添加”,进入添加数据文件页面,如图6所示:

    6

    2)在表空间页面输入表名,然后点击添加进入添加数据文件页面,通常数据文件名与表名相同,文件目录默认当前路径,如图所示:

    7

    图6.创建数据文件
    3)添加数据文件后,点击“确定”即可,亦可添加多个数据文件,如图7所示:

    8

    图7.完成数据文件创建
    4.2增加用户
    在管理主界面找到用户,如图8所示:

    9
    图8.主界面
    1)进入用户界面后点击“创建”进行增加用户,如图9所示:

    10

    图9.创建用户
    2)进入创建用户界面,输入对应的相关用户信息后点击确定即可,如图10所示:

    11

    图10.创建用户界面
    注:一个用户对应一个表空间
    4.3设置限额
    增加用户后需设置限额,限额分为无限制和值,通常设置为无限制,如图11所示:

    12

    图11.设置限额
    4.4角色授权
    1)在主界面找到角色,点击“系统权限”进入角色授权页面进行对该用户进行授权,如图12所示:

    13

    图12.编辑角色列表
    2)点击“编辑列表”进入角色设置页面,如图13所示:

    14

    图13.设置角色
    注:在设置系统权限时必须设置的权限有:create cluster,create indextype,create job,create procedure,create sequence,create synonym,create table, create trigger,create type,create view;

    15
  • 大型网站技术实践初级篇:借助LVS+Keepalived实现负载均衡

    一、负载均衡:必不可少的基础手段

    1.1 找更多的牛来拉车吧

      当前大多数的互联网系统都使用了服务器集群技术,集群即将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是Web应用服务器集群,也可以是数据库服务器集群,还可以是分布式缓存服务器集群等等。

    1

    古人有云:当一头牛拉不动车的时候,不要去寻找一头更强壮的牛,而是用两头牛来拉车

    2

      在实际应用中,在Web服务器集群之前总会有一台负载均衡服务器,负载均衡设备的任务就是作为Web服务器流量的入口,挑选最合适的一台Web服务器,将客户端的请求转发给它处理,实现客户端到真实服务端的透明转发。最近几年很火的「云计算」以及分布式架构,本质上也是将后端服务器作为计算资源、存储资源,由某台管理服务器封装成一个服务对外提供,客户端不需要关心真正提供服务的是哪台机器,在它看来,就好像它面对的是一台拥有近乎无限能力的服务器,而本质上,真正提供服务的,是后端的集群。

    1.2 负载均衡的类型

      负载均衡可以采用硬件设备(例如常常听见的F5),也可以采用软件负载。

      商用硬件负载设备成本通常较高(一台几十万上百万很正常),所以在条件允许的情况下我们会采用软件负载;

      软件负载解决的两个核心问题是:选谁、转发,其中最著名的是LVS(Linux Virtual Server)。

    传送门->关于负载均衡的实现方式类型等介绍请浏览我的另一篇博文:《大型网站技术架构》读书笔记之六:永无止境之网站的伸缩性架构

    二、初识LVS:Linux Virtual Server

    2.1 LVS是神马东西

      LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。

    2.2 LVS有神马作用

      LVS主要用于服务器集群的负载均衡。它工作在网络层,可以实现高性能,高可用的服务器集群技术。它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。它易用,配置非常简单,且有多种负载均衡的方法。它稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。另外可扩展性也非常好。

      LVS自从1998年开始,发展到现在已经是一个比较成熟的技术项目了。可以利用LVS技术实现高可伸缩的、高可用的网络服务,例如WWW服务、Cache服务、DNS服务、FTP服务、MAIL服务、视频/音频点播服务等等,有许多比较著名网站和组织都在使用LVS架设的集群系统,例如:Linux的门户网站(www.linux.com)、向RealPlayer提供音频视频服务而闻名的Real公司(www.real.com)、全球最大的开源网站(sourceforge.net)等。

    2.3 LVS的体系结构

      使用LVS架设的服务器集群系统有三个部分组成:

      (1)最前端的负载均衡层,用Load Balancer表示;

      (2)中间的服务器集群层,用Server Array表示;

      (3)最底端的数据共享存储层,用Shared Storage表示;

      在用户看来,所有的内部应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。

    3

    传送门->关于体系结构的详细介绍,请浏览南飞蚂蚁的blog:http://ixdba.blog.51cto.com/2895551/552947

    2.4 LVS负载均衡机制

      (1)LVS是四层负载均衡,也就是说建立在OSI模型的第四层——传输层之上,传输层上有我们熟悉的TCP/UDP,LVS支持TCP/UDP的负载均衡。因为LVS是四层负载均衡,因此它相对于其它高层负载均衡的解决办法,比如DNS域名轮流解析、应用层负载的调度、客户端的调度等,它的效率是非常高的。

      (2)LVS的转发主要通过修改IP地址(NAT模式,分为源地址修改SNAT和目标地址修改DNAT)、修改目标MAC(DR模式)来实现。

      ①NAT模式:网络地址转换

    4

      NAT(Network Address Translation)是一种外网和内网地址映射的技术。NAT模式下,网络数据报的进出都要经过LVS的处理。LVS需要作为RS(真实服务器)的网关。当包到达LVS时,LVS做目标地址转换(DNAT),将目标IP改为RS的IP。RS接收到包以后,仿佛是客户端直接发给它的一样。RS处理完,返回响应时,源IP是RS IP,目标IP是客户端的IP。这时RS的包通过网关(LVS)中转,LVS会做源地址转换(SNAT),将包的源地址改为VIP,这样,这个包对客户端看起来就仿佛是LVS直接返回给它的。客户端无法感知到后端RS的存在。

      ②DR模式:直接路由

    5

      DR模式下需要LVS和RS集群绑定同一个VIP(RS通过将VIP绑定在loopback实现),但与NAT的不同点在于:请求由LVS接受,由真实提供服务的服务器(RealServer, RS)直接返回给用户,返回的时候不经过LVS。详细来看,一个请求过来时,LVS只需要将网络帧的MAC地址修改为某一台RS的MAC,该包就会被转发到相应的RS处理,注意此时的源IP和目标IP都没变,LVS只是做了一下移花接木。RS收到LVS转发来的包时,链路层发现MAC是自己的,到上面的网络层,发现IP也是自己的,于是这个包被合法地接受,RS感知不到前面有LVS的存在。而当RS返回响应时,只要直接向源IP(即用户的IP)返回即可,不再经过LVS。

      (3)DR负载均衡模式数据分发过程中不修改IP地址,只修改mac地址,由于实际处理请求的真实物理IP地址和数据请求目的IP地址一致,所以不需要通过负载均衡服务器进行地址转换,可将响应数据包直接返回给用户浏览器,避免负载均衡服务器网卡带宽成为瓶颈。因此,DR模式具有较好的性能,也是目前大型网站使用最广泛的一种负载均衡手段。

    三、构建实战:LVS+Keepalived实现负载均衡

    3.1 实验结构总览

    6

      (1)本次基于VMware Workstation搭建一个四台Linux(CentOS 6.4)系统所构成的一个服务器集群,其中两台负载均衡服务器(一台为主机,另一台为备机),另外两台作为真实的Web服务器(向外部提供http服务,这里仅仅使用了CentOS默认自带的http服务,没有安装其他的类似Tomcat、Jexus服务)。

      (2)本次实验基于DR负载均衡模式,设置了一个VIP(Virtual IP)为192.168.80.200,用户只需要访问这个IP地址即可获得网页服务。其中,负载均衡主机为192.168.80.100,备机为192.168.80.101。Web服务器A为192.168.80.102,Web服务器B为192.168.80.103。

    3.2 基础准备工作

      以下工作针对所有服务器,也就是说要在四台服务器中都要进行配置:

      (1)绑定静态IP地址

      命令模式下可以执行setup命令进入设置界面配置静态IP地址;x-window界面下可以右击网络图标配置;配置完成后执行service network restart重新启动网络服务;

      验证:执行命令ifconfig

      (2)设定主机名

      ①修改当前会话中的主机名,执行命令hostname xxxx (这里xxxx为你想要改为的名字)

      ②修改配置文件中的主机名,执行命令vi /etc/sysconfig/network (√一般需要进行此步凑才能永久更改主机名)

      验证:重启系统reboot

      (3)IP地址与主机名的绑定

      执行命令vi /etc/hosts,增加一行内容,如下(下面的从节点以你自己的为主,本实验搭建了两个从节点):

      192.168.80.100 lvs-master

      192.168.80.101 lvs-slave

      #下面是本次试验的两个真实服务器节点

      192.168.80.102 lvs-webserver1

      192.168.80.103 lvs-webserver2

      保存后退出

      验证:ping lvs-master

      (4)关闭防火墙

      ①执行关闭防火墙命令:service iptables stop

          验证:service iptables stauts

      ②执行关闭防火墙自动运行命令:chkconfig iptables off

      验证:chkconfig --list | grep iptables

    3.3 配置两台Web服务器

      以下操作需要在角色为Web服务器的两台中进行,不需要在负载均衡服务器中进行操作:

      (1)开启http服务

      命令:service httpd start

      补充:chkconfig httpd on -->将httpd设为自启动服务

      (2)在宿主机访问Web网页,并通过FTP工具上传自定义网页:这里上传一个静态网页,并通过更改其中的html来区别两台Web服务器,以下图所示为例,其中一台显示from 192.168.80.102,而另一台显示from 192.168.80.103;

    7

      (3)编辑realserver脚本文件

      ①进入指定文件夹:cd /etc/init.d/

      ②编辑脚本文件:vim realserver

    复制代码
    SNS_VIP=192.168.80.200
    /etc/rc.d/init.d/functions
    case "$1" in
    start)
           ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
           /sbin/route add -host $SNS_VIP dev lo:0
           echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
           echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
           echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
           echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
           sysctl -p >/dev/null 2>&1
           echo "RealServer Start OK"
           ;;
    stop)
           ifconfig lo:0 down
           route del $SNS_VIP >/dev/null 2>&1
           echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
           echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
           echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
           echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
           echo "RealServer Stoped"
           ;;
    *)
           echo "Usage: $0 {start|stop}"
           exit 1
    esac
    exit 0
    复制代码

      这里我们设置虚拟IP为:192.168.80.200

      ③保存脚本文件后更改该文件权限:chmod 755 realserver

      ④开启realserver服务:service realserver start

    3.4 配置主负载服务器

      (1)安装Keepalived相关包

    yum install -y keepalived

      在CentOS下,通过yum install命令可以很方便地安装软件包,但是前提是你的虚拟机要联网;

      (2)编辑keepalived.conf配置文件

      ①进入keepalived.conf所在目录:cd /etc/keepalived

      ②首先清除掉keepalived原有配置:> keepalived.conf

      ③重新编辑keepalived配置文件:vi keepalived.conf

    复制代码
    global_defs {  
       notification_email {  
             edisonchou@hotmail.com  
       }  
       notification_email_from sns-lvs@gmail.com  
       smtp_server 192.168.80.1  
       smtp_connection_timeout 30
       router_id LVS_DEVEL  # 设置lvs的id,在一个网络内应该是唯一的
    }  
    vrrp_instance VI_1 {  
        state MASTER   #指定Keepalived的角色,MASTER为主,BACKUP为备          
        interface eth1  #指定Keepalived的角色,MASTER为主,BACKUP为备
        virtual_router_id 51  #虚拟路由编号,主备要一致
        priority 100  #定义优先级,数字越大,优先级越高,主DR必须大于备用DR    
        advert_int 1  #检查间隔,默认为1s
        authentication {  
            auth_type PASS  
            auth_pass 1111  
        }  
        virtual_ipaddress {  
            192.168.80.200  #定义虚拟IP(VIP)为192.168.2.33,可多设,每行一个
        }  
    }  
    # 定义对外提供服务的LVS的VIP以及port
    virtual_server 192.168.80.200 80 {  
        delay_loop 6 # 设置健康检查时间,单位是秒                    
        lb_algo wrr # 设置负载调度的算法为wlc                   
        lb_kind DR # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式   
        nat_mask 255.255.255.0                
        persistence_timeout 0          
        protocol TCP                  
        real_server 192.168.80.102 80 {  # 指定real server1的IP地址
            weight 3   # 配置节点权值,数字越大权重越高              
            TCP_CHECK {  
            connect_timeout 10         
            nb_get_retry 3  
            delay_before_retry 3  
            connect_port 80  
            }  
        }  
        real_server 192.168.80.103 80 {  # 指定real server2的IP地址
            weight 3  # 配置节点权值,数字越大权重越高  
            TCP_CHECK {  
            connect_timeout 10  
            nb_get_retry 3  
            delay_before_retry 3  
            connect_port 80  
            }  
         }  
    } 
    复制代码

      (3)开启keepalived服务

    service keepalived start

    3.5 配置从负载服务器

      从负载服务器与主负载服务器大致相同,只是在keepalived的配置文件中需要改以下两处:

      (1)将state由MASTER改为BACKUP

      (2)将priority由100改为99

    复制代码
    vrrp_instance VI_1 {  
        state BACKUP # 这里改为BACKUP
        interface eth1  
        virtual_router_id 51  
        priority 99 # 这里改为99,master优先级是100
        advert_int 1  
        authentication {  
            auth_type PASS  
            auth_pass 1111  
        }  
        virtual_ipaddress {  
            192.168.80.200  
        }  
    }  
    复制代码

    3.6 验证性测试

      (1)指定请求的均衡转发:因为两个Web服务器的权重都一样,所以会依次转发给两个Web服务器;

    8

      (2)Web服务器发生故障时:

      ①A发生故障后,只从B获取服务;

      这里模拟192.168.80.102发生故障,暂停其http服务:service httpd stop

    9

      再来看看这时从外部访问VIP时,便会只从192.168.80.103获取网页:

    10

      ②A故障修复后,又从A获取服务;

      这里模拟192.168.80.102修复完成,重启其http服务:service httpd start

    11

      再来看看这时从外部访问VIP,又可以从192.168.80.102获取网页:

    12

      (3)主负载均衡服务器发生故障时,备机立即充当主机角色提供请求转发服务:

      这里模拟192.168.80.100发生故障,暂停其keepalived服务:service keepalived stop

    13

      再来看看这时从外部访问VIP,还是可以正常获取网页:

    14

    学习小结

      LVS是目前广为采用的软件负载均衡解决方案,在一些大型企业级系统及互联网系统中应用。本次,简单地了解了一下LVS,并在Linux下搭建了一个小小的测试环境,借助Keepalived实现了一个最小化的负载均衡测试环境。LVS是一个可以工作在网络第四层的负载均衡软件,因此它相对于Nginx一类工作在第七层的负载均衡软件有着无可比拟的性能优势,而且它还是我国的章文嵩博士(现在阿里的副总裁,淘宝的技术专家)作为创始人发起的,现已经成为Linux内核的组成部分。

  • Linux服务器安全配置细节

    1.概述

    对于开放式的操作系统---Linux,系统的安全设定包括系统服务最小化、限制远程存取、隐藏重要资料、修补安全漏洞、采用安全工具以及经常性的安全检查等。

    本文主要从用户设置、如何开放服务、系统优化等方面进行系统的安全配置,以到达使Linux服务器更安全、稳定。

    2.用户管理

    在Linux系统中,用户帐号是用户的身份标志,它由用户名和用户口令组成。

    系统将输入的用户名存放在/etc/passwd文件中,而将输入的口令以加密的形式存放在/etc/shadow文件中。

    2.1 删除系统特殊的的用户帐号和组帐号: 

    1

    以上所删除用户为系统默认创建,但是在常用服务器中基本不使用的一些帐号,但是这些帐号常被黑客利用和攻击服务器。 

    2

    同样,以上删除的是系统安装是默认创建的一些组帐号。这样就减少受攻击的机会。

    2.2用户密码设置:

    安装linux时默认的密码最小长度是5个字节,但这并不够,要把它设为8个字节。修改最短密码长度需要编辑login.defs文件(vi /etc/login.defs)  ,设置为:

    PASS_MAX_DAYS   90        ##密码设置最长有效期
    PASS_MIN_DAYS   6            ##密码设置最短有效期
    PASS_MIN_LEN    8              ##设置密码最小长度
    PASS_WARN_AGE   30      ##提前多少天警告用户密码即将过期

    设置用户目录缺省访问权限

    vi /etc/login.defs

    在文件中设置

    UMASK           027

    2.3 修改自动注销帐号时间:

    自动注销帐号的登录,在Linux系统中root账户是具有最高特权的。如果系统管理员在离开系统之前忘记注销root账户,那将会带来很大的安全隐患,应该让系统会自动注销。通过修改账户中“TMOUT”参数,可以实现此功能。TMOUT按秒计算。编辑你的profile文件(vi /etc/profile),在"HISTSIZE="后面加入下面这行:

    export TMOUT=1200

    300,表示300秒,也就是表示5分钟。这样,如果系统中登陆的用户在5分钟内都没有动作,那么系统会自动注销这个账户。

    2.4 给系统的用户名密码存放文件加锁(注意:配置后不能更改密码,一般不配置):  

    4

    注:chattr是改变文件属性的命令,参数i代表不得任意更动文件或目录,此处的i为不可修改位(immutable)。查看方法:lsattr /etc/passwd

    2.5限制Shell命令记录大小

    默认情况下,bash shell会在文件$HOME/.bash_history中存放多达500条命令记录(根据具体的系统不同,默认记录条数不同)。系统中每个用户的主目录下都有一个这样的文件。在此笔者强烈建议限制该文件的大小。

    您可以编辑/etc/profile文件,修改其中的选项如下:

    HISTFILESIZE=5或HISTSIZE=5

    #vi /etc/profile

    export HISTSIZE=10

    export HISTFILESIZE=10

    2.6阻止任何人su作为root

    如果你不想任何人能够su作为root,你能编辑/etc/pam.d/su加下面的行:

    请先把用户添加到wheel组,以使它可以使用su命令成为root用户,
    添加方法为:usermod –G wheel xxx

    #vi /etc/pam.d/su

    auth            sufficient      pam_rootok.so
    auth            required        pam_wheel.so    group=wheel

    意味着仅仅wheel组的用户可以su作为root.

    修改 /etc/sudoers   ,增加一行
    xxx      ALL=(ALL)     ALL    <!--新增行-->

    2.7 设置密码复杂度策略和锁定多次登陆失败的用户

    # vi /etc/pam.d/system-auth

    修改:

    password    requisite     pam_cracklib.so try_first_pass retry=3 type= ocredit=-1 lcredit=-1 dcredit=-1 ucredit=-1

    说明(参数-1为包含):

    type:提示为空;ocredit:特殊字符个数;lcredit:小写字母个数;dcredit:数字个数;ucredit:大写字母个数

    增加:

    centos 5 以下

    auth        required      pam_tally.so  deny=5  unlock_time=600

    centos 6 以上

    auth        required      pam_tally2.so  deny=5  unlock_time=600

    centos 8以上

    auth required pam_faillock.so preauth silent audit deny=5 unlock_time=600

    2.8 不允许root直接登陆和ssh认证次数限制

    vi /etc/ssh/sshd_config

    修改:
    PermitRootLogin yes        ##将前面的“#”去掉,短尾“Yes”改为“No”,并保存文件。

    MaxAuthTries 5                 ##超过5次验证错误断开连接

    vi /etc/pam.d/sshd

    centos 5 以下

    auth        required      pam_tally.so  deny=5  unlock_time=600

    centos 6 以上

    auth       required     pam_tally2.so  deny=5  unlock_time=600

    centos 8以上

    auth required pam_faillock.so preauth silent audit deny=5 unlock_time=600

    3.服务管理

    在Linux系统的服务管理方面,如果想做到服务的最好安全,其中主要的就是升级服务本身的软件版本,另外一个就是关闭系统不使用的服务,做到服务最小化。

    3.1 关闭系统不使用的服务:  

    5

    在这里有两个方法,可以关闭init目录下的服务,一、将init目录下的文件名mv成*.old类的文件名,即修改文件名,作用就是在系统启动的时候找不到这个服务的启动文件。二、使用chkconfig系统命令来关闭系统启动等级的服务。

    注:在使用以下任何一种方法时,请先检查需要关闭的服务是否是本服务器特别需要启动支持的服务,以防关闭正常使用的服务。

    第一种:修改文件名的方法  

    6

    第二种:使用chkcofig命令来关闭不使用的系统服务  

    7

    注:以上chkcofig 命令中的3和5是系统启动的类型,3代表系统的多用启动方式,5代表系统的X启动方式。

    3.2 给系统服务端口列表文件加锁

    主要作用:防止未经许可的删除或添加服务  

    8

    3.3修改ssh服务的sshd 端口

    ssh默认会监听在22端口,你可以修改至6022端口以避过常规的扫描。

    注意:修改端口错误可能会导致你下次连不到服务器,可以先同时开着22和6022两个端口,然后再关掉22端口;

    重启sshd不会弹掉你当前的连接,可以另外开一个客户端来测试服务;

    #vi /etc/ssh/sshd_config

    #增加修改

    #Port 22 #关闭22端口

    Port 6022 #增加6022端口

    #重启sshd服务

    service sshd restart

    5.系统优化

    5.1 虚拟内存优化:

    一般来说,linux的物理内存几乎是完全used。这个和windows非常大的区别,它的内存管理机制将系统内存充分利用,并非windows无论多大的内存都要去使用一些虚拟内存一样。

    在/proc/sys/vm/freepages中三个数字是当前系统的:最小内存空白页、最低内存空白页和最高内存空白。

    注意,这里系统使用虚拟内存的原则是:如果空白页数目低于最高空白页设置,则使用磁盘交换空间。当达到最低空白页设置时,使用内存交换。内存一般以每页4k字节分配。最小内存空白页设置是系统中内存数量的2倍;最低内存空白页设置是内存数量的4倍;最高内存空白页设置是系统内存的6倍。

    以下以1G内存为例修改系统默认虚拟内存参数大小:

    13

    6.日志管理

    6.1 系统引导日志:

    dmesg

    使用 dmesg 命令可以快速查看最后一次系统引导的引导日志。通常它的

    内容会很多,所以您往往会希望将其通过管道传输到一个阅读器。

    6.2 系统运行日志:

    A、Linux 日志存储在 /var/log 目录中。这里有几个由系统维护的日志文件,但其他服务和程序也可能会把它们的日志放在这里。大多数日志只有 root 才可以读,不过只需要修改文件的访问权限就可以让其他人可读。

    以下是常用的系统日志文件名称及其描述:

    14

    B、/var/log/messages

    messages 日志是核心系统日志文件。它包含了系统启动时的引导消息,以及系统运行时的其他状态消息。IO 错误、网络错误和其他系统错误都会记录到这个文件中。其他信息,比如某个人的身份切换为 root,也在这里列出。如果服务正在运行,比如 DHCP 服务器,您可以在messages 文件中观察它的活动。通常,/var/log/messages 是您在做故障诊断时首先要查看的文件。

    C、/var/log/XFree86.0.log

    这个日志记录的是 Xfree86 Xwindows 服务器最后一次执行的结果。如果您在启动到图形模式时遇到了问题,一般情况从这个文件中会找到失败的原因。

    D、在/var/log 目录下有一些文件以一个数字结尾,这些是已轮循的归档文件。日志文件会变得特别大,特别笨重。Linux 提供了一个命令来轮循这些日志,以使您的当前日志信息不会淹没在旧的无关信息之中。 logrotate 通常是定时自动运行的,但是也可以手工运行。当执行后,logrotate 将取得当前版本的日志文件,然后在这个文件名最后附加一个“.1”。其他更早轮循的文件为“.2”、“.3”,依次类推。文件名后的数字越大,日志就越老。

    可以通过编辑 /etc/logrotate.conf 文件来配置 logrotate 的自动行为。
     

    定制日志

    1安装sudo和syslog服务

    使用yum等命令在在线安装sudo和syslog服务(在centos6.4中syslog为rsyslog服务)

    2配置/etc/sudoers

    在/etc/sudoers中配置下面这一行配置

    Defaults        logfile=/var/log/sudo.log

    3配置系统日志/etc/(r)syslog.conf

    在/etc/syslog.conf中添加下面一行的配置文件

    *.*    /var/log/sudo.log

    4重启syslog服务

    /etc/init.d/rsyslog restart

    然后在/var/log/sudo.log 中就可以发现使用sudo命令的用户。

    5.为审计产生的数据分配合理的存储空间和存储时间

    检查方法:

    #cat /etc/logrotate.conf 查看系统轮询配置,

    # rotate log files weekly

    weekly

           #这里代表每个日志文件是每个星期循环一次,一个日志文件保存一个星期的内容。

    # keep 4 weeks worth of backlogs

    rotate 26

             #这里代表日志循环的次数是26次,即可以保存26个日志文件。

    日志配置参考:

    /opt/logtest/*.log {
    daily # 每天分割一次
    rotate 30 # 保留最近30个分割后的日志文件
    copytruncate
    missingok
    dateext # 切割后的文件添加日期作为后缀
    dateyesterday # 配合dateext使用,添加前一天的日期作为分割后日志的后缀
    dateformat -%Y-%m-%d # 格式为2022-02-08
    }

    添加 crontab 计划任务
    01 01 * * * /usr/sbin/logrotate -f /etc/logrotate_d/xxx

  • CentOS 7上的FirewallD简明指南

    FirewallD 是 CentOS 7 服务器上默认可用的防火墙管理工具。基本上,它是 iptables 的封装,有图形配置工具 firewall-config 和命令行工具 firewall-cmd。使用 iptables 服务,每次改动都要求刷新旧规则,并且从 /etc/sysconfig/iptables 读取新规则,然而 firewalld 只应用改动了的不同部分。

    FirewallD 的区域(zone)

    FirewallD 使用服务(service) 和区域(zone)来代替 iptables 的规则(rule)和链(chain)。

    默认情况下,有以下的区域(zone)可用:

    • drop – 丢弃所有传入的网络数据包并且无回应,只有传出网络连接可用。
    • block — 拒绝所有传入网络数据包并回应一条主机禁止的 ICMP 消息,只有传出网络连接可用。
    • public — 只接受被选择的传入网络连接,用于公共区域。
    • external — 用于启用了地址伪装的外部网络,只接受选定的传入网络连接。
    • dmz — DMZ 隔离区,外部受限地访问内部网络,只接受选定的传入网络连接。
    • work — 对于处在你工作区域内的计算机,只接受被选择的传入网络连接。
    • home — 对于处在你家庭区域内的计算机,只接受被选择的传入网络连接。
    • internal — 对于处在你内部网络的计算机,只接受被选择的传入网络连接。
    • trusted — 所有网络连接都接受。

    要列出所有可用的区域,运行:

    1. # firewall-cmd --get-zones 
    2. work drop internal external trusted home dmz public block 

    列出默认的区域 :

    1. # firewall-cmd --get-default-zone 
    2. public 

    改变默认的区域 :

    1. # firewall-cmd --set-default-zone=dmz 
    2. # firewall-cmd --get-default-zone 
    3. dmz 

    FirewallD 服务

    FirewallD 服务使用 XML 配置文件,记录了 firewalld 服务信息。

    列出所有可用的服务:

    1. # firewall-cmd --get-services 
    2. amanda-client amanda-k5-client bacula bacula-client ceph ceph-mon dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mosh mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster radius rpc-bind rsyncd samba samba-client sane smtp smtps snmp snmptrap squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server 

    XML 配置文件存储在 /usr/lib/firewalld/services/ 和 /etc/firewalld/services/ 目录下。

    用 FirewallD 配置你的防火墙

    作为一个例子,假设你正在运行一个 web 服务器,SSH 服务端口为 7022 ,以及邮件服务,你可以利用 FirewallD 这样配置你的服务器:

    首先设置默认区为 dmz。

    1. # firewall-cmd --set-default-zone=dmz 
    2. # firewall-cmd --get-default-zone 
    3. dmz 

    为 dmz 区添加持久性的 HTTP 和 HTTPS 规则:

    1. # firewall-cmd --zone=dmz --add-service=http --permanent 
    2. # firewall-cmd --zone=dmz --add-service=https --permanent 

    开启端口 25 (SMTP) 和端口 465 (SMTPS) :

    1. firewall-cmd --zone=dmz --add-service=smtp --permanent 
    2. firewall-cmd --zone=dmz --add-service=smtps --permanent 

    开启 IMAP、IMAPS、POP3 和 POP3S 端口:

    1. firewall-cmd --zone=dmz --add-service=imap --permanent 
    2. firewall-cmd --zone=dmz --add-service=imaps --permanent 
    3. firewall-cmd --zone=dmz --add-service=pop3 --permanent 
    4. firewall-cmd --zone=dmz --add-service=pop3s --permanent 

    因为将 SSH 端口改到了 7022,所以要移除 ssh 服务(端口 22),开启端口 7022:

    1. firewall-cmd --remove-service=ssh --permanent 
    2. firewall-cmd --add-port=7022/tcp --permanent 

    要应用这些更改,我们需要重新加载防火墙:

    1. firewall-cmd --reload 

    最后可以列出这些规则:

    1. # firewall-cmd –list-all 
    2. dmz 
    3. target: default 
    4. icmp-block-inversion: no 
    5. interfaces: 
    6. sources: 
    7. services: http https imap imaps pop3 pop3s smtp smtps 
    8. ports: 7022/tcp 
    9. protocols: 
    10. masquerade: no 
    11. forward-ports: 
    12. sourceports: 
    13. icmp-blocks: 
    14. rich rules: 
  • Linux配置NFS服务

    一、 安装nfs  rpcbind

    安装 NFS 服务器所需的软件包:nfs 和 rpcbind

    Centos:

    # yum install nfs-utils

    # yum install rpcbind

    Ubuntu:

    #apt-get install -y nfs-kernel-server

    Centos:

    #systemctl enable nfs-server.service

    #systemctl enable rpcbind.service

    1)先启动rpcbind:   service rpcbind start

    2)再启动nfs: service nfs-server start

    Ubuntu:

    #systemctl restart nfs-server.service

    #systemctl enable nfs-server.service

    配置服务器端共享目录

    1)编辑配置文件

    假设服务端 目录为/home/data

    # vi /etc/exports

    NFSV2版本格式:

    要共享的目录(使用绝对路径) 客户端主机IP......(可多个IP,之间空格隔开)

    /home/data 10.1.0.2(rw,sync,root_squash,all_squash,anonuid=xxx,anongid=xxx) 10.1.0.3(rw,sync,root_squash,all_squash,anonuid=xxx,anongid=xxx)

    括号里的参数:

    rw:read-write,可读写;

    ro:read-only,只读;

    sync:文件同时写入硬盘和内存;

    async:文件暂存于内存,而不是直接写入硬盘;

    no_root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,也拥有root权限。显然开启这项是不安全的。

    root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,拥有匿名用户权限,通常他将使用nobody或nfsnobody身份;

    all_squash:不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都是拥有匿名用户权限;

    anonuid:匿名用户的UID值,通常是nobody或nfsnobody,可以在此处自行设定;

    anongid:匿名用户的GID值。

    二、客户端配置

    Ubuntu安装客户端: #apt-get install nfs-common

    使用monut 命令进行挂载

    假设客户端要挂载的目录为/home/client 服务端IP为10.1.0.1

    mount -t  nfs   10.0.1.1:/home/data /home/data

    umount  -a  取消所有挂载

  • Linux服务器如何防止中木马

    Linux服务器如何防止中木马

    因为Linux下的木马常常是恶意者通过Web的上传目录的方式来上传木马到Linux服务器的,可根据从恶意者访问网站开始-->Linux系统-->HTTP服务-->中间件服务-->程序代码-->DB-->存储,层层设卡防护。

    从用户访问角度解答参考

    1、开发程序代码对上传文件类型做限制,例如不能上传.php程序(JS及后端代码控制)。

    2、对上传的内容(包括文本和文件)检测,检测方式可通过程序、Web服务层(中间件层)、数据库等层面控制。

    3、控制上传目录的权限以及非站点目录的权限(Linux文件目录权限+Web服务层控制)。

    4、传上木马文件后的访问和执行控制(Web服务层+文件系统存储层)。

    5、对重要配置文件、命令和WEB配置等文件做md5指纹及备份。

    6、安装杀毒软件clamav等,定期监测查杀木马。

    7、配置服务器防火墙及入侵检测服务。

    8、监控服务器文件变更、进程变化、端口变化、重要安全日志并及时报警。

    从内部管理人员角度:防止被提权

    1、vpn管理服务器或Web化管理服务器。

    2、ssh监听内网。

    3、采用跳板机、操作审计。

    4、sudo集权管理、锁定关键文件。

    5、站点目录、上传目录权限属组控制。

    6、做系统及站点文件备份指纹监控报警。

    7、动态口令认证。

    最佳解答

    网友

  • Linux升级bash

    1.使用bash --version查看bash的版本

    2.去http://ftp.gnu.org/gnu/bash/下载bash

    3.安装bash:

    # tar -zxvf bash-4.4.tar.gz 
     
    # cd bash-4.4
     
    # ./configure 
     
    # make && make install

    # mv /bin/bash /bin/bash.bak
    # ln -s /usr/local/bin/bash /bin/bash

  • openssl,openssh升级

    准备相关的包
    openssl相关包下载:http://www.openssl.org/source/
    pam相关包下载:http://pkgs.org/centos-6/centos-x86_64/
    zlib包下载: http://zlib.net/

    一、简单版(centos 7)

    1、下载最新版openssh,链接如下
    http://www.openssh.com/portable.html

    备份以下文件:

    /etc/ssh/sshd_config

    /etc/pam.d/sshd

    2、安装依赖包

    yum update -y
    yum install -y gcc  gcc-c++ zlib-devel openssl-devel pam* pam-devel*

    3、安装软件包
    tar -zxf  openssh-8.8p1.tar.gz  #解压tar文件
    cd openssh-8.8p1
    ./configure                      #检测环境是否满足
    make                             #编译
    make install                     #安装
    service sshd restart             #重启

    二、复杂版

    1、升级zlib
    # tar -zxvf zlib-1.2.11.tar.gz
    # cd zlib-1.2.11
    #CFLAGS="-O3 -fPIC" ./configure --prefix=/usr/local/zlib
    #make && make install

    2、更新pam的rpm包。不然configure openssh的时候会报错

    yum install pam* pam-devel*
    注意:以下安装时,请务必再开一个SSH窗口连接所需要升级的服务器,避免ssh升级失败后,无法连接服务器。

    3、编译安装openssl

    删除旧版本

    #rpm -e `rpm -qa | grep openssl` --allmatches --nodeps
    # tar -zxvf openssl-1.0.2l.tar.gz
    # cd openssl-1.0.2l
    #./config -fPIC --prefix=/usr/local/openssl/ --openssldir=/usr/local/openssl/ shared zlib-dynamic enable-camelia
    #make && make install

    # mv /usr/bin/openssl /usr/bin/openssl.old

    # mv /usr/include/openssl /usr/include/openssl.old

    # ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl

    # ln -s /usr/local/openssl/include/openssl /usr/include/openssl

    echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
    #ldconfig -v

    #openssl version

    查看openssl版本显示OpenSSL 1.0.2l  25 May 2017

    解决升级openssl后yum问题:

    #cd openssl-1.0.2l

    #cp libssl.so.1.0.0 libcrypto.so.1.0.0 /usr/lib64/

    # ln -s /usr/lib64/libssl.so.1.0.0 /usr/lib64/libssl.so

    # ln -s /usr/lib64/libssl.so.1.0.0 /usr/lib64/libssl.so.10 

    # ln -s /usr/lib64/libcrypto.so.1.0.0 /usr/lib64/libcrypto.so

    # ln -s /usr/lib64/libcrypto.so.1.0.0 /usr/lib64/libcrypto.so.10

    4、编译安装openssh

    删除旧版本

    # rpm -e `rpm -qa | grep openssh` --allmatches --nodeps   或  yum remove openssh
    # tar -zxvf openssh-7.5p1.tar.gz 
    # cd openssh-7.5p1

    # ./configure --with-zlib=/usr/local/zlib --with-ssl-dir=/usr/local/openssl --with-md5-passwords --with-pam --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc/ssh

    #make && make install

    #ssh -V

    复制启动脚本到/etc/init.d

    # cp /home/openssh-xxx/contrib/redhat/sshd.init /etc/init.d/sshd

    加入开机自启

    # chkconfig --add sshd

    开启root登录:
    vi /etc/ssh/sshd_config
    把PermitRootLogin去掉#后,改为:PermitRootLogin yes

    5、直接启动ssh服务。
    service sshd start

  • redmine3的安装和升级

    Redmine 3.0的需求:
    http://www.redmine.org/projects/redmine/wiki/RedmineInstall#Requirements

    1. 搭建redmine3环境

    【安装软件包】
    # yum install zlib-devel gcc gcc-c++ make autoconf curl-devel ImageMagick-devel

    【数据库】
    若是全新安装:
    mysql登录后,建立redmine数据库和用户:
    mysql> create database redmine character set utf8;
    mysql> grant all privileges on redmine.* to 'redmine'@'127.0.0.1' identified by 'redmine ';
    mysql> exit;

    【新建用户】
    # useradd redmine
    # chown -R redmine:redmine /home/redmine

    【下载安装包,修改db和email的设置】
    # tar -zxvf redmine-3.3.2.tar.gz 

    # cd redmine-3.3.2/config
    # cp database.yml.example database.yml
    production:
      adapter: mysql2
      database: redmine
      host: 127.0.0.1
      username: redmine
      password: "redmine"
      encoding: utf8
    # cp configuration.yml.example configuration.yml

    【建立ruby2.3 + rails 4.2的环境】
    # gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
    # curl -ssL https://get.rvm.io| bash -s stable --ruby --rails              
    # source /etc/profile.d/rvm.sh

    # rvm list known

    # rvm install ruby-2.3
    # ruby -v
    # gem install rails
    # rails -v
    # rvm gemset list

    # gem install bundler

    # bundle install --without development test

    # rvm install rubygems 2.6.10 --force
    # rake generate_secret_token

    (1)vi /usr/local/rvm/gems/ruby-2.3.3/gems/htmlentities-4.3.1/lib/htmlentities/mappings/expanded.rb
    (2)按下Esc,输入 冒号 ,:set number 
    (3)找到第466行,把它用井号“#”注释掉

    # RAILS_ENV=production rake db:migrate
    # RAILS_ENV=production rake redmine:load_default_data
    # mkdir -p tmp tmp/pdf public/plugin_assets
    # chmod -R 755 files log tmp public/plugin_assets

    若是升级:
    【db】
    备份数据库
    检查db用户权限
    命令行测试连接
    执行:
    # bundle exec rake generate_secret_token
    # bundle exec rake db:migrate RAILS_ENV=production
    若有插件:
    # bundle exec rake redmine:plugins:migrate RAILS_ENV=production
    # bundle exec rake tmp:cache:clear tmp:sessions:clear RAILS_ENV=production

    启动服务:
    # cd /home/redmine/
    # ruby bin/rails server webrick -e production
    也可以放入后台:
    # nohup ruby bin/rails server webrick -e production >>/var/log/redmine/running_redmine.log 2>&1 &

    # ruby bin/rails server webrick -e production -d

    默认管理员:admin, admin
    访问http://IP:3000

    2. 迁移redmine服务到nginx下
    # yum install nginx
    # gem install passenger
    # passenger -v

    安装:
    # passenger-install-nginx-module

    Enter your choice (1 or 2) or press Ctrl-C to abort: 2

    --------------------------------------------

    Where is your Nginx source code located?

    Please specify the directory: /data/download/nginx-1.6.2

    --------------------------------------------

    Where do you want to install Nginx to?

    Please specify a prefix directory [/opt/nginx]: /etc/nginx

    --------------------------------------------

    Extra Nginx configure options

    If you want to pass extra arguments to the Nginx 'configure' script, then
    please specify them. If not, then specify nothing and press Enter.

    If you specify nothing then the 'configure' script will be run as follows:

      sh ./configure --prefix='/etc/nginx' --with-http_ssl_module --with-http_gzip_static_module --with-http_stub_status_module --with-cc-opt='-Wno-error' --add-module='/usr/local/rvm/gems/ruby-2.2.0/gems/passenger-4.0.59/ext/nginx'

    Extra arguments to pass to configure script: --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx

    --------------------------------------------

    Confirm configure flags

    The Nginx configure script will be run as follows:

      sh ./configure --prefix='/etc/nginx' --with-http_ssl_module --with-http_gzip_static_module --with-http_stub_status_module --with-cc-opt='-Wno-error' --add-module='/usr/local/rvm/gems/ruby-2.2.0/gems/passenger-4.0.59/ext/nginx' --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx

    --------------------------------------------

    Nginx with Passenger support was successfully installed.

    Please edit your Nginx configuration file,
    and set the passenger_root and passenger_ruby configuration options in the
    'http' block, like this:

      http {
          ...
          passenger_root /usr/local/rvm/gems/ruby-2.2.0/gems/passenger-4.0.59;
          passenger_ruby /usr/local/rvm/gems/ruby-2.2.0/wrappers/ruby;
          ...
      }

    After you (re)start Nginx, you are ready to deploy any number of web
    applications on Nginx.

    Press ENTER to continue.

    --------------------------------------------

    Deploying a web application: an example

    Suppose you have a web application in /somewhere. Add a server block
    to your Nginx configuration file, set its root to /somewhere/public, and set
    'passenger_enabled on', like this:

       server {
          listen 80;
          server_name www.yourhost.com;
          root /somewhere/public;   # <--- be sure to point to 'public'!
          passenger_enabled on;
       }

    And that's it! You may also want to check the Users Guide for security and
    optimization tips and other useful information:

      /usr/local/rvm/gems/ruby-2.2.0/gems/passenger-4.0.59/doc/Users guide Nginx.html
      https://www.phusionpassenger.com ... 0guide%20Nginx.html

    Enjoy Phusion Passenger, a product of Phusion (www.phusion.nl) 🙂
    https://www.phusionpassenger.com

    Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.

    # useradd -s /sbin/nologin -M -c "nginx Server" nginx
    # mkdir -p /etc/nginx/conf.d /data/log/svr/nginx /data/log/web/redmine

    $ cat /etc/nginx/nginx.conf

    #user  nobody;
    worker_processes  4;

    error_log  /data/log/svr/nginx/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;

    pid        /var/run/nginx.pid;

    events {
        use epoll;
        worker_connections  65535;
    }

    http {
        include       mime.types;
        default_type  application/octet-stream;
        server_tokens off;

        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  /data/log/svr/nginx/access.log  main;

        sendfile        on;
        tcp_nopush     on;
        tcp_nodelay on;
        keepalive_timeout  65;

        server_names_hash_bucket_size 128;
        client_header_buffer_size 32k;
        large_client_header_buffers 4 32k;
        client_body_temp_path /tmp;
        client_max_body_size 500m;

        fastcgi_connect_timeout 600;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 3600;
        fastcgi_buffer_size 400k;
        fastcgi_buffers 16 1m;
        fastcgi_busy_buffers_size 10m;
        fastcgi_temp_file_write_size 20m;
        fastcgi_intercept_errors on;

        gzip  on;
        gzip_min_length  1k;
        gzip_buffers     4 16k;
        gzip_http_version 1.0;
        gzip_comp_level 2;
        gzip_disable        "MSIE [1-6].";
        gzip_types  text/plain application/x-javascript text/css text/javascript application/x-httpd-php image/jpeg image/gif image/png;
        gzip_vary on;
         
        passenger_root /usr/local/rvm/gems/ruby-2.2.0/gems/passenger-4.0.59;
        passenger_ruby /usr/local/rvm/gems/ruby-2.2.0/wrappers/ruby;

        # Load config files from the /etc/nginx/conf.d directory
        # The default server is in conf.d/default.conf
        include conf.d/*.conf;

    }

    $ cat /etc/nginx/conf.d/redmine.conf    
    #
    # redmine
    #
    server {
        listen       10.221.221.118:80;
        server_name  redmine.xxx.com;
        root   /data/website/redmine-3.0.0/public;
        passenger_enabled on;

        access_log  /data/log/web/redmine/access.log  main;
    }

     

  • 理解Centos7防火墙firewalld

    firewalld简介

    Centos7中默认将原来的防火墙iptables升级为了firewalld,firewalld跟iptables比起来至少有两大好处:

    1、firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效;

    2、firewalld在使用上要比iptables人性化很多,即使不明白“五张表五条链”而且对TCP/IP协议也不理解也可以实现大部分功能。

     

    多知道点

    iptables实际包含五张表

    大部分iptables的资料都介绍说iptables包含四张表、五条链,不过实际上iptables还有第五张表——security表,但 是这张表需要和selinux结合使用,而selinux虽然已经发布了十多年了但是直到现在还有很多人对他的理解不够透彻,甚至有很多人会将其关闭!

    其实selinux的设计理念在安全上来说是非常优秀的,而且理解了其设计理念之后再去使用也没那么复杂,只不过其内置的规则是非常复杂的,等有 机会学生专门给大家介绍一下selinux,现在还回到iptables的五张表,他们分别是filter、nat、mangle、raw和 security。

    filter表就是我们最常使用的过滤表;nat表主要用于数据包转发,比如局域网的电脑如果想连接互联网,那么就可以使用nat给转发一 下;mangle表的规则可以对数据包进行修改,比如修改ttl值等;raw表主要是为了提高效率使用的,raw本身的含义是指“原生的”、“未经过加工 的”,符合raw表所对应规则的数据包将会跳过一些检查,这样就可以提高效率,当然,raw表的优先级也是最高的;security是跟selinux相 关的MAC模式的安全过滤。

    当然,这些内容大家了解一下就行,即使不理解也可以使用将firewalld使用的很好。

     

    firewalld和iptables的关系

    firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说firewalld和 iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结 构以及使用方法不一样罢了。

    firewalld的结构

    我们这里所说的结构并不是firewalld软件的结构,而是配置文件的结构。

    在具体介绍firewalld配置文件结构之前学生先来给大家介绍一下firewalld的配置模式,firewalld的配置模式设计的非常巧妙,而且这种设计思路也非常值得我们借鉴和学习。

    firewalld的配置模式

    firewalld的配置文件以xml格式为主(主配置文件firewalld.conf例外),他们有两个存储位置

    1、/etc/firewalld/

    2、/usr/lib/firewalld/

    使用时的规则是这样的:当需要一个文件时firewalld会首先到第一个目录中去查找,如果可以找到,那么就直接使用,否则会继续到第二个目录中查找。

    firewalld的这种配置文件结构的主要作用是这样的:在第二个目录中存放的是firewalld给提供的通用配置文件,如果我们想修改配置, 那么可以copy一份到第一个目录中,然后再进行修改。这么做有两个好处:首先我们日后可以非常清晰地看到都有哪些文件是我们自己创建或者修改过的,其 次,如果想恢复firewalld给提供的默认配置,只需要将自己在第一个目录中的配置文件删除即可,非常简单,而不需要像其他很多软件那样在修改之前还 得先备份一下,而且时间长了还有可能忘掉之前备份的是什么版本。

    当然,这种配置模式也并不是firewalld的首创,在其他很多地方也都有用到,比如java中用于记录日志的logback也是这种模式,他在 查找配置文件时会首先在根目录下找logback-test.xml文件,如果可以找到就直接使用,如果找不到就会接着找logback.xml文件,如 果还找不到就会使用自己包里边自带的配置文件,这样使用起来就非常方便了,比如我们可以把logback-test.xml和logback.xml两个 文件都创建出来,在开发机上使用logback-test.xml文件,然后在往服务器部署的时候直接将其删掉就可以了!当然还有很多产品也使用了这种配 置模式,spring的很多子框架也使用的是这种模式,比如spring MVC中的组件配置也是这样,如果没有配置的话就会使用默认的配置,当然,我们这里不是在讲Spring MVC所以就不展开了,如果想了解更多细节大家可以参考学生编写的《看透Spring MVC:源代码分析与实践》一书。

    配置文件结构

    firewalld的配置文件结构非常简单,主要有两个文件和三个目录:

    文件:firewalld.conf、lockdown-whitelist.xml

    目录:zones、services、icmptypes

    另外,如果使用到direct,还会有一个direct.xml文件。我们要注意,在保存默认配置的目录“/usr/lib/firewalld/”中只有我们这里所说的目录,而没有firewalld.conf、lockdown-whitelist.xml和direct.xml这三个文件,也就是说这三个文件只存在于“/etc/firewalld/”目录中。

    下面学生分别来给大家介绍一下这些文件和目录的作用

    • firewalld.conf:firewalld的主配置文件,是键值对的格式,不过非常简单,只有五个配置项

      • DefaultZone:默认使用的zone,关于zone学生稍后给大家详细介绍,默认值为public;

      • MinimalMark: 标记的最小值,linux内核会对每个进入的数据包都进行标记,目的当然是为了对他们进行区分,比如学生在前面给大家补充iptables五张表相关的内 容时候介绍说符合raw表规则的数据包可以跳过一些检查,那么是怎么跳过的呢?这里其实就是使用的标记,当然对数据包的标记还有很多作用。这里所设置的 MinimalMark值就是标记的最小值,默认值为100,一般情况下我们不需要对其进行修改,但是如果我们有特殊需要的时候就可以通过对其进行修改来 告诉linux所使用标记的最小值了,比如我们需要给符合某条件的数据包标记为123,这时候为了防止混淆就需要将MinimalMark设置为一个大于 123的值了;

      • CleanupOnExit:这个配置项非常容易理解,他表示当退出firewalld后是否清除防火墙规则,默认值为yes;

      • Lockdown: 这个选项跟D-BUS接口操作firewalld有关,firewalld可以让别的程序通过D-BUS接口直接操作,当Lockdown设置为yes的 时候就可以通过lockdown-whitelist.xml文件来限制都有哪些程序可以对其进行操作,而当设置为no的时候就没有限制了,默认值为 no;

      • IPv6_rpfilter:其功能类似于rp_filter,只不过是针对ipv6版的,其作用是判断所接受到的包是否是伪造的,检查方式主要是通过路由表中的路由条目实现的,更多详细的信息大家可以搜索uRPF相关的资料,这里的默认值为yes。

    • lockdown-whitelist.xml:当Lockdown为yes的时候用来限制可以通过D-BUS接口操作firewalld的程序

    • direct.xml:通过这个文件可以直接使用防火墙的过滤规则,这对于熟悉iptables的用户来说会非常顺手,另外也对从原来的iptables到firewalld的迁移提供了一条绿色通道

    • zones:保存zone配置文件

    • services:保存service配置文件

    • icmptypes:保存和icmp类型相关的配置文件

     

    在firewalld的使用中最基础也是最重要的就是对zone的理解,不过现在还普遍理解的不是很透彻,下面学生就来给大家详细介绍一下zone到底是什么。

    zone

    firewalld默认提供了九个zone配置文件:block.xml、dmz.xml、drop.xml、external.xml、 home.xml、internal.xml、public.xml、trusted.xml、work.xml,他们都保存在“/usr/lib /firewalld/zones/”目录下。这些zone之间是什么关系?他们分别适用用哪些场景呢?

    为了弄明白这些问题大家需要先明白zone的本质含义。学生在上一节给大家介绍防火墙时说过防火墙就相当于一个门卫,门卫对具体某个来访的人判断是否应该放行是依靠规则来判断的,而我们这里的zone其实就是一套规则集,或者说是一套判断的方案。

    理解了这层含义firewalld就容易了,比如上面的九个zone其实就是九种方案,而且起决定作用的其实是每个xml文件所包含的内容,而不是 文件名,所以大家不需要对每种zone(每个文件名)的含义花费过多的精力,比如trusted这个zone会信任所有的数据包,也就是说所有数据包都会 放行,但是public这个zone只会放行其中所配置的服务,其他的一律不予放行,其实我们如果将这两个文件中的内容互换一下他们的规则就换过来了,也 就是public这个zone会放行所有的数据包,下面我们来看一下这两个文件的内容

    public.xml

    <?xml version="1.0" encoding="utf-8"?><zone>  <short>Public</short>  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>  <service name="ssh"/>  <service name="dhcpv6-client"/></zone>

    trusted.xml

    <?xml version="1.0" encoding="utf-8"?><zone target="ACCEPT">  <short>Trusted</short>  <description>All network connections are accepted.</description></zone>

    我们要特别注意trusted.xml中zone的target,就是因为他设置为了ACCEPT,所以才会放行所有的数据包,而 public.xml中的zone没有target属性,这样就会默认拒绝通过,所以public这个zone(这种方案)只有其中配置过的服务才可以通 过。

    其他的zone大家可以自己打开xml文件来看一下,这里学生就不一一介绍了,关于zone配置文件的详细结构及含义后面学生再给大家进行讲解,下面学生再给大家介绍一下firewalld中的service。

    service

    service是firewalld中另外一个非常重要的概念,不过其含义是非常简单的。学生还是拿门卫的例子来给大家做解释,在iptables 的时代我们给门卫下达规则时需要告诉他“所有到22号楼的人全部予以放行”、“所有到80号楼的人全部予以放行”等等,不过到了firewalld的时代 就不需要这样了,而是可以直接下达像“到销售部的全部予以放行”这样的命令,然后门卫再一查发现销售部在80号楼,那么所有到80号楼的人门卫就都会放行 了。我们这里的楼牌号和端口号相对应,部门名和服务名相对应,这样大家应该就可以理解service的作用了。

    从端口号改为服务名主要有两个好处:首先是使用服务名配置的语义清晰,不容易出错;其次在对某个服务的端口号进行修改的时候只需要修改相应的 service文件就可以了,而不需要再修改防火墙方案——zone。这其实跟DNS将ip地址和域名关联了起来是一样的道理。下面学生再来给大家介绍一 下service的配置文件。

    service配置文件的命名规则是<服务名>.xml,比如ssh的配置文件是ssh.xml,http的配置文件是 http.xml等,他们默认保存在“/usr/lib/firewalld/services/”目录下,常见的服务其中都可以找到,如果我们想修改某 个服务的配置,那么可以复制一份到“/etc/firewalld/services/”目录下然后进行修改就可以了,要想恢复默认配置直接将我们自己的 配置文件删除就可以了。我们来看一下ssh服务的ssh.xml文件

    <?xml version="1.0" encoding="utf-8"?><service>  <short>SSH</short>  <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>  <port protocol="tcp" port="22"/></service>

    可以看到这里配置了tcp的22号端口,所以将ssh服务配置到所使用的zone(默认public)中后tcp的22号端口就开放了。如果我们想将ssh的端口修改为222,那么只需要将ssh.xml复制一份到“/firewalld/services/”中,然后将端口号修改为222就可以了。当然直接修改“/usr/lib/firewalld/services/”中的配置文件也可以实现,但是强烈建议不要那么做,原因相信大家都明白。

    明白原理之后使用起来就可以非常灵活了,比如我们将“/etc/firewalld/services/ssh.xml”文件复制一份到“/etc/firewalld/services/”中,然后将名字改为abc.xml,并且将abc这个服务配置到所使用的zone中,这时22端口就会开放。也就是说在zone中所配置的服务其实跟实际的服务并不存在直接联系,而是和相应配置文件中配置的内容有关系。

    配置方法

    firewalld的配置方法主要有三种:firewall-config、firewall-cmd和直接编辑xml文件,其中 firewall-config是图形化工具,firewall-cmd是命令行工具,而对于linux来说大家应该更习惯使用命令行方式的操作,所以 firewall-config我们就不给大家介绍了。具体的配置方法学生在下一节给大家进行介绍。

  • Nginx 安装配置

    一、下载安装包

    http://nginx.org/

    二、安装编译工具及库文件

    Centos:

    yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel wget lftp libtool libxslt-devel gd gd-devel pcre pcre-devel zlib zlib-devel geoip geoip-devel

    Ubuntu:

    apt-get install -y zip libpcre3 libpcre3-dev openssl libssl-dev libxml2 libxml2-dev libxslt-dev libgd-dev libgeoip-dev

    useradd -m -d /home/nginx -s /bin/bash nginx

    三、安装 Nginx
    # tar -zxvf nginx-1.11.10.tar.gz
    # cd nginx-1.11.10
    # ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --http-log-path=/usr/local/nginx/logs/access.log --error-log-path=/usr/local/nginx/logs/error.log --with-file-aio --with-http_ssl_module --with-pcre --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module

    安装插件
    --add-module=/路径/nginx-goodies-nginx-sticky-module-ng

    --with-openssl=/路径/openssl-1.xx

    # make&&make install

    若make报错则执行

    vi  /路径/nginx-goodies-nginx-sticky-module-ng/ngx_http_sticky_module.c

    /*if (ngx_http_parse_multi_header_lines(&r->headers_in.cookies, &iphp->sticky_conf->cookie_name, &route) != NGX_DECLINED) {*/
    if (ngx_http_parse_multi_header_lines(r, r->headers_in.cookie, &iphp->sticky_conf->cookie_name, &route) != NULL) {

    四、Nginx 配置nginx.conf

    user nginx nginx;
    worker_processes 4;

    #error_log logs/error.log;
    #error_log logs/error.log notice;
    #error_log logs/error.log info;

    #pid logs/nginx.pid;

    worker_rlimit_nofile 65535;
    events {
    use epoll;
    worker_connections 65535;
    }

    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;

    server_tokens off;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 600;

    gzip on;
    gzip_min_length 4k;
    gzip_buffers 8 1024k;
    gzip_http_version 1.1;
    gzip_comp_level 6;
    gzip_types text/plain text/javascript text/css text/xml application/json application/javascript application/x-javascript application/xml;
    gzip_vary on;

    server_names_hash_bucket_size 2048;
    client_header_buffer_size 1024k;
    large_client_header_buffers 8 1024k;
    client_max_body_size 1024M;
    client_header_timeout 300;
    client_body_timeout 300;
    send_timeout 300;

    #用于tomcat反向代理,解决nginx 504错误
    proxy_connect_timeout 300; #单位秒
    proxy_send_timeout 300;
    proxy_read_timeout 300;
    proxy_buffer_size 1024k;
    proxy_buffers 8 1024k;
    proxy_busy_buffers_size 2048k;
    proxy_temp_file_write_size 2048k;

    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 1024k;
    fastcgi_buffers 8 1024k;
    fastcgi_busy_buffers_size 2048k;
    fastcgi_temp_file_write_size 2048k;

    #http拒绝服务攻击,限制请求率,限制连接的数量
    limit_req_zone $binary_remote_addr zone=one:10m rate=100r/m;
    limit_conn_zone $binary_remote_addr zone=addr:10m;

    #下面是server虚拟主机的配置,命名和服务器地址根据实际情况修改
    upstream backend {
    sticky expires=1h domain=xx.xx.com path=/;
    #ip_hash;      #同一个IP每次都是请求到固定的后端服务器
    # hash        $cookie_jsessionid;
    server 192.168.1.1;
    server 192.168.1.2;
    }

    server {
    listen 80;
    server_name xx.com;

    access_log logs/xx.com.access.log;

    location / {
    root /home/xx;
    index index.html index.htm;
    autoindex off;
    limit_req zone=one burst=20 nodelay;
    limit_conn addr 100;
    }

    location ^~ /(m|api) {
    proxy_redirect off;
    #获取到的 Host 包含浏览器请求的 IP
    proxy_set_header Host $host;
    #获取到的 Host 包含浏览器请求的 IP 和端口
    #proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    ###允许跨域
    add_header Access-Control-Allow-Origin $http_origin;
    add_header Access-Control-Allow-Credentials true;
    ###禁用缓存
    proxy_buffering off;

    # kill cache
    add_header Last-Modified $date_gmt;
    add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
    if_modified_since off;
    expires off;
    etag off;
    #设置反向代理的地址
    proxy_pass http://backend/;
    }

    location ~ .*\.(css|js|html|htm)$ {
    root /home/xx;
    index index.html index.htm;
    try_files $uri $uri/ /m/index.html;
    #### kill cache
    add_header Last-Modified $date_gmt;
    add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
    if_modified_since off;
    expires off;
    etag off;
    }

    #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;
    }

    # 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;
    #}
    }

    # 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;
    # }
    #}

    }

    检查配置文件ngnix.conf的正确性命令:
    [root@bogon conf]# /usr/local/nginx/sbin/nginx -t

    五、启动 Nginx
    Nginx 启动命令如下:
    /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
    /usr/local/nginx/sbin/nginx -s reload            # 重新载入配置文件
    /usr/local/nginx/sbin/nginx -s reopen            # 重启 Nginx
    /usr/local/nginx/sbin/nginx -s stop              # 停止 Nginx

    nginx针对URL或目录访问控制

    i.根据扩展名限制程序
    location ~* \.(php|yml|sh|pl|py)$ {
    allow 127.0.0.1;
    deny all;
    }

    ii.禁止访问的文件
    location ~* /(.user.ini|.htaccess|.git|.svn|.project|LICENSE|README.md)$ {
    allow 127.0.0.1;
    deny all;
    }

    iii.禁止访问多个目录
    location ~* ^/(static|js)/.*$ {
    allow 127.0.0.1;
    deny all;
    }

    六、自动启动配置

    #!/bin/bash
    #
    # chkconfig: 2345 90 90
    # description: nginxd

    nginxd=/usr/local/nginx/sbin/nginx
    nginx_config=/usr/local/nginx/conf/nginx.conf
    nginx_pid=/var/run/nginx.pid
    RETVAL=0
    prog="nginx"

    # Source function library.
    . /etc/rc.d/init.d/functions

    # Source networking configuration.
    . /etc/sysconfig/network

    # Check that networking is up.
    [ ${NETWORKING} = "no" ] && exit 0
    [ -x $nginxd ] || exit 0

    # Start nginx daemons functions.
    start() {
    if [ -e $nginx_pid ];then
    echo "nginx already running...."
    exit 1
    fi
    echo -n $"Starting $prog: "
    daemon $nginxd -c ${nginx_config}
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && touch /var/lock/subsys/nginx
    return $RETVAL
    }
    # Stop nginx daemons functions.
    stop() {
    echo -n $"Stopping $prog: "
    killproc $nginxd
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /var/run/nginx.pid
    }
    # reload nginx service functions.
    reload() {
    echo -n $"Reloading $prog: "
    #kill -HUP `cat ${nginx_pid}`
    killproc $nginxd -HUP
    RETVAL=$?
    echo
    }
    # See how we were called.
    case "$1" in
    start)
    start
    ;;
    stop)
    stop
    ;;
    reload)
    reload
    ;;
    restart)
    stop
    start
    ;;
    status)
    status $prog
    RETVAL=$?
    ;;
    *)
    echo $"Usage: $prog {start|stop|restart|reload|status|help}"
    exit 1
    esac
    exit $RETVAL
    六、配置https
    生成证书
    可以通过以下步骤生成一个简单的证书:
    首先,进入你想创建证书和私钥的目录,例如:

    $ cd /usr/local/nginx/conf
    创建服务器私钥,命令会让你输入一个口令:

    $ openssl genrsa -des3 -out server.key 1024
    创建签名请求的证书(CSR):

    $ openssl req -new -key server.key -out server.csr
    在加载SSL支持的Nginx并使用上述私钥时除去必须的口令:

    $ cp server.key server.key.org
    $ openssl rsa -in server.key.org -out server.key
    配置nginx
    最后标记证书使用上述私钥和CSR:

    $ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
    修改Nginx配置文件,让其包含新标记的证书和私钥:

    server {
    server_name YOUR_DOMAINNAME_HERE;
    listen [::]:443 default_server;

    ssl_certificate /usr/local/nginx/conf/server.crt;
    ssl_certificate_key /usr/local/nginx/conf/server.key;
    ssl_session_timeout  5m;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:HIGH:!NULL:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!3DES:!ADH:!PSK:!RC4:!DH:!DHE";
    }
    重启nginx。
    这样就可以通过以下方式访问:

    另外还可以加入如下代码实现80端口重定向到443

    server {
    listen 80;
    server_name ww.xxx.com;

    rewrite ^(.*)$  https://$host$1 permanent; 

    rewrite ^/(.*)$ https://${server_name}$1 permanent;
    }

    七、跨域设置

    说明:一般使用http_origin来进行跨域控制,当不传递origin头的时候,就为这个里面的默认值,当传递有值得时候,才会走下面得正则匹配

    map $http_origin $allow_cors {
    default 1;
    #以下为提供参考的正则表达式
    "~^(http|https)://.?.xx.edu.cn.$" 1;
    "~^((http|https)://(www\.xx\.edu\.cn)?)$" 1;
    "~http://www.xx.com" 1;
    "~*" 0;
    }

    if ($allow_cors = 0){
    return 403;
    }

    #指定允许其他域名访问
    add_header Access-Control-Allow-Origin $http_origin;
    add_header Access-Control-Allow-Credentials true;
    #允许的请求类型
    add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
    #许的请求头字段
    add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";

  • Centos7_Drush安装教程

    1、前言
    本文仅适用于Linux Centos7服务器下安装 Drush,其它 Linux 服务器未做测试。

    2、准备工作

    2.1、确保 php,mysql 添加到全局环境中 ,使用命令查看路径是否已经配置:

    echo $PATH //如果没有配置,请自行配置
    2.2、确保 php 已经安装 PDO  和 xml 模块 ,使用命令查看是否包含 PDO 和 xml:

    php -m  //列表展示所有已经开启的PHP扩展
    2.3、确保 php cli 版本 满足 drush 安装要求的最低版本,查看命令:

    php -v //推荐新版 php cli
    3、先安装 Composer ,然后使用 Composer 安装 Drush

    3.1、安装 Composer 的必备工具

    yum install php-devel
    3.2、查看 php 的路径

    which php // 路径为:/usr/bin/php,第3.3步使用
    3.3、安装 Composer

    curl -sS https://getcomposer.org/installer | /usr/bin/php -- --install-dir='/mnt/projects/lamp/Composer' //大家把安装路径替换成自己的路径
    3.4、设置 Composer 全局环境

    cd /mnt/projects/lamp/Composer // 切换安装路径
    mv composer.phar /usr/local/bin/composer //转移文件
    3.5、检测安装是否成功

    cd /usr/local/bin/composer
    composer
    4、安装 Drush

    4.1、运行命令:

    composer global require drush/drush --prefer-dist -vvv --profile
    4.2、检测是否安装成功

    cd ~/.config/composer/vendor/bin
    4.3、将 vendor 目录下的 bin 目录添加到 系统变量,以便全局使用 Drush,命令如下:

    vim ~/.bash_profile
    4.4、然后加入以下,保存退出 vim

    export PATH="$HOME/.config/composer/vendor/bin:$PATH"
    4.5、让设置立即生效

    source ~/.bash_profile
    4.6、检测 Drush 是否成功

    drush
    5、Drush 常用命令

    drush cc //清空缓存
    drush up //更新所有模块,并执行数据库更新
    drush upc //更新所有模块,不更新数据库
    6、注意事项

    6.1、升级 php cli  版本:本文的步骤2.3非常重要

    如果你的服务器安装的 php cli 版本 低于Drush要求的版本, 那么恭喜你,drush 安装成功后,在使用 drush 命令 会报各种 php 语法错误(类似于缺少类库、引导级别等级低等),因此,本文新增 如何升级 php cli 版本的详细步骤,我们通过安装 remi 后,使用 yum 命令一键升级。

    6.2、升级 php cli  版本:切换下载路径

    cd /mnt/soft //切换到下载文件目录,你可以修改自己的路径
    6.3、升级 php cli  版本:执行下载命令

    wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
    6.4、升级 php cli  版本:升级安装

    rpm -Uvh remi-release-7*.rpm epel-release-7*.rpm
    6.5、升级 php cli  版本:激活remi

    cd /etc/yum.repos.d //切换到默认安装的 remi 路径下
    vim remi.repo //使用vim工具打开 remi.repo 文件
    6.6、升级 php cli  版本:激活remi,修改此文件

    [remi]:修改属性enable=1

    [remi-php56] 修改高版本的 enable=1

    命令模式下,修改完保存退出;

    6.7、升级 php cli  版本:执行升级

    yum update //此时会自动升级remi下的所有升级包
    6.8、升级 php cli  版本:验证

    php -v //此时php cli 版本应该是升级后的最新版本

  • Linux 安装redis 及 集群搭建

    安装包下载地址:

    https://sourceforge.net/projects/tcl/files/Tcl

    https://redis.io

    一、安装

    # tar -zxvf tcl8.6.11-src.tar.gz

    # cd tcl8.6.11/unix/

    # ./configure

    # make && make install

    # tar -zxvf redis-5.0.13.tar.gz

    # cd redis-5.0.13

    # make

    (64位服务器采用以下命令)

    #make MALLOC=libc

    redis 6 问题处理(# 查看gcc版本是否在5.3以上,centos7.6默认安装4.8.5
    gcc -v
    # 升级gcc到5.3及以上,如下:
    升级到gcc 9.3:
    yum -y install centos-release-scl
    yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
    scl enable devtoolset-9 bash
    需要注意的是scl命令启用只是临时的,退出shell或重启就会恢复原系统gcc版本。
    如果要长期使用gcc 9.3的话:
    echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
    这样退出shell重新打开就是新版的gcc了)

    # make install

    # cp redis.conf /etc/

    # echo vm.overcommit_memory=1 >> /etc/sysctl.conf

    # sysctl vm.overcommit_memory=1

    # vi /etc/redis.conf

    bind 0.0.0.0
    daemonize yes
    stop-writes-on-bgsave-error no

    (启动)

    # /usr/local/bin/redis-server /etc/redis.conf

    (关闭)

    # /usr/local/bin/redis-cli -a password -p 6379 shutdown

    二、自动启动脚本

    方式一:

    chmod +x /etc/rc.d/rc.local

    echo '/usr/local/bin/redis-server /etc/redis.conf' >> /etc/rc.d/rc.local

    方式二:

    #!/bin/bash
    # chkconfig: 2345 10 90
    # description: Start and Stop redis
    #
    PATH=/usr/local/bin:/sbin:/usr/bin:/bin
    REDISPORT=6379
    EXEC=/usr/local/bin/redis-server
    REDIS_CLI=/usr/local/bin/redis-cli
    PIDFILE=/var/run/redis_6379.pid
    CONF="/etc/redis.conf"
    AUTH="1234"
    case "$1" in
    start)
    if [ -f $PIDFILE ]
    then
    echo "$PIDFILE exists, process is already running or crashed."
    else
    echo "Starting Redis server..."
    $EXEC $CONF  &
    fi
    if [ "$?"="0" ]
    then
    echo "Redis is running..."
    fi
    ;;
    stop)
    if [ ! -f $PIDFILE ]
    then
    echo "$PIDFILE exists, process is not running."
    else
    PID=$(cat $PIDFILE)
    echo "Stopping..."
    $REDIS_CLI -p $REDISPORT  SHUTDOWN
    sleep 2
    while [ -x $PIDFILE ]
    do
    echo "Waiting for Redis to shutdown..."
    sleep 1
    done
    echo "Redis stopped"
    fi
    ;;
    restart|force-reload)
    ${0} stop
    ${0} start
    ;;
    *)
    echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2
    exit 1
    esac

    三、集群搭建配置

    创建 Redis 节点

    首先在 192.168.1.8 机器上 /usr/local/redis-3.2.6 目录下创建 redis_cluster 目录

    $ mkdir /usr/local/redis-3.2.6/redis_cluster

    在 redis_cluster 目录下,创建名为7000、7001、7002的目录,并将 redis.conf 拷贝到这三个目录中

    1. $ mkdir 7000 7001 7002
    2. $ cp /usr/local/redis-3.2.6/redis.conf /usr/local/redis-3.2.6/redis_cluster/7000
    3. $ cp /usr/local/redis-3.2.6/redis.conf /usr/local/redis-3.2.6/redis_cluster/7001
    4. $ cp /usr/local/redis-3.2.6/redis.conf /usr/local/redis-3.2.6/redis_cluster/7002

    分别修改这三个配置文件,修改如下内容

    1. port                  7000                        //端口7000,7002,7003
    2. bind                  本机ip                      //默认ip为127.0.0.1,需要改为其他节点机器可访问的ip,否则创建集群时无法访问对应的端口,无法创建集群
    3. daemonize             yes                         //redis后台运行
    4. pidfile               /var/run/redis_7000.pid     //pidfile文件对应7000,7001,7002
    5. cluster-enabled       yes                         //开启集群,把注释#去掉
    6. cluster-config-file   nodes_7000.conf             //集群的配置,配置文件首次启动自动生成 7000,7001,7002
    7. cluster-node-timeout  15000                       //请求超时,默认15秒,可自行设置
    8. appendonly            yes                         //aof日志开启,有需要就开启,它会每次写操作都记录一条日志

    接着在另外两台机器上(192.168.1.9、192.168.1.10)重复以上三步,只是把目录改为7003、7004、7005、7006、7007、7008对应的配置文件也按照这个规则修改即可

    启动各个节点

    1. ##第一台机器上执行
    2. $ /usr/local/redis-3.2.6/src/redis-server /usr/local/redis-3.2.6/redis_cluster/7000/redis.conf
    3. $ /usr/local/redis-3.2.6/src/redis-server /usr/local/redis-3.2.6/redis_cluster/7001/redis.conf
    4. $ /usr/local/redis-3.2.6/src/redis-server /usr/local/redis-3.2.6/redis_cluster/7002/redis.conf
    5. ##第二台机器上执行
    6. $ /usr/local/redis-3.2.6/src/redis-server /usr/local/redis-3.2.6/redis_cluster/7003/redis.conf
    7. $ /usr/local/redis-3.2.6/src/redis-server /usr/local/redis-3.2.6/redis_cluster/7004/redis.conf
    8. $ /usr/local/redis-3.2.6/src/redis-server /usr/local/redis-3.2.6/redis_cluster/7005/redis.conf
    9. ##第三台机器上执行
    10. $ /usr/local/redis-3.2.6/src/redis-server /usr/local/redis-3.2.6/redis_cluster/7006/redis.conf
    11. $ /usr/local/redis-3.2.6/src/redis-server /usr/local/redis-3.2.6/redis_cluster/7007/redis.conf
    12. $ /usr/local/redis-3.2.6/src/redis-server /usr/local/redis-3.2.6/redis_cluster/7008/redis.conf

    检查各 Redis 启动情况

    1. ##第一台机器
    2. $ ps -ef | grep redis           //redis是否启动成功
    3. $ netstat -tnlp | grep redis    //监听redis端口

    注:确保每个节点没有配置错误,并且启动起来

    关闭防火墙

    1. $ firewall-cmd --state  ##查看防火墙状态
    2. running

    running 说明防火墙是打开状态

    1. $ systemctl stop firewalld  ##关闭防火墙
    2. $ firewall-cmd --state
    3. not running

    注: CentOS 7 关闭防火墙与 CentOS 6 有所不同

    安装 Ruby

    1. $ yum -y install ruby ruby-devel rubygems rpm-build
    2. $ gem install redis

    注:创建集群时需要安装 Ruby 运行redis-trib.rb

    创建集群

    Redis 官方提供了 redis-trib.rb 这个工具,就在解压目录的 src 目录中

    1. $ /usr/local/redis-3.2.6/src/redis-trib.rb create --replicas 1 192.168.1.8:7000 192.168.1.8:7001 192.168.1.8:7002 192.168.1.9:7006 192.168.1.9:7004 192.168.1.9:7005 192.168.1.10:7006 192.168.1.10:7007 192.168.1.10:7008

    其中,前三个 ip:port 为第一台机器的节点,中间三个为第二台机器,最后三个为第三台机器

    结果1

    输入 yes,然后出现如下内容,说明安装成功

    结果2

    集群验证

    在第一台机器上连接集群的7000节点,在另外一台连接7004节点,连接方式为:

    1. ##加参数 -C 可连接到集群,因为 redis.conf 将 bind 改为了ip地址,所以 -h 参数不可以省略,-p 参数为端口号
    2. $ /usr/local/redis-3.2.6/src/redis-cli -h 192.168.1.8 -c -p 7000

    在7004节点执行命令:

    1. 192.168.1.8:7000> get name
    结果3

    然后在另两台7000、7007端口,查看 key 为 name 的内容

    1. 192.168.1.8:7000> get name
    结果4

    1. 192.168.1.10:7007> get name
    结果5

    说明集群运作正常

    总结

    redis cluster在设计的时候,就考虑到了去中心化、去中间件,也就是说,集群中的每个节点都是平等关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。

    Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽 (hash slot)的方式来分配的。redis cluster 默认分配了 16384 个 slot,当我们 set 一个 key 时,会用CRC16算法来取模得到所属的 slot,然后将这个 key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。所以我们在测试的时候看到 set 和 get 的时候,直接跳转到了7000端口的节点。

    Redis 集群会把数据存在一个 master 节点,然后在这个 master 和其对应的 salve 之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的 master 节点获取数据。只有当一个 master 挂掉之后,才会启动一个对应的 salve 节点,充当 master 。

    需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。

  • 四大名著开篇诗词:句句都是真理,道尽人生玄机

     四大名著以历史的兴衰,社会的炎凉,事件的传奇,人物的悲欢等等故事或撼动人心、或悦人耳目、或破人愁闷,其所蕴含着的世道人生之理,更是给人以警醒和启迪。
      尤其是在开篇诗词中,蕴含着作者对世事人生的感悟,荟萃着一些精彩的醒世恒言,读来颇有兴味。
      
      《三国演义》开篇词
      滚滚长江东逝水, 浪花淘尽英雄。
      是非成败转头空。
      青山依旧在, 几度夕阳红。
      白发渔樵江渚上, 惯看秋月春风。
      一壶浊酒喜相逢,
      古今多少事,都付笑谈中。
      这是明代的一位名叫杨慎的状元写的词,纵然是千古英雄,也终将在历史的长河中随浪逐流一逝而尽。秋月春风相续,人世转换不停,唯青山常在,夕阳依旧。
      所谓是非成败,其实转瞬成空,均免不了化作笑谈。即便是千古传奇,亦不过付之一笑而已。
      此词教人看空:“是非成败转头空。” 教人看淡:“古今多少事,都付笑谈中。” 该词用长镜头大视角,横观天地,纵论古今,有很强的历史沧桑感,更兼参透功名、勘破富贵,属大手笔。
      将此词作为《三国演义》这部鸿篇巨制的开篇词,无论是意境还是格调都与之相吻合,其宏伟的气势也是能够压住全篇的。
      
      《水浒传》开篇词
      试看书林隐处,几多俊逸儒流。
      虚名薄利不关愁,裁冰及剪雪,谈笑看吴钩。
      评议前王并后帝,分真伪占据中州。
      七雄扰扰乱春秋。
      兴亡如脆柳,身世类虚舟。
      见成名无数,图名无数,更有那逃名无数。
      霎时新月下长川,江湖变桑田古路。
      讶求鱼缘木,拟穷猿择木,恐伤弓远之曲木。
      不如且覆掌中杯,再听取新声曲度。
      《水浒传》讲的是江湖豪杰的传奇故事,而这首开篇词,却大有笑傲江湖的味道。按词中所论, 称王称霸,攻城略地,不过是“扰扰”之人作“乱”而已。世上成名求名及埋名者,终将被沧海桑田所掩埋。
      而求鱼之路、穷猿之路,只怕最后走成了惊弓之路。唯“虚名薄利不关愁,裁冰及剪雪,谈笑看吴钩”者,隐匿于书林之中,方才是“俊逸儒流”。所以世上之人,不如握着掌中的酒杯茶杯,听一曲新鲜的曲目。
      此词蔑视厮杀争斗的“七雄”, 冷眼旁观熙来攘往的图名逐利者,笑看那些为名利而剜门子盗洞寻找门路的人,羡慕那些笑傲江湖的“俊逸儒流”,倡导一种隐逸恬淡的生活态度。
      
      《红楼梦》开篇词
      浮生着甚苦奔忙,盛席华宴终散场。
      悲喜千般如幻渺,古今一梦尽荒唐。
      漫言红袖啼痕重,更有情痴抱恨长。
      字字看来都是血,十年辛苦不寻常。
      《红楼梦》开篇诗说得更直白,好像就是耳提面命,直对大众而言的,和文中的《好了歌》紧紧呼应。“浮生着甚苦奔忙”,人生悲喜如同幻渺,古往今来不过“一梦”, 岂止是一梦,是极尽荒唐的梦。
      可惜,有人入梦太沉,死守着“盛席华宴”,不愿散场;有人大梦不醒,为名为利“苦奔忙”。 《红楼梦》开篇词教人别入梦太深、太久。死守着“盛席华宴”的人,到梦醒之时,就该失落了。
      
      《西游记》开篇词
      混沌未分天地乱,茫茫渺渺无人见。
      自从盘古破鸿蒙,开辟从兹清浊辨。
      覆载群生仰至仁,发明万物皆成善。
      预知造化会元功,须看《西游释厄传》。
      《西游记》的开篇词颇具广告意味。天地仁而覆载百姓,万物生皆由善而来。斯人当以感天地之仁,待万物以善。 要悟彻天造地化之机、修持大道之功,还是从这部西游中遇到各种灾难的破解中来寻求答案吧。
      《西游记》讲究因果报应,劝人守命待时,与人向善,鼓励人们要修成正果。
      纵览四大名著的开篇诗词,各以一字以蔽之。 《三国》曰“空”,《水浒》曰“隐”,《西游》曰“修”,《红楼》曰“梦”。

  • Linux安装Apache详细过程

    一、下载相关软件包

    http://httpd.apache.org/download.cgi

    http://apr.apache.org/download.cgi

    https://sourceforge.net/projects/pcre/files/pcre/

    http://tomcat.apache.org/download-connectors.cgi

    https://www.openssl.org/source/

    二、安装过程

    1、apr 安装

    # tar -zxvf apr-1.6.3.tar.gz

    # cd apr-1.6.3

    # ./configure --prefix=/usr/local/apr/

    # make && make install

    2、apr-util安装

    yum install expat-devel -y

    # tar -zxvf apr-util-1.6.1.tar.gz

    # cd apr-util-1.6.1

    # ./configure --prefix=/usr/local/apr-util/ --with-apr=/usr/local/apr/

    # make && make install

    3、pcre安装

    # tar -zxvf pcre-8.41.tar.gz

    # cd pcre-8.41

    # ./configure --prefix=/usr/local/pcre/

    # make && make install

    4、openssl安装

    centos安装3.0.0 以上版本:

    yum install -y perl-CPAN

    perl -MCPAN -e shell

    install IPC/Cmd.pm

    # tar -zxvf openssl-1.0.2n.tar.gz

    # cd openssl-1.0.2n

    ./config -fPIC --prefix=/usr/local/openssl  --openssldir=/usr/local/openssl shared zlib-dynamic enable-camellia
    make && make install

    5、http 安装

    # tar -zxvf httpd-2.4.29.tar.gz

    # cp -r apr-1.6.3 httpd-2.4.29/srclib/apr

    # cp -r apr-util-1.6.1 httpd-2.4.29/srclib/apr-util

    # cd httpd-2.4.29/srclib/apr/

    # make clean

    # cd httpd-2.4.29/srclib/apr-util/

    # make clean

    # cd httpd-2.4.29

    #./configure --prefix=/usr/local/apache2 --enable-so --enable-modules=all --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-pcre=/usr/local/pcre --with-ssl=/usr/local/openssl --with-included-apr

    (错误:configure: error: Did not find pcre-config script at"pcre",解决方案将标志--with-pcre=/usr/local/pcre更改为--with-pcre=/usr/local/pcre/bin/pcre-config)

    # make && make install

    6、tomcat-connectors 安装

    # tar -zxvf tomcat-connectors-1.2.42-src.tar.gz

    # cd tomcat-connectors-1.2.42-src/native/

    # ./configure --with-apxs=/usr/local/apache2/bin/apxs

    # make && make install

    三、代理相关配置

    注意conf/httpd.conf 文件中 ServerName xxx.xxx.com:80 需要改为 ServerName 127.0.0.1:80

    1. 反向代理,启用Apache的mod_proxy相关模块:

    vi /usr/local/apache2/conf/httpd.conf

    LoadModule proxy_module modules/mod_proxy.so

    LoadModule proxy_connect_module modules/mod_proxy_connect.so

    LoadModule proxy_ftp_module modules/mod_proxy_ftp.so

    LoadModule proxy_http_module modules/mod_proxy_http.so

    LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

    开启 httpd-vhosts.conf :

    Include conf/extra/httpd-vhosts.conf

    httpd-vhosts.conf 相关配置参考:

    <VirtualHost *:80>

    ServerAdmin nic@abc.com

    ServerName www.abc.com

    RewriteEngine on
    RewriteCond   %{HTTPS} !=on
    RewriteRule   ^(.*)$  https://%{SERVER_NAME}$1 [L,R]

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www.abc.com$ [NC]
    RewriteRule ^(.*)$ http://www.server.com/$1 [L,R]

    Proxypass / http://127.0.0.1:8080/llms/

    ProxypassReverse / http://127.0.0.1:8080/llms/

    Proxypass /llms/ ajp://127.0.0.1:8000/llms/

    ProxypassReverse /llms/ ajp://127.0.0.1:8000/llms/

    ProxyPass /wordpress/  !

    ProxypassReverse /wordpress/  !

    Alias /wordpress/  /home/wordpress/

    <Directory "/home/wordpress/">

    Options Indexes FollowSymLinks

    DirectoryIndex index.html index.php

    AllowOverride All

    Order Deny,Allow

    Allow from all

    Require all granted

    </Directory>

    ErrorLog "logs/www.abc.com-error_log"

    CustomLog "logs/www.abc.com-access_log" common

    </VirtualHost>

    限制登录范围

    ProxyPass /login.html !
    ProxyPassReverse  /login.html !
    <Location /login.html>
    SetHandler login.html
    Order Deny,Allow
    Deny from all
    Allow from xx.xx.xx
    </Location>

    2 . 负载均衡配置

    模块 Apache做负载均衡,需要启用Apache的mod_proxy相关模块:

    LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
    LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
    LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
    LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
    LoadModule watchdog_module modules/mod_watchdog.so
    LoadModule slotmem_shm_module modules/mod_slotmem_shm.so

    2.1定义集群 添加下列配置信息:

    vi /usr/local/apache2/conf/extra/httpd-vhosts.conf

    Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED

    ProxyPass / balancer://proxy/ stickysession=JSESSIONID nofailover=On lbmethod=bybusyness
    ProxyPassReverse / balancer://proxy/

    <Proxy balancer://proxy>
    BalancerMember ajp://172.31.1.44:9211 loadfactor=1 route=sms9011 timeout=600 keepalive=on
    BalancerMember ajp://172.31.1.44:9212 loadfactor=1 route=sms9012 timeout=600 keepalive=on

    ProxySet stickysession=ROUTEID
    </Proxy>

    SetEnv force-proxy-request-1.0.1
    SetEnv proxy-nokeepalive 1

    <Location />
    Require all granted
    </Location>
    #管理端
    ProxyPass /balancer-manager !
    ProxyPassReverse  /balancer-manager !
    <Location /balancer-manager>
    SetHandler balancer-manager
    Order Deny,Allow
    Deny from all
    Allow from all
    </Location>

    Proxy为集群名称;

    BalancerMember指令可以添加负载均衡组中的真实服务器地址,协议ajp也可替换成http;

    loadfactor为权重(本配置为轮询);

    ProxyPass/ ProxyPassReverse为反向代理,修改并指向集群‘proxy’;

    <Location /balancer-manager>是用来监视负载均衡的工作情况,生产环境建议关闭;

    访问 http://localhost/balancer-manager/ 即可看到负载均衡的工作状况。

    2.2权重修改

    如果不想平均分配请修改 BalancerMember 的 loadfactor 参数即可,取值范围为1-100。

    定义ProxySet lbmethod可以改变算法:

    lbmethod=byrequests 按照请求次数均衡(默认)

    lbmethod=bytraffic 按照流量均衡

    lbmethod=bybusyness 按照繁忙程度均衡(总是分配给活跃请求数最少的服务器)

    四、常规安全配置

    1. 隐藏和伪装APACHE的版本
    添加到apache的httpd.conf文件中:
    ServerSignature Off
    ServerTokens Prod

    2. 减少CGI和SSL风险。
    #ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
    #<Directory "/usr/local/apache2/cgi-bin">
    #    AllowOverride None
    #    Options None
    #    Order allow,deny
    #    Allow from all
    #</Directory>

    3. 禁止Apache遍历目录 ,把选项设置成:
    Options FollowSymLinks

    4. 关闭TraceEnable
    在httpd.conf的尾部添加:
    TraceEnable off
    和:
    确认rewrite模块激活(httpd.conf,下面一行前面没有#):
    LoadModule rewrite_module modules/mod_rewrite.so
    – 在各虚拟主机的配置文件里添加如下语句:
    RewriteEngine On
    RewriteCond %{REQUEST_METHOD} ^TRACE
    RewriteRule .* – [F]

    5. 防止拒绝服务攻击
    AcceptFilter http data
    AcceptFilter https data

    6. 禁止非GET、POST之外的(比如PROPFIND、OPTIONS等)请求方式

    <Location />
    <LimitExcept GET POST >
    Order deny,allow
    Deny from all
    </LimitExcept>
    </Location>

    7. Timeout与KeepAlive配置
    Timeout 300
    ProxyTimeout 300
    KeepAlive On
    KeepAliveTimeout 300

    8.设置错误页面重定向
    ErrorDocument 400 /custom.html
    ErrorDocument 401 /custom.html
    ErrorDocument 403 /custom.html
    ErrorDocument 404 /custom.html
    ErrorDocument 405 /custom.html
    ErrorDocument 500 /custom.html

    9. 监听地址绑定
    Listen xx.xx.xx.xx:80

    10.防止慢速攻击
    <IfModule reqtimeout_module>
    RequestReadTimeout header=20-40,MinRate=500 body=20-100,MinRate=500
    </IfModule>

    安装mod_qos
    cd mod_qos-11.36/apache2
    /usr/local/apache2/bin/apxs -i -c mod_qos.c

    11. 关闭任何不必要的模块
    Apache通常会安装几个模块,但以下几个模块通常被激活而并无大用:mod_imap, mod_include, mod_info, mod_userdir, mod_status, mod_cgi, mod_autoindex

    12. 确保Apache以其自身的用户账号和组运行,慎重对待对.htaccess文件的支持 ,使用最高和最新安全版本

    13.让apache支持shtml文件,实现include文件解析

    确认加载include.so模块,将注释去掉。

    LoadModule include_module modules/mod_include.so

    AddType部分去掉这两段注释:

    AddType text/html .shtml

    AddOutputFilter INCLUDES .shtml

    目录权限里找到Options Indexes FollowSymLinks,增加Includes

    修改为:Options Indexes FollowSymLinks Includes。

    14.apache加大网站并发量

    <IfModule mpm_event_module>
    ServerLimit            200
    StartServers             5
    MinSpareThreads        25
    MaxSpareThreads        150
    ThreadsPerChild         50
    MaxRequestWorkers     8000
    MaxConnectionsPerChild   0
    </IfModule>

    15.apache加大文件上传限制500M

    LimitRequestBody 524288000

    16.Apache 按天生成日志

    CustomLog "logs/access.log" common 将其改为:CustomLog "|/usr/local/apache2/bin/rotatelogs  logs/www.xx.com%Y_%m_%d-access_log 86400 480" common

    ErrorLog "logs/error.log"  将其改为:ErrorLog "|/usr/local/apache2/bin/rotatelogs  logs/www.xx.com%Y_%m_%d-error_log 86400 480"

    17.Apache限制IP并发数和流量控制

    使用mod_limitipconn模块限制IP并发连接数

    下载地址:http://dominia.org/djao/limit/mod_limitipconn-0.24.tar.bz2

    安装:

    tar -jxvf mod_limitipconn-0.24.tar.bz2

    cd mod_limitipconn-0.24

    /usr/local/apache2/bin/apxs -c -i mod_limitipconn.c

    编辑httpd.conf
    LoadModule limitipconn_module modules/mod_limitipconn.so

    ExtendedStatus On

    <virtualHost *:80>
    <ifModule mod_limitipconn.c>
    <location />
    MaxConnPerIP 5
    NoIPLimit image/*
    </location>
    </ifModule>

    </virtualHost>

    使用mod_bandwidth模块限制带宽

    下载地址:http://bwmod.sourceforge.net/files/mod_bw-0.7.tgz

    tar -zxvf mod_bw-0.7.tgz
    cd mod_bw
    /usr/local/apache2/bin/apxs -c -i mod_bw.c

    错误解决办法:

    vi mod_bw.c

    把所有的remote_ip和remote_addr分别替换成client_ip和client_addr

    #ifdef APR_MAJOR_VERSION  //添加这行
    #if (APR_MAJOR_VERSION < 1)
    #define apr_atomic_inc32 apr_atomic_inc
    #define apr_atomic_dec32 apr_atomic_dec
    #define apr_atomic_add32 apr_atomic_add
    #define apr_atomic_cas32 apr_atomic_cas
    #define apr_atomic_set32 apr_atomic_set
    #endif
    #endif //添加这行

    编辑httpd.conf

    LoadModule bw_module modules/mod_bw.so

    <virtualHost *:80>
    ServerName xxxxx
    DocumentRoot  /xxxx
    BandwidthModule On
    ForceBandWidthModule On
    Bandwidth all 10240000
    MinBandwidth all 500000
    LargeFileLimit * 500 50000
    MaxConnection all 6
    </virtualHost>

    18.https 协议配置

    SSLProtocol -ALL +TLSv1.1 +TLSv1.2 +TLSv1.3

    SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE:!3DES:+MEDIUM

    19. http反向代理https,需要启动SSLProxyEngine

    SSLProxyEngine On

    ProxyPass   /career-api/  https://career.hkust-gz.edu.cn/career/external/zpcareer/zpHubList
    ProxyPassReverse   /career-api/   https://career.hkust-gz.edu.cn/career/external/zpcareer/zpHubList
    20. apache 做反向代理,向后端转发客户端真实 IP

    依赖模块
    LoadModule remoteip_module modules/mod_remoteip.so
    http.conf 添加配置
    RemoteIPHeader x-forwarded-for
    RemoteIPInternalProxy 127.0.0.1

    21.一些代理开启设置

    ProxyRequests On
    ProxyPreserveHost On
    SSLEngine on
    SSLProxyEngine on
    SSLProxyCheckPeerCN off
    SSLProxyCheckPeerName off

  • Linux LVM硬盘管理及LVM扩容

    LVM磁盘管理

    一、LVM简介... 1

    二、 LVM基本术语... 2

    三、 安装LVM... 3

    四、 创建和管理LVM... 4

    2、 创建PV.. 6

    3、 创建VG.. 7

    4、 创建LV.. 9

    5、LV格式化及挂载... 10

    一、LVM简介

    LVM是 Logical Volume Manager(逻辑卷管理)的简写,它由Heinz Mauelshagen在Linux 2.4内核上实现。LVM将一个或多个硬盘的分区在逻辑上集合,相当于一个大硬盘来使用,当硬盘的空间不够使用的时候,可以继续将其它的硬盘的分区加入其中,这样可以实现磁盘空间的动态管理,相对于普通的磁盘分区有很大的灵活性。

    与传统的磁盘与分区相比,LVM为计算机提供了更高层次的磁盘存储。它使系统管理员可以更方便的为应用与用户分配存储空间。在LVM管理下的存储卷可以按需要随时改变大小与移除(可能需对文件系统工具进行升级)。LVM也允许按用户组对存储卷进行管理,允许管理员用更直观的名称(如"sales'、 'development')代替物理磁盘名(如'sda'、'sdb')来标识存储卷。

    如图所示LVM模型:

    LVM 模型

    由四个磁盘分区可以组成一个很大的空间,然后在这些空间上划分一些逻辑分区,当一个逻辑分区的空间不够用的时候,可以从剩余空间上划分一些空间给空间不够用的分区使用。

    二、 LVM基本术语

    前面谈到,LVM是在磁盘分区和文件系统之间添加的一个逻辑层,来为文件系统屏蔽下层磁盘分区布局,提供一个抽象的盘卷,在盘卷上建立文件系统。首先我们讨论以下几个LVM术语:

    物理存储介质(The physical media):这里指系统的存储设备:硬盘,如:/dev/hda1、/dev/sda等等,是存储系统最低层的存储单元。

    物理卷(physical volume):物理卷就是指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数。

    卷组(Volume Group):LVM卷组类似于非LVM系统中的物理硬盘,其由物理卷组成。可以在卷组上创建一个或多个“LVM分区”(逻辑卷),LVM卷组由一个或多个物理卷组成。

    逻辑卷(logical volume):LVM的逻辑卷类似于非LVM系统中的硬盘分区,在逻辑卷之上可以建立文件系统(比如/home或者/usr等)。

    PE(physical extent):每一个物理卷被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。

    LE(logical extent):逻辑卷也被划分为被称为LE(Logical Extents) 的可被寻址的基本单位。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。

    简单来说就是:

    PV:是物理的磁盘分区

    VG:LVM中的物理的磁盘分区,也就是PV,必须加入VG,可以将VG理解为一个仓库或者是几个大的硬盘。

    LV:也就是从VG中划分的逻辑分区

    如下图所示PV、VG、LV三者关系:

    PV、VG、LV 三者关系

    三、 安装LVM
    首先确定系统中是否安装了lvm工具:
    [root@www root]# rpm –qa|grep lvm
    lvm-1.0.3-4
    如果命令结果输入类似于上例,那么说明系统已经安装了LVM管理工具;如果命令没有输出则说明没有安装LVM管理工具,则需要从网络下载或者从光盘装LVM rpm工具包。

    四、 创建和管理LVM

    要创建一个LVM系统,一般需要经过以下步骤:
    1、查看磁盘分区表

    使用分区工具(如:fdisk等)创建LVM分区,方法和创建其他一般分区的方式是一样的,区别仅仅是LVM的分区类型为8e。如下列图所示:

    查看硬盘分区表

    创建分区

    创建分区

    使用fdisk创建分区,根据设备文件的绝对路径(/dev/hda)进入分区管理

    分区管理1

    分区管理2

    一定要指定分区的格式为8e,这是LVM的分区格式

    2、 创建PV

    创建PV

    3、 创建VG

    创建VG

    查看VG

    创建完成VG之后,才能从VG中划分一个LV。

    4、 创建LV

    创建LV

    创建了一个名字为lvData,容量大小是100M的分区,其中:-L:指定LV的大小 -n:指定LV的名。Vo1Group00:表示从这个VG中划分LV;

    5、LV格式化及挂载

    下一步需要对LV进行格式化(使用mkfs进行格式化操作),然后LV才能存储资料

    LV格式化

    将格式化后的LV分区挂载到指定的目录下,就可以像普通目录一样存储数据了

    LV挂载

    挂载之后,可以看到此LV的容量。

    如果要在系统启动的时候启动LV,最好是将lvData写入fstable 文件中,如下所示:

    LV配置fstable

    使用Vim编辑器,打开/etc/fstab,在最后一行添加如图中所示,其中/dev/VG00/lvData指定需要挂载的分区LV,/root/test指定要挂载的目录(挂载点),ext3分区文件系统格式,其它使用默认即可

     

    扩容当前分区

    一、首先创建一块新的分区:

    fdisk /dev/hda

    n

    p #选择逻辑分区,如果没有,则首先创建扩展分区,然后再添加逻辑分区(硬盘:最多四个分区P-P-P-P或P-P-P-E)

    6 #分区号(假如从5开始),/dev/hda6

    t 8e #分区类型8e表示LVM分区

    w #写入分区表

    partprobe #重读分区表

    mkfs –t ext4 /dev/hda6 #格式化

    partx /dev/hda #查看当前硬盘的分区表及使用情况

    二、创建PV,扩容VG,LV

    pvcreate /dev/hda6

    vgdisplay #查看当前已经存在的VG信息,以存在VG:VG00为例

    vgextend VG00 /dev/hda6 #扩展VG00

    lvdisplay #查看已经存在的LV信息,以存在LV:LV01为例

    lvextend –L +1G /dev/VG00/LV01 #扩展LV

    lvcreate -L +899G -n lvhome VG00 #创建LV

    resize2fs /dev/VG00/LV01 #执行该重设大小,对于当前正在使用的LV01有效

    linux7后磁盘默认xfs格式使用  xfs_growfs

    #查看挂载情况,已经扩容 

    df –h

    2.  xfs格式的扩容,不支持缩容(不用先卸载)

    先卸载umount 

    lvresize -L 300M /dev/vg1/lv1 重新设置卷大小

    xfs_growfs /dev/vg1/lv1 xfs文件系统需要执行

    3. 扩展swap交换分区方式(+)
    #lvextend -L +8GB /dev/centos/swap
    # sync
    # swapoff /dev/centos/swap
    # mkswap /dev/centos/swap 
    # swapon /dev/centos/swap 
    free -m #查看情况,已经扩容 

  • Tomcat 启动/关闭/重启 脚本及优化

    一 优化

    connectionTimeout="30000" keepAlivetimeout="10000" MaxKeepAliveRequests="200" maxThreads="200" maxConnections="500" maxProcessors="200" minSpareThreads="8" maxSpareThreads="64" enableLookups="false" acceptCount="100" debug="0" disableUploadTimeout="true" maxPostSize="-1" maxHttpHeaderSize="102400" URIEncoding="UTF-8"

    二 脚本

    #!/bin/bash
    USER=demo
    HOME=/home/demo
    JAVA_HOME=/usr/java/jdk1.8.0_241
    PATH=$JAVA_HOME/bin:/usr/local/bin:$PATH
    CATALINA_HOME=$HOME/apache-tomcat-8.5.57
    export HOME JAVA_HOME PATH CATALINA_HOME

    # check current user
    if [ $(id | awk '{print $1}') == 'uid=0(root)' ]; then
        echo '**************************************'
        echo '** Can not run this script as root. **'
        echo '**************************************'
        exit -1
    fi;

    start(){
          #    如果多个tomcat共用webapps,需要为每个tomcat设置不同的 server-identify 值。建议设置为端口号的负数,例如-10000,-8080等
          JAVA_OPTS="-Djava.awt.headless=true -Dserver-identify=-10000 -Dserver-port=10000 -server -XX:ReservedCodeCacheSize=64m -XX:InitialCodeCacheSize=64m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256M -Dorg.apache.el.parser.SKIP_IDENTIFIER_CHECK=true -Xms1024m -Xmx1024m -Xmn512m"
          export JAVA_OPTS
          cd $CATALINA_HOME/bin
          ./startup.sh 
    }

    stop() {
          cd $CATALINA_HOME/bin
          ./shutdown.sh
    }

    restart(){
          echo  "`date` restarting ..."
          stop
          sleep 3
          ps -ef | grep java | grep $USER | grep $CATALINA_HOME |  awk ' BEGIN { FS=" ";} { pid = "kill -9 "$2; system(pid); } '
          start
          echo  "`date` restarting finished."
    }

    cd $HOME
    case $1 in
    'stop')
          stop
          ;;
    'start')
          start
          ;;
    'restart')
          restart
    esac
    cd $HOME

  • Mysql 5.6.11源码安装

    一、cmake安装 
    MySQL从5.5版本开始,通过./configure进行编译配置方式已经被取消,取而代之的是cmake工具 
    下载地址:http://cmake.org/cmake/resources/software.html 
    文件名:cmake-2.8.10.2.tar.gz 
    tar -zxvf cmake-2.8.10.2.tar.gz 
    cd cmake-2.8.10.2 
    ./configure 
    make 
    make install 
      
    二、mysql5.6.11安装 
    下载地址:http://www.mysql.com/downloads/mysql/#downloads ,选择Source Code 
    文件名:Generic Linux (Architecture Independent), Compressed TAR Archive (mysql-5.6.11.tar.gz) 
      
    创建mysql用户及用户组 
    group mysql 
    useradd -g mysql mysql 
      
    创建mysql的安装目录及数据库存放目录 
    mkdir -p /usr/local/mysql5 
    mkdir -p /usr/local/mysql5/data 
    chown -R mysql:mysql /usr/local/mysql5 
      
    解压编译安装 
    tar -zxvf mysql-5.6.11.tar.gz 
    cd mysql-5.6.11 
      
    cmake

    -DCMAKE_INSTALL_PREFIX=/usr/local/mysql5

    -DMYSQL_DATADIR=/usr/local/mysql5/data

    -DMYSQL_UNIX_ADDR=/tmp/mysqld5.sock

    -DSYSCONFDIR=/usr/local/mysql5/etc

    -DMYSQL_TCP_PORT=3306

    -DMYSQL_USER=mysql

    -DDEFAULT_CHARSET=utf8

    -DDEFAULT_COLLATION=utf8_general_ci

    -DEXTRA_CHARSETS=all

    -DWITH_READLINE=1

    -DENABLED_LOCAL_INFILE=1

    -DWITH_INNOBASE_STORAGE_ENGINE=1

    -DWITH_PARTITION_STORAGE_ENGINE=1

    -DENABLE_DOWNLOADS=1 
    make 
    make install 
    注意事项: 
    重新编译时,需要清除旧的对象文件和缓存信息。 
    # make clean 
    # rm -f CMakeCache.txt 
    # rm -rf /usr/local/mysql5/etc/my.cnf 
      
    复制配置文件 
    mkdir /usr/local/mysql5/etc 
    cp support-files/ my-default.cnf  /usr/local/mysql5/etc/my.cnf 
    初始化系统数据库 
    cd /usr/local/mysql5 
    scripts/mysql_install_db --user=mysql 
      
    设置环境变量 
    vi /etc/profile 
    MYSQL_HOME=/usr/local/mysql5 
    PATH=$MYSQL_HOME/bin:$HOME/bin:$PATH 
    CLASSPATH=$MYSQL_HOME/lib:$CLASSPAHT:./ 
      
    Mysql自动启动 
    cp support-files/mysql.server  /etc/init.d/mysqld 
    chkconfig –add mysqld

  • Mariadb10.X 源码安装

    一、 cmake安装 
    MySQL从5.5版本开始,通过./configure进行编译配置方式已经被取消,取而代之的是cmake工具 
    下载地址:http://cmake.org/cmake/resources/software.html 
    文件名:cmake-2.8.10.2.tar.gz 
    tar -zxvf cmake-2.8.10.2.tar.gz 
    cd cmake-2.8.10.2 
    ./configure 
    make 
    make install 
     
    二、mariadb-10.0.2.tar.gz安装 
    下载地址:https://downloads.mariadb.org/ ,选择Download 10.0.2 Alpha Now 
    文件名:mariadb-10.0.2.tar.gz 
     
    创建mysql用户及用户组 
    group mysql 
    useradd -g mysql mysql 
     
    创建mysql的安装目录及数据库存放目录 
    chown -R mysql:mysql /home/mysql 
     
    解压编译安装 
    tar -zxvf mariadb-10.0.2.tar.gz 
    cd mariadb-10.0.2 
     
    cmake \
    -DCMAKE_INSTALL_PREFIX=/home/mysql \
    -DMYSQL_DATADIR=/home/mysql/data \
    -DSYSCONFDIR=/home/mysql/etc \
    -DMYSQL_UNIX_ADDR=/home/mysql/xwhe.sock \
    -DMYSQL_TCP_PORT=3306 \
    -DMYSQL_USER=mysql \
    -DWITH_INNOBASE_STORAGE_ENGINE=1 \
    -DWITH_ARCHIVE_STPRAGE_ENGINE=1 \
    -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
    -DWIYH_READLINE=1 \
    -DWIYH_SSL=system \
    -DVITH_ZLIB=system \
    -DWITH_LOBWRAP=0 \
    -DDEFAULT_CHARSET=utf8 \
    -DDEFAULT_COLLATION=utf8_general_ci \
    -DEXTRA_CHARSETS=all \
    -DWITH_READLINE=1 \
    -DENABLE_DOWNLOADS=1 \
    -DENABLED_LOCAL_INFILE=1

    make 
    make install 
    注意事项: 
    重新编译时,需要清除旧的对象文件和缓存信息。 
    # make clean 
    # rm -f CMakeCache.txt 
    # rm -rf /etc/my.cnf 
     
    复制配置文件 
    cp support-files/my-large.cnf  /home/mysql/etc/my.cnf 
    初始化系统数据库 
    scripts/mysql_install_db --user=mysql 
     
    设置环境变量 
    vi /etc/profile 
    MYSQL_HOME=/home/mysql 
    PATH=$MYSQL_HOME/bin:$HOME/bin:$PATH 
    CLASSPATH=$MYSQL_HOME/lib:$CLASSPAHT:./ 
     
    Mysql自动启动 
    cp support-files/mysql.server  /etc/init.d/mysqld 
    chkconfig –add mysqld

  • Apache https配置步骤

    1、 确认是否安装ssl模块

    是否有mod_ssl.so文件

    2、 生成证书和密钥

    linux下

    步骤1:生成密钥

    命令:openssl genrsa 2048 > server.key

    说明:这是用128位rsa算法生成密钥,得到server.key文件

    步骤2: 生成证书请求文件

    命令:openssl req -new -key server.key > server.csr

    说明:这是用步骤1的密钥生成证书请求文件server.csr, 这一步提很多问题,一一输入

    步骤3: 生成证书

    命令:openssl req -x509 -days 3650 -key server.key -in server.csr > server.crt

    说明:这是用步骤1,2的的密钥和证书请求生成证书server.crt,-days参数指明证书有效期,单位为天

    window下

    步骤1:生成密钥
    命令:openssl genrsa 2048 > server.key
    说明:这是用128位rsa算法生成密钥,得到server.key文件

    步骤2: 生成证书请求文件
    命令:openssl req -config D:\work_soft\Apache2.2\conf\openssl.cnf -new -key server.key > server.csr
    说明:这是用步骤1的密钥生成证书请求文件server.csr, 这一步提很多问题,一一输入

    步骤3: 生成证书
    命令:openssl req -config D:\work_soft\Apache2.2\conf\openssl.cnf -x509 -days 365 -key server.key -in server.csr > server.crt
    说明:这是用步骤1,2的的密钥和证书请求生成证书server.crt,-days参数指明证书有效期,单位为天

    把得到的server.key和server.crt文件拷贝到apache的对应目录

    3、 配置apache

    LoadModule ssl_module /opt/taobao/install/httpd/modules/mod_ssl.so

    l 修改httpd-ssl.conf文件

    注意在此文件中配置证书和密钥

    SSLCertificateFile /apache/conf/server.crt

    SSLCertificateKeyFile /apache/conf/server.key

    虚拟机设置

    NameVirtualHost *:443

    <VirtualHost *:443>

    ServerName xxxx.com
    Proxypass / ajp://x.x.x.x:8080/
    ProxypassReverse / ajp://x.x.x.x:8080/
    ErrorLog "logs/443-error_log"
    CustomLog "logs/443-access_log" common
    SSLEngine on
    SSLCertificateFile "/usr/local/apache2/conf/server.crt"
    SSLCertificateKeyFile "/usr/local/apache2/conf/server.key"

    </VirtualHost>

    配置http 跳转 https ,修改httpd.conf文件

    <VirtualHost *:80>

        ServerName xxxx.com
        Redirect permanent / https://xxxx.com/ 
        ErrorLog "logs/xxx-error_log"
        CustomLog "logs/xxxx-access_log" common

    </VirtualHost>

    4、 重新启动apache

    用https方式访问,查看是否生效.

  • Tomcat应用https配置

    服务器生成证书

    ./keytool -genkey -v -alias xxxx-keyalg RSA -keystore /home/soft/xxxx.keystore -validity 36500

    客户端生成证书

    ./keytool -genkey -v -alias xxxx -keyalg RSA -storetype PKCS12 -keystore /home/soft/xxxx.p12 -validity 36500

    生成客户端cer

    ./keytool -export -alias xxxx -keystore /home/soft/xxxx.p12 -storetype PKCS12 -storepass xxxx2015 -rfc -file /home/soft/xxxx.cer

    服务器加入客户端证书

    ./keytool -import -v -file /home/soft/xxxx.cer -keystore /home/soft/xxxx.keystore

    生成服务器cer

    ./keytool -keystore /home/soft/xxxx.keystore -export -alias xxxx -file D:\home\xxxxserver.cer keystoreFile="/home/soft/xxxx.keystore" keystorePass="xxxx2015" truststoreFile="/home/soft/xxxx.keystore" truststorePass="xxxx2015"

    查看证书

    ./keytool -list -keystore /home/soft/xxxx.keystore

    让客户端信任服务器证书
    由于是双向SSL认证,客户端也要验证服务器证书,因此,必须把服务器证书添加到浏览的“受信任的根证书颁发机构”。由于不能直接将keystore格式的证书库导入,必须先把服务器证书导出为一个单独的CER文件,使用如下命令:
    keytool -keystore D:\home\tomcat.keystore -export -alias tomcat -file D:\home\tomcat.cer (tomcat为你设置服务器端的证书名)。
    通过以上命令,服务器证书就被我们导出到“D:\home\tomcat.cer”文件了。双击tomcat.cer文件,按照提示安装证书,将证书填入到“受信任的根证书颁发机构”。
    配置Tomcat服务器
    打开Tomcat根目录下的/conf/server.xml,找到Connector port="8443"配置段,修改为如下:
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
    SSLEnabled="true" maxThreads="150" scheme="https"
    secure="true" clientAuth="true" sslProtocol="TLS"
    keystoreFile="D:\\home\\tomcat.keystore" keystorePass="123456"
    truststoreFile="D:\\home\\tomcat.keystore" truststorePass="123456" />
    (tomcat要与生成的服务端证书名一致)
    属性说明:
    clientAuth:设置是否双向验证,默认为false,设置为true代表双向验证
    keystoreFile:服务器证书文件路径
    keystorePass:服务器证书密码
    truststoreFile:用来验证客户端证书的根证书,此例中就是服务器证书
    truststorePass:根证书密码

    测试
    在浏览器中输入:https://localhost:8443/,会弹出选择客户端证书界面,点击“确定”,会进入tomcat主页,地址栏后会有“锁”图标,表示本次会话已经通过HTTPS双向验证,接下来的会话过程中所传输的信息都已经过SSL信息加密。

  • LDAP常用命令解析

    ldapadd
    -x 进行简单认证
    -D 用来绑定服务器的DN
    -h 目录服务的地址
    -w 绑定DN的密码
    -f 使用ldif文件进行条目添加的文件
    例子
    ldapadd -x -D "cn=root,dc=starxing,dc=com" -w secret -f /root/test.ldif
    ldapadd -x -D "cn=root,dc=starxing,dc=com" -w secret (这样写就是在命令行添加条目)
    ldapsearch
    -x 进行简单认证
    -D 用来绑定服务器的DN
    -w 绑定DN的密码
    -b 指定要查询的根节点
    -H 制定要查询的服务器
    ldapsearch -x -D "cn=root,dc=starxing,dc=com" -w secret -b "dc=starxing,dc=com"
    使用简单认证,用 "cn=root,dc=starxing,dc=com" 进行绑定,
    要查询的根是 "dc=starxing,dc=com"。这样会把绑定的用户能访问"dc=starxing,dc=com"下的
    所有数据显示出来。
    ldapsearch -x -W -D "cn=administrator,cn=users,dc=osdn,dc=zzti,dc=edu,dc=cn" -b "cn=administrator,cn=users,dc=osdn,dc=zzti,dc=edu,dc=cn" -h troy.osdn.zzti.edu.cn
    ldapsearch -b "dc=canon-is,dc=jp" -H ldaps://192.168.0.92:636
    ldapdelete
    ldapdelete -x -D "cn=Manager,dc=test,dc=com" -w secret "uid=test1,ou=People,dc=test,dc=com"
    ldapdelete -x -D 'cn=root,dc=it,dc=com' -w secert 'uid=zyx,dc=it,dc=com'
    这样就可以删除'uid=zyx,dc=it,dc=com'记录了,应该注意一点,如果o或ou中有成员是不能删除的。
    ldappasswd
    -x 进行简单认证
    -D 用来绑定服务器的DN
    -w 绑定DN的密码
    -S 提示的输入密码
    -s pass 把密码设置为pass
    -a pass 设置old passwd为pass
    -A 提示的设置old passwd
    -H 是指要绑定的服务器
    -I 使用sasl会话方式
    #ldappasswd -x -D 'cm=root,dc=it,dc=com' -w secret 'uid=zyx,dc=it,dc=com' -S
    New password:
    Re-enter new password:
    就可以更改密码了,如果原来记录中没有密码,将会自动生成一个userPassword。
    ldapmodify
    -a 添加新的条目.缺省的是修改存在的条目.
    -C 自动追踪引用.
    -c 出错后继续执行程序并不中止.缺省情况下出错的立即停止.比如如果你的ldif 文
    件内的某个条目在数据库内并不存在,缺省情况下程序立即退出,但如果使用了该参数,程
    序忽略该错误继续执行.
    -n 用于调试到服务器的通讯.但并不实际执行搜索.服务器关闭时,返回错误;服务器
    打开时,常和-v 参数一起测试到服务器是否是一条通路.
    -v 运行在详细模块.在标准输出中打出一些比较详细的信息.比如:连接到服务器的
    ip 地址和端口号等.
    -M[M] 打开manage DSA IT 控制. -MM 把该控制设置为重要的.
    -f file 从文件内读取条目的修改信息而不是从标准输入读取.
    -x 使用简单认证.
    -D binddn 指定搜索的用户名(一般为一dn 值).
    -W 指定了该参数,系统将弹出一提示入用户的密码.它和-w 参数相对使用.
    -w bindpasswd 直接指定用户的密码. 它和-W 参数相对使用.
    -H ldapuri 指定连接到服务器uri(ip 地址和端口号,常见格式为
    ldap://hostname:port).如果使用了-H 就不能使用-h 和-p 参数.
    -h ldaphost 指定要连接的主机的名称/ip 地址.它和-p 一起使用.
    -p ldapport 指定要连接目录服务器的端口号.它和-h 一起使用.
    如果使用了-h 和-p 参数就不能使用-H 参数.
    -Z[Z] 使用StartTLS 扩展操作.如果使用-ZZ,命令强制使用StartTLS 握手成功.
    -V 启用证书认证功能,目录服务器使用客户端证书进行身份验证,必须与-ZZ 强制启用
    TLS 方式配合使用,并且匿名绑定到目录服务器.
    -e 设置客户端证书文件,例: -e cert/client.crt
    -E 设置客户端证书私钥文件,例: -E cert/client.key
    #ldapmodify -x -D "cn=root,dc=it,dc=com" -W -f modify.ldif
    将modify.ldif中的记录更新原有的记录。

  • DNS配置-BIND安装配置全过程

    下载bind,我下载的是bind-9.3.1rc1.tar.gz

    我下载的文件放在/root目录下
    进入目录解压缩
    [root@linux root]#tar xfz bind-9.3.1rc1.tar.gz
    进如刚解压出来的目录
    [root@linux root]# cd bind-9.3.1rc1
    编译配置
    [root@linux bind-9.3.1rc1]#./configure --prefix=/usr/local/named --enable-threads #--enable-threads开启多线程处理能力
    [root@linux bind-9.3.1rc1]#make
    [root@linux bind-9.3.1rc1]#make install
    进入/usr/local/named 建立etc目录
    [root@linux bind-9.3.1rc1]#cd /usr/local/named
    [root@linux named]# mkdir etc
    生成rndc控制命令的key文件
    [root@linux named]# sbin/rndc-confgen >; etc/rndc.conf
    从rndc.conf文件中提取named.conf用的key
    root@linux named]# cd etc
    [root@linux etc]# tail -10 rndc.conf | head -9 | sed s/#\ //g >; named.conf
    自动在/usr/local/named/etc 生成named,conf文件
    建立区文件目录
    [root@linux etc]# mkdir /var/named
    进入/var/named
    [root@linux etc]# cd /var/named
    建立localhost.zone文件
    [root@linux named]#vi localhost.zone
    $TTL 86400
    $ORIGIN localhost.
    @ 1D IN SOA @ root (
    42 ; serial (d. adams)
    3H ; refresh
    15M ; retry
    1W ; expiry
    1D ) ; minimum

    1D IN NS @
    1D IN A 127.0.0.1

    建立named.local文件
    [root@linux named]#vi named.local
    $TTL 86400
    @ IN SOA localhost. root.localhost. (
    1997022700 ; Serial
    28800 ; Refresh
    14400 ; Retry
    3600000 ; Expire
    86400 ) ; Minimum
    IN NS localhost.

    1 IN PTR localhost.

    dig命令直接生成named.root文件
    [root@linux named]#dig >; named.root
    建立test.com域名正向解析文件
    [root@linux named]#vi test.zone

    $ttl 1D
    @ IN SOA test.com. root.test.com. (

    1053891162
    3H
    15M
    1W
    1D )

    IN NS test.com.
    IN MX 5 test.com.
    www IN A 220.202.19.82

    建立test.com域名反向解析文件
    [root@linux named]#vi test.local
    $TTL 86400
    @ IN SOA test.com. root.test.com.(
    20031001;
    7200;
    3600;
    43200;
    86400);
    @ IN NS test.com.
    82 IN PTR dns.test.com.

    配置named.conf加如以下代码

    [root@linux etc]# vi named.conf

    options {
    directory "/var/named"; #named区文件目录
    pid-file "named.pid"; #进程id文件名
    };
    controls {
    inet 127.0.0.1 allow { localhost; } keys { rndckey; };
    };
    zone "." IN {
    type hint;
    file "named.root";
    };

    zone "localhost" IN {
    type master;
    file "localhost.zone";
    allow-update { none; };
    };

    zone "0.0.127.in-addr.arpa" IN {
    type master;
    file "named.local";
    allow-update { none; };
    };

    zone "test.com" IN {
    type master;
    file "test.zone";
    allow-update { none; };
    };

    zone "19.202.220.in-addr.arpa" IN {
    type master;
    file "test.local";
    allow-update { none; };
    };

    现在配置完了可以启动BIND了

    /usr/local/named/sbin/named -c /usr/local/named/etc/named.conf &

    只要显示
    runing表示运行成功
    测试dns
    [root@linux etc]# host 220202.19.82
    89.19.202.220.in-addr.arpa domain name pointer dns.test.com.
    如上显示表示dns反向解析正常
    [root@linux etc]# ping www.test.com
    PING www.test.com (220.202.19.82) 56(84) bytes of data.
    如上显示表示正向解析正常
    dns配置完成。

    二:

    首先说第一个文件:/etc/sysconfig/named

    这个配置文件的最后一行决定了named (即bind)的其他配置文件的路径及目录。

    默认是 /var/named

    第二个文件是:/var/named/chroot/etc/named.conf

    这个文件就是 bind 的主配置文件,有可能band装好后会没有,一会需要手工新建。

    第三个文件是:/var/named/chroot/etc/rndc.key

    该文件保存的是 MD5 的加密密钥,用于给管理员控制管理DNS服务器以及数据同步加密等等...

    相当重要,要使用其里头的信息创建 named.conf

    第四个文件是:*.zone

    啥意思? 这个是指针文件,用于存放域名的DNS记录,例如A记录,MX记录,CNAME 记录等。它的位置由 named.conf 里边的参数决定。

    好,下边就开始说各个配置文件的使用以及创建。

    第一个:/etc/sysconfig/named 如果你没有特殊爱好,留着默认好了。
    第二个:/var/named/chroot/etc/named.conf 需要手工创建。

    首先是要打开第三个文件:/var/named/chroot/etc/rndc.key

    把里头的所有内容复制,然后在相同目录下创建 named.conf,并把复制的内容粘贴进去。
    然后在插入配置内容,named.conf 完成后例子如下:
    路径:/var/named/chroot/etc/named.conf

    ##############################

    key "rndckey" {
    algorithm hmac-md5;
    secret "m3pD9wpq7QsO7l9ojGdFxxxxxxxxxxxxxxxxxxxq3eNz2tSU97l5uYD"; #
    };

    options {
    directory "."; # DNS指针配置的路径相对于 /var/named/chroot
    };

    zone "gznow.cn" IN { # DNS 指针的域名
    type master;
    file "master/gznow.zone"; # 指针路径
    allow-update{none;};
    };

    ##############################

    我们这里配的是最基本的 bind 服务,其他复杂的功能例如反向解析,分IP段解析等之类的功能就日后再说。

    按照上边的配置把 named.conf 创建后,可以着手创建 *.zone 指针

    这里以 gznow.zone 为例

    按照 named.conf 中指针路径的配置
    在 /etc/named/chroot 下创建文件夹 master
    并新建指针配置文件 gznow.zone
    路径如:/var/named/chroot/master/gznow.zone

    内容:

    ##############################

    $TTL 3600 ;
    @ IN SOA ns1.gznow.cn. admin.gznow.cn. (
    2003030400 ; Serial
    28800 ; Refresh
    14400 ; Retry
    3600000 ; Expire
    86400 ) ; Minimum

    IN NS ns1.gznow.cn.
    IN MX 5 mail.gznow.cn.
    ns1 IN A 219.136.252.253
    ns2 IN A 219.136.252.253

    @ IN A 219.136.252.253
    * IN A 219.136.252.253

    www IN A 219.136.252.253
    www IN A 203.114.253.73

    mail IN CNAME s1.someqone.com.
    img IN CNAME phlinux.someqone.com.

    ##############################

    第1行是一个TTL设定,定义区域数据文件里面的各项记录的默认TTL值为3600s
    缺少此行不影响使用,但是会出现警告信息。

    第2行是一个SOA记录的设定,"@"代表相应的域名,也就是在named.conf中设定的zone
    如在这里表示gznow.cn,IN表示后面的数据使用的是Internet标准。
    SOA的全称是"Start Of Authority",表示目前区域授权开始。
    每一个区域数据文件只能有一个SOA,不能重复,而且必须是所负责的zone中第一个"记录"。
    在SOA后面分别指定了这个区域的授权主机名称和管理者的信箱( admin.gznow.cn. )

    注意 授权主机名和管理员信箱后面都要有一个".",而且授权主机名称必须能够在DNS设置中找到一个A记录(下面会讲到)。由于"@"在区域数据文件中有其他含义,因此管理员信箱邮件地址中用"."代替"@"符号。

    接下来包含在括弧中的5组数字是作为与Slave服务器同步信息而设置的,含义如下。

    Serial:表示配置文件的修改版本,格式是年月日加上修改的次数
    每次修改这个配置文件时都应该修改这个数字
    因为Slave DNS进行信息同步时,会比较这个数值。
    如果这个数值比自身的数值大,就进行更新,否则忽略更新。

    注意 这个设置很重要,如果在修改区域数据文件后,没有更新该值,那么所做的更改就不会更新到网上的其他DNS服务器。

    refresh:用来设定Slave DNS与Master DNS进行同步的间隔时间。

    retry:设定Slave DNS在更新失败后,再进行重试的间隔时间。

    expiry:设定Slave DNS在与Master DNS同步失败后,多长时间清除对应的记录。

    Minimum:这是默认的最小TTL值,如果在前面没有指定TTL值,就以这个为基准。

    以上的数字都是以s(秒)为单位的,但也可以用H(小时)、D(天)、W(星期)来作单位。

    第8-14行,是对域名解析的具体设置,第1列表示不同的主机域名,但是省略了后面的域信息。
    例如"www"其实是www.gznow.cn,"mail"是指mail.gznow.cn。
    其他具有相同的含义。"IN"后面的指令含义说明如下。

    NS:用来定义这个主机是个域名服务器。

    MX:定义了一个邮件交换器。

    A指针:定义了一个A记录,即域名到IP的记录。

    CNAME:定义了域名的别名。

    至此,如果你服务器上开启了 iptables ,记得把 udp 53 端口打开。

    vim /etc/sysconfig/iptables 加入以下这行:

    -A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT

    然后启动 bind :service bind start 没有报错即成功!

  • RHEL6更改为CentOS源

    第一步:删除默认的yum源。命令如下

    rpm -aq | grep yum|xargs rpm -e --nodeps

    第二步:下载最新的yum安装包

    wget http://ftp.nara.wide.ad.jp/pub/Linux/centos/6/os/x86_64/Packages/python-iniparse-0.3.1-2.1.el6.noarch.rpm
    wget http://ftp.nara.wide.ad.jp/pub/Linux/centos/6/os/x86_64/Packages/yum-metadata-parser-1.1.2-16.el6.x86_64.rpm
    wget http://ftp.nara.wide.ad.jp/pub/Linux/centos/6/os/x86_64/Packages/yum-3.2.29-60.el6.centos.noarch.rpm
    wget http://ftp.nara.wide.ad.jp/pub/Linux/centos/6/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.30-30.el6.noarch.rpm

    第三步:安装yum相关软件。
    rpm -ivh python-iniparse-0.3.1-2.1.el6.noarch.rpm
    rpm -ivh yum-metadata-parser-1.1.2-16.el6.x86_64.rpm
    rpm -ivh yum-3.2.29-60.el6.centos.noarch.rpm yum-plugin-fastestmirror-1.1.30-30.el6.noarch.rpm

    第四步:更改yum源,我们使用网易的镜像源,可以去这里http://mirrors.163.com/.help/centos.html 下载最新的CentOS-Base.repo文件,然后cp到/etc/yum.repos.d/目录下,修改把文件里面的$releasever全部替换为版本号,即6 最后保存。最后把这个文件命名为rhel-source.repo,替换掉原来该目录的同名文件。

    第五步:清理yum缓存
    yum clean all
    yum makecache
    最后显示如下,更换yum源成功。

  • Mysql 主从设置

    1、主从服务器分别作以下操作:
    1.1、版本一致
    1.2、初始化表,并在后台启动mysql
    1.3、修改root的密码
    2、修改主服务器master(IP地址:192.168.88.10):
    #vi /etc/my.cnf
    [mysqld]
    log-bin=mysql-bin //[必须]启用二进制日志
    server-id=10 //[必须]服务器唯一ID,默认是1,一般取IP最后一段
    3、修改从服务器slave(IP地址:192.168.88.20):
    #vi /etc/my.cnf
    [mysqld]
    log-bin=mysql-bin //[必须]启用二进制日志
    server-id=20 //[必须]服务器唯一ID,默认是1,一般取IP最后一段
    4、重启两台服务器的mysql
    /etc/init.d/mysql restart
    5、在主服务器上建立帐户并授权slave:
    #/usr/local/mysql/bin/mysql -u root -p
    mysql>GRANT REPLICATION SLAVE ON *.* to slave@'%' identified by 'Slave@123456';   //一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.88.11,加强安全。

    6、登录主服务器的mysql,查询master的状态
    mysql>show master status;
    +------------------+----------+--------------+------------------+
    | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000005 | 511 | | |
    +------------------+----------+--------------+------------------+
    1 row in set (0.11 sec)
    注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化
    7、配置从服务器Slave:
    #/usr/local/mysql/bin/mysql -u root -p
    mysql> change master to master_host='192.168.88.10',master_user='slave',master_password='Slave@123456',master_port=3306,master_log_file='mysql-bin.000005',master_log_pos=511;
    //注意不要断开,“308”无单引号。
    Mysql>start slave; //启动从服务器复制功能
    8、检查从服务器复制功能状态:
    mysql> show slave status\G
    *************************** 1. row ***************************
    Slave_IO_State: Waiting for master to send event
    Master_Host: 192.168.88.10 //主服务器地址
    Master_User: slave //授权帐户名,尽量避免使用root

    Master_Port: 3306 //数据库端口,部分版本没有此行
    Connect_Retry: 60
    Master_Log_File: mysql-bin.000005
    Read_Master_Log_Pos: 511 
    Relay_Log_File: ddte-relay-bin.000003 //#同步读取二进制日志的位置,大于等于>=Exec_Master_Log_Pos
    Relay_Log_Pos: 251
    Relay_Master_Log_File: mysql-bin.000004
    Slave_IO_Running: Yes //此状态必须YES
    Slave_SQL_Running: Yes //此状态必须YES
    ......
    注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。

    以上操作过程,主从服务器配置完成。

  • Linux sar 命令详解

    sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等。本文主要以CentOS 6.3 x64系统为例,介绍sar命令。

    sar命令常用格式

    sar [options] [-A] [-o file] t [n]

    其中:

    t为采样间隔,n为采样次数,默认值是1;

    -o file表示将命令结果以二进制格式存放在文件中,file 是文件名。

    options 为命令行选项,sar命令常用选项如下:

    -A:所有报告的总和

    -u:输出CPU使用情况的统计信息

    -v:输出inode、文件和其他内核表的统计信息

    -d:输出每一个块设备的活动信息

    -r:输出内存和交换空间的统计信息

    -b:显示I/O和传送速率的统计信息

    -a:文件读写情况

    -c:输出进程统计信息,每秒创建的进程数

    -R:输出内存页面的统计信息

    -y:终端设备活动情况

    -w:输出系统交换活动信息

    1. CPU资源监控

    例如,每10秒采样一次,连续采样3次,观察CPU 的使用情况,并将采样结果以二进制形式存入当前目录下的文件test中,需键入如下命令:

    sar -u -o test 10 3

    屏幕显示如下:

    17:06:16 CPU %user %nice %system %iowait %steal %idle

    17:06:26 all 0.00 0.00 0.20 0.00 0.00 99.80

    17:06:36 all 0.00 0.00 0.20 0.00 0.00 99.80

    17:06:46 all 0.00 0.00 0.10 0.00 0.00 99.90

    Average: all 0.00 0.00 0.17 0.00 0.00 99.83

    输出项说明:

    CPU:all 表示统计信息为所有 CPU 的平均值。

    %user:显示在用户级别(application)运行使用 CPU 总时间的百分比。

    %nice:显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。

    %system:在核心级别(kernel)运行所使用 CPU 总时间的百分比。

    %iowait:显示用于等待I/O操作占用 CPU 总时间的百分比。

    %steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。

    %idle:显示 CPU 空闲时间占用 CPU 总时间的百分比。

    1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈

    2. 若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量

    3. 若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU 。

    如果要查看二进制文件test中的内容,需键入如下sar命令:

    sar -u -f test

    2. inode、文件和其他内核表监控

    例如,每10秒采样一次,连续采样3次,观察核心表的状态,需键入如下命令:

    sar -v 10 3

    屏幕显示如下:

    17:10:49 dentunusd file-nr inode-nr pty-nr

    17:10:59 6301 5664 12037 4

    17:11:09 6301 5664 12037 4

    17:11:19 6301 5664 12037 4

    Average: 6301 5664 12037 4

    输出项说明:

    dentunusd:目录高速缓存中未被使用的条目数量

    file-nr:文件句柄(file handle)的使用数量

    inode-nr:索引节点句柄(inode handle)的使用数量

    pty-nr:使用的pty数量

    3. 内存和交换空间监控

    例如,每10秒采样一次,连续采样3次,监控内存分页:

    sar -r 10 3

    屏幕显示如下:

    输出项说明:

    kbmemfree:这个值和free命令中的free值基本一致,所以它不包括buffer和cache的空间.

    kbmemused:这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间.

    %memused:这个值是kbmemused和内存总量(不包括swap)的一个百分比.

    kbbuffers和kbcached:这两个值就是free命令中的buffer和cache.

    kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap).

    %commit:这个值是kbcommit与内存总量(包括swap)的一个百分比.

    4. 内存分页监控

    例如,每10秒采样一次,连续采样3次,监控内存分页:

    sar -B 10 3

    屏幕显示如下:

    输出项说明:

    pgpgin/s:表示每秒从磁盘或SWAP置换到内存的字节数(KB)

    pgpgout/s:表示每秒从内存置换到磁盘或SWAP的字节数(KB)

    fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)

    majflt/s:每秒钟产生的主缺页数.

    pgfree/s:每秒被放入空闲队列中的页个数

    pgscank/s:每秒被kswapd扫描的页个数

    pgscand/s:每秒直接被扫描的页个数

    pgsteal/s:每秒钟从cache中被清除来满足内存需要的页个数

    %vmeff:每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比

    5. I/O和传送速率监控

    例如,每10秒采样一次,连续采样3次,报告缓冲区的使用情况,需键入如下命令:

    sar -b 10 3

    屏幕显示如下:

    18:51:05 tps rtps wtps bread/s bwrtn/s

    18:51:15 0.00 0.00 0.00 0.00 0.00

    18:51:25 1.92 0.00 1.92 0.00 22.65

    18:51:35 0.00 0.00 0.00 0.00 0.00

    Average: 0.64 0.00 0.64 0.00 7.59

    输出项说明:

    tps:每秒钟物理设备的 I/O 传输总量

    rtps:每秒钟从物理设备读入的数据总量

    wtps:每秒钟向物理设备写入的数据总量

    bread/s:每秒钟从物理设备读入的数据量,单位为 块/s

    bwrtn/s:每秒钟向物理设备写入的数据量,单位为 块/s

    6. 进程队列长度和平均负载状态监控

    例如,每10秒采样一次,连续采样3次,监控进程队列长度和平均负载状态:

    sar -q 10 3

    屏幕显示如下:

    19:25:50 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15

    19:26:00 0 259 0.00 0.00 0.00

    19:26:10 0 259 0.00 0.00 0.00

    19:26:20 0 259 0.00 0.00 0.00

    Average: 0 259 0.00 0.00 0.00

    输出项说明:

    runq-sz:运行队列的长度(等待运行的进程数)

    plist-sz:进程列表中进程(processes)和线程(threads)的数量

    ldavg-1:最后1分钟的系统平均负载(System load average)

    ldavg-5:过去5分钟的系统平均负载

    ldavg-15:过去15分钟的系统平均负载

    7. 系统交换活动信息监控

    例如,每10秒采样一次,连续采样3次,监控系统交换活动信息:

    sar - W 10 3

    屏幕显示如下:

    19:39:50 pswpin/s pswpout/s

    19:40:00 0.00 0.00

    19:40:10 0.00 0.00

    19:40:20 0.00 0.00

    Average: 0.00 0.00

    输出项说明:

    pswpin/s:每秒系统换入的交换页面(swap page)数量

    pswpout/s:每秒系统换出的交换页面(swap page)数量

    8. 设备使用情况监控

    例如,每10秒采样一次,连续采样3次,报告设备使用情况,需键入如下命令:

    # sar -d 10 3 –p

    屏幕显示如下:

    17:45:54 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util

    17:46:04 scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

    17:46:04 sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

    17:46:04 vg_livedvd-lv_root 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

    17:46:04 vg_livedvd-lv_swap 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

    其中:

    参数-p可以打印出sda,hdc等磁盘设备名称,如果不用参数-p,设备节点则有可能是dev8-0,dev22-0

    tps:每秒从物理磁盘I/O的次数.多个逻辑请求会被合并为一个I/O磁盘请求,一次传输的大小是不确定的.

    rd_sec/s:每秒读扇区的次数.

    wr_sec/s:每秒写扇区的次数.

    avgrq-sz:平均每次设备I/O操作的数据大小(扇区).

    avgqu-sz:磁盘请求队列的平均长度.

    await:从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1秒=1000毫秒).

    svctm:系统处理每次请求的平均时间,不包括在请求队列中消耗的时间.

    %util:I/O请求占CPU的百分比,比率越大,说明越饱和.

    1. avgqu-sz 的值较低时,设备的利用率较高。

    2. 当%util的值接近 1% 时,表示设备带宽已经占满。

    要判断系统瓶颈问题,有时需几个 sar 命令选项结合起来

    怀疑CPU存在瓶颈,可用 sar -u 和 sar -q 等来查看

    怀疑内存存在瓶颈,可用 sar -B、sar -r 和 sar -W 等来查看

    怀疑I/O存在瓶颈,可用 sar -b、sar -u 和 sar -d 等来查看

    默认监控: sar 1 1 // CPU和IOWAIT统计状态
    (1) sar -b 1 1 // IO传送速率
    (2) sar -B 1 1 // 页交换速率
    (3) sar -c 1 1 // 进程创建的速率
    (4) sar -d 1 1 // 块设备的活跃信息
    (5) sar -n DEV 1 1 // 网路设备的状态信息
    (6) sar -n SOCK 1 1 // SOCK的使用情况
    (7) sar -n ALL 1 1 // 所有的网络状态信息
    (8) sar -P ALL 1 1 // 每颗CPU的使用状态信息和IOWAIT统计状态
    (9) sar -q 1 1 // 队列的长度(等待运行的进程数)和负载的状态
    (10) sar -r 1 1 // 内存和swap空间使用情况
    (11) sar -R 1 1 // 内存的统计信息(内存页的分配和释放、系统每秒作为BUFFER使用内存页、每秒被cache到的内存页)
    (12) sar -u 1 1 // CPU的使用情况和IOWAIT信息(同默认监控)
    (13) sar -v 1 1 // inode, file and other kernel tablesd的状态信息
    (14) sar -w 1 1 // 每秒上下文交换的数目
    (15) sar -W 1 1 // SWAP交换的统计信息(监控状态同iostat 的si so)
    (16) sar -x 2906 1 1 // 显示指定进程(2906)的统计信息,信息包括:进程造成的错误、用户级和系统级用户CPU的占用情况、运行在哪颗CPU上
    (17) sar -y 1 1 // TTY设备的活动状态
    (18) 将输出到文件(-o)和读取记录信息(-f)

  • Oracle 安装中文字符

    一、故障问题
    打开http://ip:1158/em时,看到如下的显示,其中中文字符部分是乱码:

    二、解决问题

    1.安装字体库
    yum -y install fontconfig

    2.上传字体
    在/usr/shared/fonts目录下新建一个目录chinese,
    打开c盘下的Windows/Fonts目录,上传至/usr/shared/fonts/chinese目录下

    3.修改chinese目录的权限
    chmod -R 755 /usr/share/fonts/chinese

    4.安装ttmkfdir来搜索目录中所有的字体信息,并汇总生成fonts.scale文件,输入命令:
    yum -y install ttmkfdir

    执行ttmkfdir命令即可:
    ttmkfdir -e /usr/share/X11/fonts/encodings/encodings.dir

    5.修改字体配置文件
    vi /etc/fonts/fonts.conf

    1

    刷新内存中的字体缓存

    fc-cache

    6、删除Cache下的gif文件
    em里面会用到这些图片:
    $ cd $ORACLE_HOME/oc4j/j2ee/oc4j_applications/\
    applications/em/em/cabo/images/cache/zhs/
    $ ls *.gif
    $ rm *.gif

    7、安装中文包:
    #yum -y groupinstall chinese-support 安装所有与中文支持相关的包

    8、修改字符编码配置文件
    # vi /etc/sysconfig/i18n
    修改后内容如下:
    LANG="zh_CN.UTF-8"
    SUPPORTED="zh_CN:zh:en_US.UTF-8:en_US:en:zh_CN.GB18030"
    SYSFONT="latarcyrheb-sun16"

    ※ 注意不要搞错目录,修改的是中文环境的。
    9、重新启动EM服务
    $ emctl stop dbconsole
    $ emctl start dbconsole 

  • Linux安装AWStats业务数据分析工具

    Awstats是一个非常简洁而且强大的统计工具。它可以统计您站点的如下信息:
    1:访问量,访问次数,页面浏览量,点击数,数据流量等精确到每月、每日、每小时的数据
    2:访问者国家、访问者IP、操作系统、浏览器等
    3:Robots/Spiders的统计
    4:纺客持续时间
    5:对不同Files type 的统计信息
    6:Pages-URL的统计
    7:其它信息(搜索关键字等等)

    一、安装awstats

    1. YUM安装方式:yum install awstats mod_perl  -y

    2.源码安装方式:

    下载地址:http://www.awstats.org/

    # tar -zxvf awstats-7.3.tar.gz

    # mv awstats-7.3/ awstats 

    # mkdir /etc/awstats

    # mkdir /var/lib/awstats

    # chmod -R 777 awstats/

    # cd /usr/local/awstats/tools/

    # perl awstats_configure.pl

    your web site ,virtual server or profile name: 你的网站服务器名或文件名 > /home/awstats/reports/logs.html

    directory path to store config file(s) (enter for default): 目录路径存储配置文件(填写默认值) > /etc/awstats

    3. 生成报告,执行定时任务

    修改配置文件
    cp /etc/awstats/awstats.localhost.localdomain.conf /etc/awstats/awstats.www.xxx.com.conf

    编辑内容
    vi /etc/awstats/awstats.www.xxx.com.conf

    修改内容如下
    LogFile=”/home/awstats/logs/access.log”
    LogFormat=4
    SiteDomain="www.xxx.com”
    HostAliases="www.xxx.com localhost 127.0.0.1"
    BuildHistoryFormat=xml
    lang=cn

    生成报告
    /usr/share/awstats/wwwroot/cgi-bin/awstats.pl month=9 year=2021 -config=www.xx.com -lang=cn -update -output >/home/awstats/reports/9.html

    注意,重新打包先清理临时文件:/var/lib/awstats/*

    4.apache 添加配置
    Alias /awstatsclasses "/usr/share/awstats/wwwroot/classes/"
    Alias /awstatscss "/usr/share/awstats/wwwroot/css/"
    Alias /awstatsicons "/usr/share/awstats/wwwroot/icon/"
    ScriptAlias /awstats/ "/usr/share/awstats/wwwroot/cgi-bin/"

    <Directory "/usr/share/awstats/wwwroot">
            Options Indexes FollowSymLinks
            DirectoryIndex index.html
            AllowOverride ALL
            Order Deny,Allow
            Allow from all
            Require all granted
        </Directory>

  • Mysql 的日志的设置与操作

    一、mysql有以下几种日志:
    错误日志: -log-err
    查询日志: -log
    慢查询日志: -log-slow-queries
    更新日志: -log-update
    二进制日志: -log-bin
    默 认情况下,所有日志创建于mysqld数据目录中。通过刷新日志,你可以强制 mysqld来关闭和重新打开日志文件(或者在某些情况下切换到一个新的日志)。当你执行一个FLUSH LOGS语句或执行mysqladmin flush-logs或mysqladmin refresh时,出现日志刷新

    1. 错误日志
    用--log- error[=file_name]选项来指定mysqld保存错误日志文件的位置。如果没有给定file_name值,mysqld使用错误日志名 host_name.err 并在数据目录中写入日志文件。如果你执行FLUSH LOGS,错误日志用-old重新命名后缀并且mysqld创建一个新的空日志文件。(如果未给出--log-error选项,则不会重新命名)。
    如果不指定--log-error,或者(在Windows中)如果你使用--console选项,错误被写入标准错误输出stderr。通常标准输出为你的终端。
    2. 通用查询日志 
    用--log[=file_name]或-l [file_name]选项启动它。如果没有给定file_name的值,默认名是host_name.log。
    3. 慢速查询日志 
    用--log-slow-queries[=file_name]选项启动时,mysqld 写一个包含所有执行时间超过long_query_time秒的SQL语句的日志文件.如果没有给出file_name值,默认未主机名,后缀为 -slow.log。如果给出了文件名,但不是绝对路径名,文件则写入数据目录。
    3. 更新日志 
    用--log-update[=file_name]选项启动,不推荐使用.

    二、是否启用了日志
    mysql> SHOW  GLOBAL VARIABLES LIKE '%log%';
    怎样知道当前的日志
    mysql> show master status;
    顯示二進制日志數目
    mysql> show master logs;
    看二进制日志文件用mysqlbinlog
    shell>mysqlbinlog mail-bin.000001
    或者shell>mysqlbinlog mail-bin.000001 | tail

    三、在配置文件中指定log的輸出位置.
    Windows:Windows 的配置文件为 my.ini,一般在 MySQL 的安装目录下或者 c:\Windows 下。
    Linux:Linux 的配置文件为 my.cnf ,一般在 /etc 下。
    在linux下:
    Sql代码
    # 在[mysqld] 中輸入
    #log
    log-error=/home/mysql/error.log
    general_log = on
    general_log_file=/home/mysql/mysql.log
    slow_query_log = on
    long_query_time=10
    slow-query-log-file=/home/mysql/slowquery.log

    windows下:
    Sql代码
    # 在[mysqld] 中輸入
    #log
    log-error="E:/mysql/logs/error.log"
    log="E:/mysql/logs/mysql.log"
    long_query_time=10
    log-slow-queries= "E:/mysql/logs/slowquery.log"

    四、删除MySQL log bin 日志操作记录

    1.SHOW MASTER LOGS;
    2.RESET MASTER;
    3.service mysql stop 
    4.关闭4个参数。
    #log-bin=mysql-bin
    #log-slow-queries=slowquery.log
    #long_query_time=3
    #binlog_format=mixed
    5.service mysql start

  • Oracle数据库查看命令

    1. 查看processes和sessions参数
    show parameter processes;
    show parameter sessions;

    2. 修改processes和sessions值
    alter system set processes=1500 scope=spfile;
    alter system set sessions=1700 scope=spfile;

    3. 修改processes和sessions值必须重启oracle服务器才能生效
    ORACLE的连接数(sessions)与其参数文件中的进程数(process)有关,它们的关系如下:
    sessions=(1.1*process+5)

    4、查询oracle的连接数
    select count(*) from v$session;

    select count(*) from v$process;

    5、查询oracle的并发连接数
    select count(*) from v$session where status='ACTIVE';

    6、查看不同用户的连接数
    select username,count(username) from v$session where username is not null group by username;

    7、查看所有用户:
    select * from all_users;

    8、查看用户或角色系统权限(直接赋值给用户或角色的系统权限):
    select * from dba_sys_privs;
    select * from user_sys_privs;

    9、查看角色(只能查看登陆用户拥有的角色)所包含的权限
    select * from role_sys_privs;

    10、查看用户对象权限:
    select * from dba_tab_privs;
    select * from all_tab_privs;
    select * from user_tab_privs;

    11、查看所有角色:
    select * from dba_roles;

    12、查看用户或角色所拥有的角色:
    select * from dba_role_privs;
    select * from user_role_privs;

    13、查看哪些用户有sysdba或sysoper系统权限(查询时需要相应权限)
    select * from V$PWFILE_USERS;

    14、给导入用户赋予dba 、imp权限 
    grant sysdba to user;
    grant imp_full_database to user;

     15、查看scott用户的默认表空间、临时表空间

    select username,default_tablespace,temporary_tablespace
    from dba_users
    where username = 'SCOTT';

    16、查看scott用户的系统权限

    select username,privilege,admin_option 
    from user_sys_privs 
    where username = 'SCOTT';

    17、查看赋予scott用户的对象权限

    select grantee,owner, table_name, t.grantor, t.privilege, t.grantable, t.hierarchy
    from dba_tab_privs t
    where t.grantee = 'SCOTT' ;

    18、查看授予了scott的角色权限

    select t.grantee,t.granted_role, t.admin_option, t.default_role
    from dba_role_privs t
    where t.grantee = 'SCOTT';

    19、查看scott用户使用了哪些表空间

    select t.table_name, t.tablespace_name
    from dba_all_tables t
    where t.owner = 'SCOTT' ;

    20、查看当前用户拥有的权限

    select t.privilege
    from session_privs t

    21、查看角色(resource)权限的系统权限

    select *
    from role_sys_privs t1
    where t1.role = 'RESOURCE'

    22、查看角色(DBA)被赋予的角色权限

    select *
    from role_role_privs t
    where t.role = 'DBA'

    23、查看角色(DBA)被赋予的对象权限

    select *
    from role_tab_privs t1
    where t1.role = 'DBA'

    24、查看赋给用户(GDYXHD)对对象操作的一些权限

    select *
    from table_privileges t1
    where t1.grantee = 'GDYXHD'

     

    25、查看数据文件
    SQL> select * from v$datafile; 

    26、 查看控制文件

    SQL> select * from v$controlfile;
    27、查看日志文件

    SQL> select * from v$logfile;

  • Linux下设置ssh无密码登录

    主机A:10.0.5.199

    主机B:10.0.5.198

    需要配置主机A无密码登录主机A,主机B

    先确保所有主机的防火墙处于关闭状态。

    在主机A上执行如下:

     1. $cd ~/.ssh

     2. $ssh-keygen -t rsa --------------------然后一直按回车键,就会按照默认的选项将生成的密钥保存在.ssh/id_rsa文件中。

     3. $cp id_rsa.pub authorized_keys

    这步完成后,正常情况下就可以无密码登录本机了,即ssh localhost,无需输入密码。

     4. $scp authorized_keys summer@10.0.5.198:/home/summer/.ssh ------把刚刚产生的authorized_keys文件拷一份到主机B上.  

    进入主机B的.ssh目录,改变authorized_keys文件的许可权限。

    5. $chmod 600 authorized_keys

    6. $chmod 700 .ssh/

    正常情况下上面几步执行完成后,从主机A所在机器向主机A、主机B所在机器发起ssh连接,只有在第一次登录时需要输入密码,以后则不需要。

  • Linux下使用rsync实现目录同步

    一、安装rsync软件

    https://rsync.samba.org/download.html

    yum install xxhash* zstd* libzstd* lz4* -y

    # tar -zxvf rsync-3.1.1pre1.tar.gz
    # ./configure
    # make && make install

    #echo "/usr/local/lib/">>/etc/ld.so.conf

    #/sbin/ldconfig

    二、Linux主服务器配置编辑主要配置文件/etc/rsyncd.conf (不存在则自己创建)
    vi /etc/rsyncd.conf
    uid = root
    gid = root
    use chroot = no
    chroot max connections = 4
    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsyncd.lock
    log file = /var/log/rsyncd.log
    [ file ]
    path = /home/file
    ignore errors
    read only = no
    list = false
    hosts allow = 192.168.1.101,192.168.2.0/24
    hosts deny = 0.0.0.0/32
    auth users = backup
    secrets file = /etc/backup.pass

    编辑服务器的密码文件 /etc/backup.pass,文件只能有可读权限 400
    vi /etc/backup.pass
    backup:123456
    chmod 400 /etc/backup.pass

    启动rsync
    /usr/local/bin/rsync --daemon --config=/etc/rsyncd.conf

    指定端口加:--port 8730

    /etc/rc.local 增加可自动启动

    三、Linux从服务器配置
    创建rsync连接时的密码文件/etc/rsync_client.pass,文件权限为只读400
    vi /etc/rsync_client.pass
    123456
    chmod 400 /etc/rsync_client.pass

    使用 rsync 命令连接服务器,实现文件同步

    MAILTO=""
    * * * * * /usr/local/bin/rsync -vzrtopg --progress --delete --password-file=/etc/rsync_client.pass backup@192.168.1.100::file /home/file

    指定端口加:--port 8730

    参数说明
    -vzrtopg 说明
    v是verbose,
    z是压缩,
    r是recursive,
    topg都是保持文件原有属性如属主、时间的参数
    —-progress
    是指显示出详细的进度情况
    –delete
    是指如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致
    –exclude=”*.tmp” 不包含某些文件
    –execlude-from= 排除不需要同步的目录
    --exclude-from=/home/excludelist/excludelist
    /home/excludelist/excludelist 
    ROOT/WEB-INF/logs/
    ROOT/export/
    ROOT/WEB-INF/imagecache/
    ROOT/WEB-INF/jsp/
    ROOT/WEB-INF/publish-queue/

    windows从服务器配置

    https://www.itefix.net/cwrsync

    双击 cwrsync[.cmd]进行安装

    打开后,将cmd的路径切换到cwrysnc的安装目录的bin目录下,作为工作目录

    rsync.exe  -vzrtopg --progress --delete --password-file=rsync_client.pass backup@211.66.86.129::file /new

    定时更新

    https://www.cnblogs.com/janas/p/3321087.html

    四、inotify实时同步(主从端依次操作)

    yum install epel-release -y
    yum install inotify-tools -y

    vi /etc/sysctl.conf
    fs.inotify.max_queued_events = 16384
    fs.inotify.max_user_instances = 1024
    fs.inotify.max_user_watches = 1048576

    sysctl -p

    监控脚本
    vi /home/inotify.sh

    #!/bin/bash

    INOTIFY_CMD="inotifywait -mrq -e create,delete,modify,attrib,move,close_write /home/wpcms/wp-content/"
    RSYNC_CMD="/usr/local/bin/rsync -vzrtopg --progress --delete --exclude="*.swp" --exclude="*.swx" --password-file=/etc/rsync_client.pass /home/wpcms/wp-content/ backup@10.168.4.200::content"
    #读取输出的监控记
    $INOTIFY_CMD | while read DIRECTORY EVENT FILE
    do
    #如果rsync未在执行,则立即启动
    if [ $(pgrep rsync | wc -l) -ge 1 ]; then
    $RSYNC_CMD
    fi
    done

    加入到自动启动

    echo '/home/inotify.sh >/dev/null 2>&1 &' >> /etc/rc.local

    再重复设置另一端就能实现双向实时同步

  • 解决Oracle Temp01.dbf不断变大的问题

    1、首先查看当前的数据库默认表空间:

    SQL>select * from database_properties where property_name='DEFAULT_TEMP_TABLESPACE';

    确认当前的临时表空间为TEMP

    2、查看目前临时表空间的大小:

    SQL>select file_name,tablespace_name,bytes/1024/1024 "MB",autoextensible from dba_temp_files;

    3、创建新的临时表空间:(先在其他的磁盘空间借用一下空间)

    SQL> create temporary tablespace temp02 tempfile '/home/oracle/temp02.dbf' size 1024M;

    4、把新建的临时表空间却换成数据库的默认临时表空间

    SQL> alter database default temporary tablespace temp02;

    5、确认目前数据库的默认临时表空间

    SQL>select * from database_properties where property_name='DEFAULT_TEMP_TABLESPACE';

    确认temp02为当前的数据库默认表空间

    6、删除temp临时表空间

    SQL> drop tablespace temp including contents and datafiles;

    7、现在temp02临时表空间占据了别人的磁盘空间,需要重新把临时表空间建立在原来的位置,重新建立temp临时表空间

    SQL>create temporary tablespace temp tempfile '/home/oracle/temp01.dbf' size 8192M autoextend on maxsize 15G;

    查看新建的temp临时表空间是否正确:

    SQL>select file_name,tablespace_name,bytes/1024/1024,maxbytes/1024/1024,autoextensible from dba_temp_files;

    8、把新建的temp临时表空间却换成数据库的默认临时表空间

    SQL> alter database default temporary tablespace temp;

    9、确认目前数据库的默认临时表空间

    SQL>select * from database_properties where property_name='DEFAULT_TEMP_TABLESPACE';

    确认temp为当前的数据库默认表空间

    10、目前把原来的temp临时表空间变成了512M,把剩余的磁盘空间空了出来,temp02临时表空间就没有用了,删除temp02临时表空间

    SQL> drop tablespace temp02 including contents and datafiles;

  • Linux 安装 PHP 详细过程

    Linux 服务器部署时,需要按照一定的部署顺序,即:
    
    系统环境初始化 -> Apache/Nginx、MySQL、PHP 程序包下载 -> Apache/Nginx、MySQL、PHP 安装
    
    一、系统环境初始化
    1、检查系统是否正常
    more /var/log/messages(检查有无系统级错误信息)
    dmesg (检查硬件设备是否有错误信息)
    cat /proc/cpuinfo (检查 CPU 频率是否正常)
    top (按 1 检测 CPU 核数是否正常,内存大小是否正常)
    ifconfig(检查网卡设置是否正确)
    ping www.qq.com(检查网络是否正常)
    
    2、关闭不需要的服务
    执行 ntsysv 命令:
    ntsysv
    在服务设置界面,设置各项服务的开关。以下仅列出需要启动的服务,未列出的服务一律推荐关闭:
    
    iptables
    ip6tables
    crond
    irqbalance
    microcode_ctl
    network
    messagebus
    kudzu 
    sendmail
    sshd
    syslog
    关闭 SElinux ,关闭方法如下:
    修改 /etc/selinux/config 文件中的 SELINUX= 为 disabled。
    
    3、使用 yum 程序安装所需开发包(以下为标准的 RPM 包名称)
    yum -y install  openssl openssl-devel pcre pcre-devel libpng libpng-devel libjpeg-6b libjpeg-devel-6b freetype freetype-devel gd gd-devel zlib zlib-devel bzip2 bzip2-devel libXpm libXpm-devel ncurses ncurses-devel mcrypt libmcrypt libmcrypt-devel libxml2 libxml2-devel curl curl-devel libcurl libcurl-devel libjpeg libjpeg-devel gmp gmp-devel zip libzip libzip-devel sqlite sqlite-devel readline readline-devel libxslt libxslt-devel ntp make fontconfig-devel libtiff-devel libevent-devel gcc gcc-c++ flex bison imake autoconf automake screen sysstat php-gd gdbm-devel  glib2 glib2-devel libdb4-devel libicu-devel libmemcached-devel xmlrpc-c xmlrpc-c-devel glibc glibc-devel systemd-devel openjpeg-devel epel* oniguruma*
    
    4、下载软件包
    http://www.gnu.org/software/libiconv/
    https://www.php.net/downloads.php
    
    二、编译安装环境
    1、安装 MySQL
    2、安装 Apache
    3、编译安装 PHP 所需的支持库
    
    # tar -zxvf libiconv-1.16.tar.gz
    # cd libiconv-1.16
    #./configure
    #make && make install
    
    4、目前发现centos正常安装php,会出现curl是nss而不是openssl,导致wordpress不能后台直接更新升级版本,需要重新编译安装curl
    下载地址:https://curl.se/download/curl-8.6.0.tar.gz
    # tar xvzf curl-8.6.0.tar.gz
    # cd curl-8.6.0
    # ./configure --prefix=/usr/local/curl/ --without-nss --with-ssl
    # make && make install
    备份原先系统上的默认的curl命令:
    # mv /usr/bin/curl /usr/bin/curl.bak
    # mv /usr/bin/curl-config /usr/bin/curl-config.bak
    然后做一个新的curl软链:
    # ln -s /usr/local/curl/bin/curl /usr/bin/curl
    # cp /usr/local/curl/bin/curl-config /usr/bin/curl-config
    # echo "/usr/local/lib" >> /etc/ld.so.conf
    # ldconfig
    执行 curl --version 看看是否是openssl的版本
    
    5、编译安装PHP
    # tar -zxvf php-7.4.24.tar.gz
    # cd php-7.4.24
    
    #./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=apache --with-fpm-group=apache --enable-shared --enable-debug --enable-soap --enable-bcmath --enable-calendar --enable-dom --enable-exif --enable-fileinfo --enable-filter --enable-ftp --enable-gd-jis-conv --enable-mbstring --enable-mbregex --enable-pdo --enable-session --enable-shmop --enable-simplexml --enable-sockets --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-mysqlnd-compression-support --enable-gd --enable-opcache --enable-xml --with-sqlite3 --with-iconv --with-bz2 --with-curl=/usr/local/curl --with-cdb --with-openssl --with-openssl-dir=/usr/local/openssl/bin --with-jpeg --with-freetype --with-xpm --with-gettext --with-mhash --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-zlib --with-zlib-dir --with-pdo-sqlite --with-readline --with-xsl --with-pear --with-gmp --with-apxs2=/usr/local/apache2/bin/apxs --with-iconv=/usr/local
    
    出现configure: WARNING: unrecognized options: 应该是编译的这些参数已经自带,不需要再编译了,也有可能是编译写法不对(具体可查./configure --help)
    
    # OpenSSL版本太低,升级OpenSSL,直接把它升级为最新版本
    # 重新编译
    export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/openssl/lib64/pkgconfig
    # 重新编译参数configure
    
    #make ZEND_EXTRA_LIBS='-liconv'
    
    # make install
    
    # ./libtool --finish /usr/local/php/lib/
    
    # mkdir /usr/local/php/etc
    
    # cp php.ini-development /usr/local/php/etc/php.ini
    
    6、配置 httpd.conf 让apache支持PHP:
    
    # vi /usr/local/apache2/conf/httpd.conf
    
      找到 AddType application/x-gzip .gz .tgz 在其下添加如下内容
    
      AddType application/x-httpd-php .php (.前面有空格)
    
      AddType application/x-httpd-php-source .phps (.前面有空格)
    
    7、安装pear模块
    
    # /usr/local/php/bin/php go-pear.phar
    
    通过pear来安装PHP_PEAR_DB库
    
     # /usr/local/php/bin/pear install DB-1.7.14.tgz
    
    8、查看确认 LAMP 环境信息、提升 PHP 安全性
    
    保存以下内容为 info.php ,检查 phpinfo 中的各项信息是否正确。
    <?php
    phpinfo();
    ?>
    
    9.安装拓展库 例如GD库
    解压包下进入ext/gd目录
    #cd /home/soft/php-7.4.6/ext/gd
    #/usr/local/php/bin/phpize (需要把相关插件安装好)
    #./configure --with-php-config=/usr/local/php/bin/php-config
    #make&make install
    
    安装好后在php.ini里开放GD库
    #vi /usr/local/php/etc/php.ini
    在该文件打开extension=gd.so
  • Linux安装oracle 10G详细过程

    一、安装Oracle前的系统准备工作

    1.检查需要的软件包

    yum install setarch* make* glibc* glibc*i686*  libaio* compat-libstdc* compat-gcc* compat-gcc-34-c* gcc* libXp* openmotif* compat-db*  libXp.i686 libXp-devel.i686 xhost + libXtst.x86_64 libXtst.i686 libXt.i686

    2.修改Linux发行版本信息

    # vi /etc/redhat-release

    把CentOS release 6.4 (Final) 改为:redhat-4

    3.修改系统内核参数

    # vi /etc/sysctl.conf

    kernel.shmmax = 68719476736

    kernel.shmall = 4294967296

    kernel.shmmni = 4096

    kernel.sem = 250 32000 100 128

    fs.file-max = 65536

    net.ipv4.ip_local_port_range = 1024 65000

    net.core.rmem_default=4194304

    net.core.rmem_max=4194304

    net.core.wmem_default=4194304

    net.core.wmem_max=4194304

    # /sbin/sysctl -p

    4.创建Oracle用户、组、安装目录

    # groupadd oinstall

    # groupadd dba

    # useradd -g oinstall -G dba oracle

    # passwd oracle

    5.添加以下内容到/etc/security/limits.conf

    # vi /etc/security/limits.conf

    * soft nproc 65536
    * hard nproc 65536
    * soft nofile 65536
    * hard nofile 65536

    6.添加以下内容到/etc/pam.d/login

    # vi /etc/pam.d/login

    session required /lib/security/pam_limits.so 
    session required pam_limits.so

    7.添加以下内容到/etc/profile

    # vi /etc/profile

    if [ $USER = "oracle" ]; then 
    if [ $SHELL = "/bin/ksh" ]; then 
    ulimit -p 16384 
    ulimit -n 65535
    else 
    ulimit -u 16384 -n 65535
    fi 
    fi

    8.配置Linux主机

    检查/etc/hosts文件中是否有localhost的记录(指向127.0.0.1即可),若没有的话,在后面配置Oracle监听的时候会出现一些问题,导致无法启动监听,在此手工添加此记录即可

    9.配置oracle用户环境变量

    # su - oracle

    $ vi .bash_profile

    export TMP=/home/oracle/tmp

    export TMPDIR=$TMP

    export ORACLE_BASE=/home/oracle

    export ORACLE_SID=erp

    export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db

    export PATH=/usr/sbin:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin:$ORACLE_HOME/bin:$ORACLE_BASE/common/oracle/bin:$PATH 

    export LD_LIBARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH

    export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/network/jlib:$CLASSPATH

    export NLS_LANG="AMERICAN_AMERICA.AL32UTF8"

    PATH=$PATH:$HOME/bin

    二、安装Oracle

    1.解压缩安装文件

    # zcat 10201_database_linux_x86_64.cpio.gz |cpio -idmv

    或者

    # gunzip 10201_database_linux_x86_64.cpio.gz 解压出10201_database_linux_x86_64.cpio文件然后再 # cpio -idvm  < 10201_database_linux_x86_64.cpio

    # chown -R oracle:oinstall database/

    2.安装Xmanager Enterprise 4

    启动Xmanager - Passive

    3. 用oracle帐户进入安装文件所在目录,执行如下命令即可根据界面操作:

    # export DISPLAY=你的IP地址:0.0 
    $ ./runInstaller

    4.安装进度大约到65%时会有错误提示:
    Error in invoking target 'collector' of makefile '/opt/oracle/102/sysman/lib/ins_emdb.mk'.

    这是oracle安装程序的一个bug,可以忽略此错误继续安装,对系统没什么影响。

    5.会遇到错误提示:

    ORA-27125:unable to create shared memory segment

    解决:

    确定安装oracle所使用的用户组

    # id oracle

    可以看到oracle组dba id 为501。

    修改内核参数

    # vi /etc/sysctl.conf

    vm.hugetlb_shm_group = 501

    # sysctl -p 

  • 比尔盖茨发呼吁:警惕人工智能

    斯坦福大学研究的“超级机器狗”,具备强大的负重奔跑能力,能在未来战场或者急救现场担任运输任务。

    很多业界领袖和学者都担心人工智能未来会制造灾难,其中包括著名物理学家史蒂芬·霍金、互联网创新者及企业领袖埃隆·马斯科,现在最新加入行列的还有微软创始人比尔·盖茨。

    在一个互联网上进行的名人问答环节中,对人工智能未来会否自行思考进化并给人类带来灾难这个问题,盖茨的回答是:“我属于对超级人工智能充满担忧的阵营。如果机器能替代人类做事但没有发展为超级智能,此时只要管理好这些机器,善于利用似乎没有太大危险。但是,在几十年的发展之后,人工智能很可能强大到需要警惕的阶段。”

    埃隆·马斯科是私营火箭公司SpaceX的CEO,同时也是电动汽车特斯拉的创始人,他并非人工智能的专家,却也对未来充满忧虑。同样担心的还有数百名科学家、教授和企业精英,这类担忧者的名单正一天天增加。今年3月初,数百名专家在一封公开信上联合签名,呼吁各政府和国际社会对人工智能的研究进行合理监管,确保最前沿的研究不会失控,对人类造成毁灭性危害。

    盖茨说:“在这一点上我完全同意马斯科和其他人,而且很不理解为何有人对此会完全不担心。”

    这些名人担心的原因是:人工智能发展太快,不再是仅存在于科幻创造中。

    在小说和电影里,人工智能通常被描述成变成大坏蛋的好创意,《TheMatrix》三部曲中,机器人视人类是敌对的存在,最终奴役人类并通过“食用”人身体产生电力而维持存在;《终结者》系列电影里,在电脑系统开始出现感情后,它发动了一场耗时几年的战争,制造跟人类类似的机器人去杀死人类。电影《2001:宇宙奥德赛》中的机器人HAL9000已经具有强大的情感和认知能力,是未来超级电脑机器人的模型,它的说话腔调、它的语录被年轻人们拥护、模仿、流传,成为流行文化代表。

    在现实中,苹果手机上的语音对话系统“Suri”现在看上去还有点笨,但是人工智能整体正变得越来越聪明,而且研究者们试图让人工智能从我们日常使用的、各种相互连接的电子设备中深挖每一点有用信息和数据。IBM开发的Watson超级电脑已经不再局限于顶级游戏玩家,现在它还能进行医疗研究和诊断。在Google的“阿法狗”开始征战世界围棋顶尖选手之前几天,研究者们宣布一个新的电脑程序足以击败世界上最优秀的得州扑克选手。

    是否我们现在就要开始担心?目前情况还不至于让我们忧虑重重,但世界领袖们倾向于设想最糟糕的情况。马斯科认为,发展人工智能是在“召唤魔鬼”,并表示将投资于太空设置,监控人工智能。霍金曾在2014年写道:“关于人工智能的短期影响在于人类能否控制机器,而长期影响则在于机器是否能被控制?”

    不管会否毁灭地球甚至是宇宙,人工智能必定要改变我们的生活,而且改变的速度是超级加速度,未来10年的变化很可能超过之前50年,未来20年的变化很可能超过之前500年。我们的工作被替代,生活却变得更方便,我们的隐私难以保障,但医疗健康更有保障,我们生活在人工智能爆炸性质变的时代,不管前途如何,一切都值得期待。