# Linux

# Linux常用系统命令

# 系统

# uname -a               # 查看内核/操作系统/CPU信息
# head -n 1 /etc/issue   # 查看操作系统版本
# cat /proc/cpuinfo      # 查看CPU信息
# hostname               # 查看计算机名
# lspci -tv              # 列出所有PCI设备
# lsusb -tv              # 列出所有USB设备
# lsmod                  # 列出加载的内核模块
# env                    # 查看环境变量

# 资源

# free -m                # 查看内存使用量和交换区使用量
# df -h                  # 查看各分区使用情况
# du -sh <目录名>        # 查看指定目录的大小
# grep MemTotal /proc/meminfo   # 查看内存总量
# grep MemFree /proc/meminfo    # 查看空闲内存量
# uptime                 # 查看系统运行时间、用户数、负载
# cat /proc/loadavg      # 查看系统负载

# 磁盘和分区

# mount | column -t      # 查看挂接的分区状态
# fdisk -l               # 查看所有分区
# swapon -s              # 查看所有交换分区
# hdparm -i /dev/hda     # 查看磁盘参数(仅适用于IDE设备)
# dmesg | grep IDE       # 查看启动时IDE设备检测状况

# 网络

# ifconfig               # 查看所有网络接口的属性
# iptables -L            # 查看防火墙设置
# route -n               # 查看路由表
# netstat -lntp          # 查看所有监听端口
# netstat -antp          # 查看所有已经建立的连接
# netstat -s             # 查看网络统计信息

# 进程

# ps -ef                 # 查看所有进程
# top                    # 实时显示进程状态

# 用户

# w                      # 查看活动用户
# id <用户名>            # 查看指定用户信息
# last                   # 查看用户登录日志
# cut -d: -f1 /etc/passwd   # 查看系统所有用户
# cut -d: -f1 /etc/group    # 查看系统所有组
# crontab -l             # 查看当前用户的计划任务

# 服务

# chkconfig --list       # 列出所有系统服务
# chkconfig --list | grep on    # 列出所有启动的系统服务

# 程序

# rpm -qa                # 查看所有安装的软件包

# 虚拟机安装centos7.9

# 下载

下载地址: https://www.centos.org/download/ (opens new window) 尝试了几个地方,清华的下载源速度是最快的。我这里1000M的网络,下载可以60M/s https://mirrors.tuna.tsinghua.edu.cn/centos/7.9.2009/isos/x86_64/ (opens new window)

# 虚拟机安装centos7.9

  • 新建虚拟机

avatar

  • 选择下载的iso镜像文件

avatar

  • 选择虚拟机存储的位置和名称

avatar

  • 设置虚拟机磁盘大小

avatar

  • 设置内存、CPU、网卡选择桥接使用和物理机同样的网络

avatar avatar

  • 启动虚拟机后选择 install centos 7

avatar

  • 键盘选择默认

avatar

  • 时区选择 Asia Shanghai

avatar

  • 选择INSTALLATION DESTINATION配置磁盘分区

avatar

  • 选择 I will configure partitioning 手动配置磁盘分区

avatar

  • 选择标准分区

avatar

  • /boot(启动分区)一般100m~1024m。swap(交换分区)一般和分配给虚拟机的内存一样,剩余空间分配给根目录,可以根据自己需求配置不同目录挂载的分区。

avatar

  • 点击 Accept Changes 执行分区操作

avatar

  • 网络配置,根据自己需求配置

avatar

  • 静态IP配置,netmask掩码 24相当于 255.255.255.0

avatar

  • 设置root账号密码

avatar

  • 配置SSH登录

avatar

以下操作是内网测试机为了方便,调整了一些安全配置,外网生产环境不建议按此配置。

# 关闭selinux

  • 临时关闭
setenforce 0
  • 永久关闭,修改配置文件/etc/selinux/config, 将SELINUX=enforcing改为SELINUX=disabled
#SELINUX=enforcing
SELINUX=disabled

# 关闭防火墙

  • 查看防火墙服务状态,running说明打开了
systemctl status firewalld.service
  • 停用防火墙服务(临时关闭)
systemctl stop firewalld.service
  • 禁用防护墙服务(开机不启动)
systemctl disable firewalld.service

# 修改SSH端口 12350

vi /etc/ssh/sshd_config 修改port=12350

# 查找文件 find/locate/whereis/which/type

# find

find <指定目录> <指定条件> <指定动作>

  • <指定目录>: 所要搜索的目录及其所有子目录。默认为当前目录。
  • <指定条件>: 所要搜索的文件的特征。
  • <指定动作>: 对搜索结果进行特定的处理。

# 示例:

# 搜索当前目录(含子目录,以下同)中,所有文件名以my开头的文件。
  $ find . -name 'my*'
# 搜索当前目录中,所有文件名以my开头的文件,并显示它们的详细信息。
  $ find . -name 'my*' -ls
# 搜索当前目录中,所有过去10分钟中更新过的普通文件。如果不加-type f参数,则搜索普通文件+特殊文件+目录。
  $ find . -type f -mmin -10

# locate

locate命令其实是"find -name"的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。

# locate命令的使用示例:

#搜索etc目录下所有以sh开头的文件。
  $ locate /etc/sh
#搜索用户主目录下,所有以m开头的文件。
  $ locate ~/m
#搜索用户主目录下,所有以m开头的文件,并且忽略大小写。
  $ locate -i ~/m

# whereis

whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。

# whereis命令的使用示例:

  $ whereis grep

# which

which命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。

# which命令的使用示例:

  $ which grep

# type

type命令其实不能算查找命令,它是用来区分某个命令到底是由shell自带的,还是由shell外部的独立二进制文件提供的。如果一个命令是外部命令,那么使用-p参数,会显示该命令的路径,相当于which命令。

# type命令的使用示例:

#系统会提示,cd是shell的自带命令(build-in)
  $ type cd
#系统会提示,grep是一个外部命令,并显示该命令的路径
  $ type grep
#加上-p参数后,就相当于which命令
  $ type -p grep

# Linux系统最近重启时间、错误日志

[root@localhost ~]# last reboot
reboot   system boot  2.6.18-164.el5   Wed Dec 22 20:19          (12:58)
reboot   system boot  2.6.18-164.el5   Wed Nov 10 10:41         (42+09:17)
reboot   system boot  2.6.18-164.el5   Tue Oct 26 19:49         (14+14:42)
reboot   system boot  2.6.18-164.el5   Fri Oct 22 00:22         (4+19:21)
reboot   system boot  2.6.18-164.el5   Thu Oct 21 03:47         (5+15:56)
reboot   system boot  2.6.18-164.el5   Wed Oct 20 23:43         (5+20:00)
reboot   system boot  2.6.18-164.el5   Sat Sep 18 20:31         (37+23:12)
在2010-12-22 20:19 重启了系统
可以看到正常命令重启显示为down,而电源强制重启为crash。
 
# 查看最近用户登录情况
[root@localhost ~]# last
oracle   pts/1        10.1.1.1         Thu Dec 23 08:59   still logged in
reboot   system boot  2.6.18-164.el5   Wed Dec 22 20:19          (12:59)
root     pts/1        10.1.1.2         Sun Dec 12 13:07 - 13:59  (00:52)

# 查看操作系统的历史命令:
[root@localhost ~]#history |more
  382  top
  383  df -lh
  384  top
  385  service iptables stop
  386  last
  387  last reboot
  388  last
  389  history
  390  history |more

 
# 在执行top命令时都可以查看系统状态,然后就出现了reboot重启系统的状况。在service iptables stop 命令之前没有查下到reboot的命令,可见是系统重启。

# 查看系统的日志信息:
[root@localhost ~]#cat /var/log/messages |more
Dec 20 02:46:56 localhost xinetd[5248]: EXIT: telnet status=1 pid=12350 duration
=30(sec)
Dec 22 19:59:12 localhost shutdown[32014]: shutting down for system halt
Dec 22 19:59:12 localhost pcscd: winscard.c:304:SCardConnect() Reader E-Gate 0 0
 Not Found
Dec 22 19:59:13 localhost smartd[5472]: smartd received signal 15: Terminated
Dec 22 19:59:13 localhost smartd[5472]: smartd is exiting (exit status 0)
Dec 22 19:59:14 localhost avahi-daemon[5410]: Got SIGTERM, quitting.
Dec 22 19:59:14 localhost avahi-daemon[5410]: Leaving mDNS multicast group on in
terface usb0.IPv6 with address fe80::21:5eff:fe9c:b6d7.
Dec 22 19:59:14 localhost avahi-daemon[5410]: Leaving mDNS multicast group on in
terface eth0.IPv6 with address fe80::221:5eff:fe98:b6f4.
Dec 22 19:59:14 localhost avahi-daemon[5410]: Leaving mDNS multicast group on in
terface eth0.IPv4 with address 10.132.0.162.
Dec 22 20:21:08 localhost syslogd 1.4.1: restart.
Dec 22 20:21:08 localhost kernel: klogd 1.4.1, log source = /proc/kmsg started.
Dec 22 20:21:08 localhost kernel: Linux version 2.6.18-164.el5 (mockbuild@x86-00
3.build.bos.redhat.com) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)) #1 SMP T
ue Aug 18 15:51:48 EDT 2009

# 查询Linux端口占用情况和kill进程

#查询某一个端口占用情况

netstat –apn | grep 8080

# 提示找不到netstat命令就安装一下
yum install net-tools

# 首先,用ps查看进程,方法如下:

    $ ps -ef

# 或者:

    $ ps -aux

# 然后kill进程

    $ kill -s 9 1827

# Rsync 数据同步工具应用指南

# Rsync 简介

  • Rsync是一款开源的、快速的 多功能的 可以实现全量以及增量的本地或者是远程的数据同步(拷贝)备份的工具

  • rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。

  • 通过cwrsync已支持跨平台,可以在Windows与Linux间进行数据同步.

# 应用场景

# 异地备份

审计内控需求,需要对关键业务系统的数据做异地备份。通过rsync+crontab每天凌晨同步一下本地的备份文件到异地机房

# 日常工作文件备份

日常工作文件存储在个人电脑上,不乏重要文件,通过rsync备份到文件服务器中

# 附件、配置文件、代码备份

企业备份通常重视数据库的备份而忽略了应用服务器中的附件、配置文件的备份。通过rsync

# 云主机双写互备

解决存储服务器等单点问题,rsync结合inotify做实时的数据同步,根据服务器上目录的变化同步到备份服务器,还可以通过双写方案实现双机数据同步。多个副本文件备份,保障数据安全。

# 安装

windows下使用图形安装界面cwrsync,服务端和客户端分别安装。如果需要从多个服务器往一个服务器同步文件,是需要安装多个服务端,一个客户端。 客户端通过服务端开放的端口从服务端拉取文件到客户端。 结构如下图: avatar

//master
#安装rsync命令
yum -y install rsync
#关闭防火墙,selinux
systemctl stop firewalld
setenforce 0


//bak
#安装rsync命令
yum -y install rsync
#关闭防火墙,selinux
systemctl stop firewalld
setenforce 0

# 配置文件

#rsyncd.conf配置文件说明:

log file = /var/log/rsyncd.log    # 日志文件位置,启动rsync后自动产生这个文件,无需提前创建
pidfile = /var/run/rsyncd.pid     # pid文件的存放位置
lock file = /var/run/rsync.lock   # 支持max connections参数的锁文件
secrets file = /etc/rsync.pass    # 用户认证配置文件,里面保存用户名称和密码,必须手动创建这个文件

[erp_bak_client]     # 自定义同步名称
path = /chengweniterpbak/          # rsync目标服务器数据存放路径,源服务器的数据将同步至此目录
comment = sync etc from client
uid = root        # 设置rsync运行权限为root
gid = root        # 设置rsync运行权限为root
port = 873        # 默认端口,建议根据实际修改,并仅允许客户端IP访问
ignore errors     # 表示出现错误忽略错误
use chroot = no       # 默认为true,目录权限
read only = no    # rsync源服务器为读写权限
list = no     # 不显示rsync源服务器资源列表
max connections = 200     # 最大连接数
timeout = 600     # 超时时间
auth users = admin        # 执行数据同步的用户名,多个用逗号隔开
hosts allow = 10.11.11.11   # 可以进行数据同步的源服务器IP地址,多个用逗号隔开
hosts deny = 10.11.11.12      # 禁止同步数据的源服务器IP地址,多个用逗号隔开
  • 备份脚本
    #!/bin/bash
    rsync --progress -avztSH /data/backup erp@10.11.0.31::erpbak --password-file=/root/rsync.pas
  • crontab
    30 02 * * * /data/backup/rsyncbakdmp.sh

# linux scp命令不同主机间拷贝文件

# 从本地拷贝文件到远程机
$ sudo scp -P *** /home/ubuntu/footer_icon.png root@*.*.*.*:/home
# 从远程机拷贝文件到本地
$scp root@10.6.159.147:/opt/soft/demo.tar /opt/soft/

# linux下重启oracle服务:监听器和实例

# 方法1:

用root以ssh登录到linux,打开终端输入以下命令:

cd $ORACLE_HOME #进入到oracle的安装目录 
dbstart #重启服务器 
lsnrctl start #重启监听器 
cd $ORACLE_HOME #进入到oracle的安装目录
dbstart #重启服务器
lsnrctl start #重启监听器

# 方法2:

cd $ORACLE_HOME/bin #进入到oracle的安装目录 
./dbstart #重启服务器 
./lsnrctl start #重启监听器

# 方法3:

  1. 以oracle身份登录数据库,命令:su -oracle
  2. 进入Sqlplus控制台,命令:sqlplus /nolog
  3. 以系统管理员登录,命令:connect / as sysdba
  4. 启动数据库,命令:startup
  5. 如果是关闭数据库,命令:shutdown immediate
  6. 退出sqlplus控制台,命令:exit
  7. 进入监听器控制台,命令:lsnrctl
  8. 启动监听器,命令:start
  9. 退出监听器控制台,命令:exit

# 重启实例:

  1. 切换需要启动的数据库实例:export ORACLE_SID=C1
  2. 进入Sqlplus控制台,命令:sqlplus /nolog
  3. 以系统管理员登录,命令:connect / as sysdba
  4. 如果是关闭数据库,命令:shutdown abort
  5. 启动数据库,命令:startup
  6. 退出sqlplus控制台,命令:exit

# Linux下Oracle修改主机名后LISTENER,TNSNAME.ora

需要修改以下两个文件,注意 /etc/hosts文件主机名指向的IP

/u01/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora
/u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora

# tomcat在Linux下调优参数

JAVA_OPTS="-server -Xms8192m -Xmx8192m -Xss512k -XX:+AggressiveOpts 
-XX:+UseBiasedLocking -XX:PermSize=2096m -XX:MaxPermSize=2096m 
-XX:+DisableExplicitGC 
-XX:MaxTenuringThreshold=31 
-XX:+UseConcMarkSweepGC 
-XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled 
-XX:+UseCMSCompactAtFullCollection 
-XX:LargePageSizeInBytes=128m  
-XX:+UseFastAccessorMethods 
-XX:+UseCMSInitiatingOccupancyOnly 
-Djava.awt.headless=true"

# CentOS安装jdk1.8

  1. 首先到官网下载jdk-8u171-linux-x64.tar.gz, http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk8-downloads-2133151-zhs.html

  2. 通过终端在/usr/local目录下新建java文件夹,命令行:

mkdir /usr/local/java
  1. 然后将下载到压缩包剪切到java文件夹中,命令行:
mv jdk-8u66-linux-x64.tar.gz /usr/local/java
  1. 然后进入java目录,命令行:
cd /usr/local/java
  1. 解压压缩包,命令行:
 tar zxvf jdk-8u66-linux-x64.tar.gz
  1. 设置jdk环境变量,修改etc/profile,它是是所有用户的共用的环境变量
vi /etc/profile
  1. 打开之后在末尾添加
JAVA_HOME=/usr/local/java/jdk1.8.0_66
JRE_HOME=/usr/local/java/jdk1.8.0_66/jre
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$JAVA_HOME/bin:$PATH
export PATH JAVA_HOME CLASSPATH
  1. 使环境变量生效
source /etc/profile
  1. 看看自己的配置是否都正确
echo $JAVA_HOME
echo $CLASSPATH
echo $PATH
  1. 检验是否安装成功
java -version
/* java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode) */

# centos6.9部署OpenLDAP和web管理界面,迁移AD-LDAP

公司原使用微软的ADLDAP,操作系统用的非正版的windows server 2008 r2,因考虑知识产权风险,需把ldap迁移导centos上,下面是在centos搭建openldap 和 部署web管理界面 以及迁移AD ldap的过程记录

  1. 环境搭建
  • 操作系统:centos6.9 x86_64
  • 关闭防火墙、selinux
  • 配置域名解析:
echo "192.168.1.252 chengwenit.com" >> /etc/hosts
  1. 解决依赖关系
yum grouplist
Base
Debugging Tools
Performance Tools
Compatibility libraries
Development tools
Dial-up Networking Support
Hardware monitoring utilities

如果缺少组包,需要安装

yum groupinstall -y "Compatibility libraries"
  1. 安装openldap master
yum install -y openldap openldap-*
yum install -y nscd nss-pam-ldapd nss-* pcre pcre*
rpm -qa | grep openldap*
compat-openldap-2.3.43-2.el6.x86_64
openldap-2.4.40-12.el6.x86_64
openldap-clients-2.4.40-12.el6.x86_64
openldap-servers-sql-2.4.40-12.el6.x86_64
openldap-servers-2.4.40-12.el6.x86_64
openldap-devel-2.4.40-12.el6.x86_64
  1. 配置slapd.conf文件
cd /etc/openldap/
[root@node5 openldap]# cp /usr/share/openldap-servers/slapd.conf.obsolete slapd.conf


[root@node5 openldap]# cp slapd.conf slapd.conf.bak
[root@node5 openldap]# slappasswd -s chengwenit|sed -e "s#{SSHA}#rootpw\t{SSHA}#g"
rootpw {SSHA}D9+lqUJZVPobp0sZfXl37jE1aVvR2P9K
[root@node5 openldap]# slappasswd -s chengwenit|sed -e "s#{SSHA}#rootpw\t{SSHA}#g">>/etc/openldap/slapd.conf
[root@node5 openldap]# tail -1 slapd.conf
rootpw {SSHA}FvBRnIPqtIi0/u11O2gOfOCrRJr+xMAr
vi slapd.conf
# 注释掉一下四行
# database        dbb
#suffix         "dc=my-domain,dc=com"
#checkpoint     1024 15
#rootdn         "cn=Manager,dc=my-domain,dc=com"
# 添加如下内容
# add start by Evan 2016/07/01
database        bdb
suffix          "dc=chengwenit,dc=com"
rootdn          "cn=admin,dc=chengwenit,dc=com"


对比修改是否成功:
[plain] view plain copy
# diff slapd.conf.bak slapd.conf  
114,117c114,122  
< database bdb  
< suffix "dc=my-domain,dc=com"  
< checkpoint 1024 15  
< rootdn "cn=Manager,dc=my-domain,dc=com"  
---  
> #database bdb  
> #suffix "dc=my-domain,dc=com"  
> #checkpoint 1024 15  
> #rootdn "cn=Manager,dc=my-domain,dc=com"  
> # add start by Evan 2016/07/01  
> database dbd  
> suffix "dc=chengwenit,dc=com"  
> rootdn "cn=admin,dc=chengwenit,dc=com"  
>   
140a146  
> rootpw {SSHA}FvBRnIPqtIi0/u11O2gOfOCrRJr+xMAr  
# 添加如下内容
cat >> /etc/openldap/slapd.conf<<EOF
# add start by Evan 2016/07/01
loglevel 296
cachesize 1000
checkpoint 2018 10
EOF

参数说明:

  • loglevel 296 # 日志级别,记录日志信息方便调试,296级别是由256(日志连接/操作/结果)、32(搜索过滤器处理)、8(连接管理)累加的结果
  • cachesize 1000 # 设置ldap可以换成的记录数
  • checkpoint 2018 10 # 可以设置把内存中的数据协会数据文件的操作上,上面设置表示每达到2048KB或者10分钟执行一次,checkpoint即写入数据文件的操作
  1. ldap授权及安全参数配置
vi /etc/openldap/slapd.conf
# 删除如下内容:
[plain] view plain copy
database config  
access to *  
        by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage  
        by * none  
  
  
# enable server status monitoring (cn=monitor)  
database monitor  
access to *  
        by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read  
        by dn.exact="cn=Manager,dc=my-domain,dc=com" read  
        by * none  


改为:
access to *
        by self write
        by anonymous auth
        by * read

  1. 加入日志记录
cp /etc/rsyslog.conf /etc/rsyslog.conf.bak.$(date +%F%T)
echo '#record ldap.log by Evan 2016-07-01' >> /etc/rsyslog.conf
echo 'local4.* /var/log/ldap.log'>> /etc/rsyslog.conf
tail -1 /etc/rsyslog.conf
local4.* /var/log/ldap.log
service rsyslog restart
  1. 配置ldap数据库路径
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
[root@node5 openldap]# ll /var/lib/ldap/DB_CONFIG 
-rw-r--r-- 1 root root 845 Jul  1 17:29 /var/lib/ldap/DB_CONFIG
[root@node5 openldap]# chown ldap:ldap /var/lib/ldap/DB_CONFIG 
[root@node5 openldap]# chmod 700 /var/lib/ldap/
[root@node5 openldap]# ls -l /var/lib/ldap/
total 4
-rw-r--r-- 1 ldap ldap 845 Jul  1 17:29 DB_CONFIG

验证配置是否Ok

slaptest -u
config file testing succeeded
  1. 启动服务:
# /etc/init.d/slapd restart
# lsof -i :389
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
slapd   50735 ldap    7u  IPv4  75541      0t0  TCP *:ldap (LISTEN)
slapd   50735 ldap    8u  IPv6  75542      0t0  TCP *:ldap (LISTEN)
[root@node5 openldap]# ps -ef |grep ldap|grep -v grep
ldap     50735     1  0 17:33 ?        00:00:00 /usr/sbin/slapd -h  ldap:/// ldapi:/// -u ldap
配置随机启动
# chkconfig slapd on
[root@node5 openldap]# chkconfig --list slapd
slapd           0:off1:off2:on3:on4:on5:on6:off
  1. 测试查找内容
# ldapsearch -LLL -W -x -H ldap://chengwenit.com-D "cn=admin,dc=chengwenit,dc=com" -b "dc=chengwenit,dc=com" "(uid=*)"

Enter LDAP Password: 报错: ldap_bind: Invalid credentials (49)

解决办法: [plain] view plain copy

# rm -rf /etc/openldap/slapd.d/*  
# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d  
57763ec6 bdb_monitor_db_open: monitoring disabled; configure monitor database to enable  
config file testing succeeded  
# ldapsearch -LLL -W -x -H ldap://chengwenit.com-D "cn=admin,dc=chengwenit,dc=com" -b "dc=chengwenit,dc=com" "(uid=*)"  
Enter LDAP Password:   
No such object (32)  

重启服务

# service slapd restart
Stopping slapd:                                            [FAILED]
Checking configuration files for slapd:                    [FAILED]
57763eee ldif_read_file: Permission denied for "/etc/openldap/slapd.d/cn=config.ldif"
slaptest: bad configuration file!
[root@node5 openldap]# chown -R ldap.ldap /etc/openldap/slapd.d/
[root@node5 openldap]# service slapd restart
Stopping slapd:                                            [FAILED]
Starting slapd:                                            [  OK  ]

# lsof -i :389
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
slapd   51164 ldap    7u  IPv4  77503      0t0  TCP *:ldap (LISTEN)
slapd   51164 ldap    8u  IPv6  77504      0t0  TCP *:ldap (LISTEN)
  1. 为ldap master初始化数据(如果不初始化,后面无法通过web界面管理)

增加初始的入口(entries)

  • 创建LDIF文件 编辑一个LDIF格式文件:
# vi base.ldif
[plain] view plain copy
dn: dc=chengwenit, dc=com  
objectClass: organization  
objectClass: dcObject  
dc: chengwenit  
o: chengwenit  

dn: ou=People, dc=chengwenit, dc=com  
objectClass: organizationalUnit  
ou: People  
  
  
dn: ou=group, dc=chengwenit, dc=com  
objectClass: organizationalUnit  
ou: group  
  
  
dn: cn=tech, ou=group, dc=chengwenit, dc=com  
objectClass: posixGroup  
description:: 5oqA5pyv6YOo  
gidNumber: 10001  
cn: tech  


# vi Evan.ldif
[plain] view plain copy
dn: uid=Evan,ou=People,dc=chengwenit,dc=com  
objectClass: posixaccount  
objectClass: inetOrgPerson  
objectClass: organizationalPerson  
objectClass: person  
homeDirectory: /home/Evan  
loginShell: /bin/bash  
uid: Evan  
cn: Evan  
userPassword:: 55G/ReqPKeOZ8SpgszwIQhaBXySNU4mw  
uidNumber: 10005  
gidNumber: 10001  
sn: Evan  

[plain] view plain copy
# ldapadd -x -H ldap://chengwenit.com-D "cn=admin,dc=chengwenit,dc=com" -W -f base.ldif  
Enter LDAP Password:   
adding new entry "dc=chengwenit, dc=com"  
  
  
adding new entry "ou=People, dc=chengwenit, dc=com"  
  
  
adding new entry "ou=group, dc=chengwenit, dc=com"  
  
  
adding new entry "cn=tech, ou=group, dc=chengwenit, dc=com"  
  • 运行ldapadd
# ldapadd -x -H ldap://chengwenit.com-D "cn=admin,dc=chengwenit,dc=com" -W -f base.ldif
Enter LDAP Password: 


[plain] view plain copy
报错:  
adding new entry "dc=chengwenit,dc=com"  
ldap_add: Invalid syntax (21)  
additional info: objectClass: value #0 invalid per syntax  
原因:ldif文件中存在空格 或者 个别单词拼写错误  
正确书写格式:   
(1空行)  
dn:(空格) dc=mail,dc=kaspersky,dc=com(结尾无空格)  
objectclass: (空格)dcObject(结尾无空格)  
objectclass: (空格)organization(结尾无空格)  
o: (空格)kaspersky(结尾无空格)  
dc:(空格) test(结尾无空格)  
(1空行)  
dn: (空格)cn=test,dc=mail,dc=kaspersky,dc=com(结尾无空格)  
objectclass: (空格)organizationalRole(结尾无空格)  
cn: (空格)test(结尾无空格)  
(结尾无空行)  

# ldapadd -x -H ldap://chengwenit.com-D "cn=admin,dc=chengwenit,dc=com" -W -f Evan.ldif 
Enter LDAP Password: 
adding new entry "uid=Evan,ou=People,dc=chengwenit,dc=com"
  • 检查是否已经开始正常工作
# ldapsearch -LLL -W -x -H ldap://chengwenit.com-D "cn=admin,dc=chengwenit,dc=com" -b "dc=chengwenit,dc=com" "(uid=*)"
Enter LDAP Password: 
dn: uid=Evan,ou=People,dc=chengwenit,dc=com
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
homeDirectory: /home/Evan
loginShell: /bin/bash
uid: Evan
cn: Evan
userPassword:: 55G/ReqPKeOZ8SpgszwIQhaBXySNU4mw
uidNumber: 10005
gidNumber: 10001
sn: Evan

# linux 给用户加sudo权限

  • 用root帐号登录或者su到root。
  • 增加sudoers文件的写权限: chmod u+w /etc/sudoers
  • vi /etc/sudoers 找到 root ALL=(ALL) ALL 在这行下边添加 chengwenit ALL=(ALL) ALL (ps:chengwenit代表是你要添加sudo权限的用户名)
  • 除去sudoers文件的写权限: chmod u-w /etc/sudoers

# linux下 tar 打包文件和目录(压缩和解压)

打包:tar -czvf ***.tar.gz 解压:tar -xzvf ***.tar.gz 示例:解压jdk到指定文件夹:

tar -xzvf jdk-8u131-linux-x64.tar.gz -C /usr/local/java
tar -czf jpg.tar.gz *.jpg   #将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个gzip压缩过的包,命名为jpg.tar.gz
  • 单个文件压缩打包 tar czvf my.tar file1
  • 多个文件压缩打包 tar czvf my.tar file1 file2,...
  • 单个目录压缩打包 tar czvf my.tar dir1
  • 多个目录压缩打包 tar czvf my.tar dir1 dir2
  • 解包至当前目录:tar xzvf my.tar

# 解压

  • tar -xvf file.tar //解压 tar包
  • tar -xzvf file.tar.gz //解压tar.gz
  • tar -xjvf file.tar.bz2 //解压 tar.bz2
  • tar -xZvf file.tar.Z //解压tar.Z
  • unrar e file.rar //解压rar
  • unzip file.zip //解压zip

# 部署ngrok服务

微信开发测试环境使用公网IP转发的80端口进行本地调试

  1. 安装gcc
  yum install gcc
  1. 安装git
 yum install git
  1. 下载go https://www.golangtc.com/download

  2. 解压

tar -xzvf go1.9.2.linux-amd64.tar.gz -C /usr/local/
  1. 设置环境变量 vi /etc/profile
GO_HOME=/usr/local/go
export PATH=$PATH:$GO_HOME/bin
  1. 生效环境变量配置文件和检查是否安装成功
source /etc/profile
go version
  1. git 克隆 ngrok
git clone https://github.com/inconshreveable/ngrok.git
  1. 生成证书
NGROK_DOMAIN="vip.chengwenit.com"
openssl genrsa -out base.key 2048
openssl req -x509 -new -nodes -key base.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out base.pem
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
openssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -out server.crt -days 5000
  1. 替换证书
cp base.pem assets/client/tls/ngrokroot.crt
  1. 编译生成ngrok服务器
make release-server release-client
  1. 启动ngrok服务
./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="vip.chengwenit.com" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443"
# 后台运行:
setsid ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="vip.chengwenit.com" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443"
  1. 生成客户端(windows)
GOOS=windows GOARCH=amd64 make release-client
  1. 新建ngrok.cfg文件和配置 进入windows_amd64: touch ngrok.cfg 打开文件 erver_addr: "vip.chengwenit.com:4443" trust_host_root_certs:false

  2. 拷贝到windows机器上

  3. 启动客户端

ngrok -config=ngrok.cfg -subdomain=myapps 8080

http://myapps.vip.chengwenit.com -> 127.0.0.1:8080

ok

复杂ngrok.cfg配置

    server_addr: "myngrok.com:8083"
    trust_host_root_certs: false
    
    tunnels:
      http:
        subdomain: "www"
        proto:
          http: "8081"
          
      https:
        subdomain: "www"
        proto:
          https: "8082"
          
      web:
        proto:
          http: "8050"
      tcp:
        proto:
          tcp: "8001"
        remote_port: 5555
     
      ssh:
        remote_port: 2222
        proto:
          tcp: "22"

启动命令

    ngrok -config=ngrok.cfg start web  #启动web服务
    ngrok -config=ngrok.cfg start tcp  #启动tcp服务
    ngrok -config=ngrok.cfg start web tcp  #同时启动两个服务
    ngrok -config=ngrok.cfg start-all  #启动所有服务

# 转:推荐一款很好用的内网穿透工具 FRP

由于ngrok开源版本不支持客户端和服务端的身份认证。重新部署一个服务来试试

引用

https://www.hi-linux.com/posts/25686.html (opens new window)

0.22版 客户端和服务端的身份认证 是 token = xxx

  • 后台运行: nohup /opt/frpc0270/frpc -c /opt/frpc0270/frpc.ini frp.log 2>&1 &

# linux centos 静默安装Oracle 11gR2(11.2.0.4)

因客户使用的Oracle11g数据库,版本是11.2.0.2,新erp系统管理中心有功能需Oracle11.2.0.4版本才支持,以下是安装步骤。

  • 下载安装 centos

https://www.centos.org/download/ (opens new window)

  • 选择最新版本的 Minimal ISO。操作系统安装过程不在这里详细展开,选择最小安装即可。静默安装无需图形界面

  • 下载Oracle 因客户有购买Oracle的正版license,可以通过Oracle官网下载到11.2.0.4版本的程序,如果没有metalink账号,可以点击我分享的百度云链接下载,所有平台的程序都有。 链接:https://pan.baidu.com/s/1s3_Lqgo7-hB6QMX8nKpi-g (opens new window) 提取码:bss7

  • 通过WIN-SCP把安装文件上传到服务器逐个解压

unzip linux.x64_11gR2_database_1of2.zip
unzip linux.x64_11gR2_database_2of2.zip
  • 安装依赖包之前,建议最好将yum源修改为aliyun源,国外的源速度太慢 执行如下命令:
cd /etc
mv yum.repos.d yum.repos.d.bak
mkdir yum.repos.d
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache
  1. 安装依赖包
yum -y install binutils \
compat-libstdc++-33 \
elfutils-libelf \
elfutils-libelf-devel \
expat \
gcc \
gcc-c++ \
glibc \
glibc-common \
glibc-devel \
glibc-headers \
libaio \
libaio-devel \
libgcc \
libstdc++ \
libstdc++-devel \
make \
pdksh \
sysstat \
unixODBC \
unixODBC-devel
  • 安装过程检查是否有包安装成功 可以看到 pdksh 没安装成功,是因为CentOS 7 没有相关安装包可用

  • 通过wget下载pdksh包安装

wget -O /download/pdksh-5.2.14-37.el5_8.1.x86_64.rpm http://vault.centos.org/5.11/os/x86_64/CentOS/pdksh-52.14-37.el5_8.1.x86_64.rpm
rpm -ivh pdksh-5.2.14-37.el5_8.1.x86_64.rpm
  • 检查依赖包是否都已完整安装,如果安装的中文语言 grep 后改成 "未安装"
rpm -q \
binutils \
compat-libstdc++-33 \
elfutils-libelf \
elfutils-libelf-devel \
expat \
gcc \
gcc-c++ \
glibc \
glibc-common \
glibc-devel \
glibc-headers \
libaio \
libaio-devel \
libgcc \
libstdc++ \
libstdc++-devel \
make \
pdksh \
sysstat \
unixODBC \
unixODBC-devel | grep "not installed"
  • 添加oracle用户组和用户
groupadd oinstall
groupadd dba
groupadd asmadmin
groupadd asmdba
useradd -g oinstall -G dba,asmdba oracle -d /home/oracle
  • 设置Oracle用户密码
passwd oracle
  • 配置hosts
vi /etc/hosts
10.10.11.xxx chwit-oracle1124
  • 测试hostname是否可以连接
    ping -c 4 chwit-oracle1124
  • 优化OS内核参数

kernel.shmmax 参数设置为物理内存的一半

vi /etc/sysctl.conf
fs.aio-max-nr=1048576
fs.file-max=6815744
kernel.shmall=2097152
kernel.shmmni=4096
kernel.shmmax = 1073741824
kernel.sem=250 32000 100 128
net.ipv4.ip_local_port_range=9000 65500
net.core.rmem_default=262144
net.core.rmem_max=4194304
net.core.wmem_default=262144
net.core.wmem_max=1048586
  • 使参数生效
sysctl -p
  • 限制oracle用户的shell权限
vi /etc/security/limits.conf
oracle              soft    nproc   2047
oracle              hard    nproc   16384
oracle              soft    nofile  1024
oracle              hard    nofile  65536
vi /etc/pam.d/login
session  required   /lib64/security/pam_limits.so
session  required   pam_limits.so
vi /etc/profile
if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi
  • 创建oracle安装目录配置目录权限
mkdir -p /db/app/oracle/product/11.2.0
mkdir /db/app/oracle/oradata
mkdir /db/app/oracle/inventory
mkdir /db/app/oracle/fast_recovery_area
chown -R oracle:oinstall /db/
chmod -R 775 /db/
  • 配置oracle用户环境变量
su - oracle
vi .bash_profile
umask 022
export ORACLE_HOSTNAME=chwit-oracle1124
export ORACLE_BASE=/db/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/
export ORACLE_SID=ORCL
export PATH=.:$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$ORACLE_HOME/jdk/bin:$PATH
export LC_ALL="en_US"
export LANG="en_US"
export NLS_LANG="AMERICAN_AMERICA.AL32UTF8"
export NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"
  • 新建配置文件目录,根据实际情况修改安装配置文件
mkdir /db/etc/
cp /db/database/response/* /db/etc/
vi /db/etc/db_install.rsp
oracle.install.option=INSTALL_DB_SWONLY
DECLINE_SECURITY_UPDATES=true
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/db/app/oracle/inventory
SELECTED_LANGUAGES=en,zh_CN
ORACLE_HOSTNAME=chwit-oracle1124
ORACLE_HOME=/db/app/oracle/product/11.2.0
ORACLE_BASE=/db/app/oracle
oracle.install.db.InstallEdition=EE
oracle.install.db.isCustomInstall=true
oracle.install.db.DBA_GROUP=dba
oracle.install.db.OPER_GROUP=dba
DECLINE_SECURITY_UPDATES=true
  • 切换到Oracle用户开始安装
su - oracle
./runInstaller -silent -ignorePrereq -responseFile /db/etc/db_install.rsp

安装过程中可以tail命令看oracle的安装日志

tail -f /db/app/oracle/inventory/logs/installActions2022-08-12_10-48-29PM.log
  • 安装完成后切换到root用户根据提示执行脚本
su root
sh /db/app/oracle/inventory/orainstRoot.sh
sh /db/app/oracle/product/11.2.0/root.sh
  • 切换回配置静默监听
su - oracle
netca /silent /responsefile /db/etc/netca.rsp
  • 查看监听端口
netstat -tnulp | grep 1521
  • 静默创建数据库(搭建adg 从库不需要创建数据库)

TOTALMEMORY 设置为总内存的80%

vi /db/etc/dbca.rsp
GDBNAME = "orcl"
SID = "orcl"
SYSPASSWORD = "chwit20190812"
SYSTEMPASSWORD = "chwit20190812"
SYSMANPASSWORD = "chwit20190812"
DBSNMPPASSWORD = "chwit20190812"
DATAFILEDESTINATION =/db/app/oracle/oradata
RECOVERYAREADESTINATION=/db/app/oracle/fast_recovery_area
CHARACTERSET = "AL32UTF8"
TOTALMEMORY = "1638"
  • 执行静默建库
dbca -silent -responseFile /db/etc/dbca.rsp
  • 安装完成后启动监听和数据库
lsnrctl start
sqlplus / as sysdba
startup

至此安装结束,可以用客户端工具测试连接

# openldap主从复制

背景: 公司很多服务,比如gitlab/itsm/crm/jira等依赖openldap的服务进行认证和权限管理,目前仅一台服务器如果宕机影响较大,故搭建一个从ldap服务器提高可用性,也当做备份

# 主ldap配置

vi /etc/openldap/slapd.conf
modulepath /usr/lib64/openldap
moduleload syncprov.la
# master replia server start
overlay syncprov
syncprov-checkpoint 100 10 
syncprov-sessionlog 100

如以上,打开slapd.conf文件,取消前面两行注释,新增下面四行

删除目录

如果是生产环境,请注意备份后再操作,第一步修改配置文件也是

rm -rf /etc/openldap/slapd.d/*

重新生成配置文件

slaptest -u
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/

重启服务

service slapd restart

# 从ldap配置

取消两行注释

vi /etc/openldap/slapd.conf
modulepath /usr/lib64/openldap
moduleload syncprov.la

在index nisMapName,nisMapEntry eq,pres,sub行后新增下面两行

# slave replica statement start
syncrepl   rid=123  provider=ldap://ldapmaster.chengwenit.com:389    type=refreshOnly 

配置文件修改后运行下面命令

rm -rf /etc/openldap/slapd.d/*
slaptest -u
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/
chown -R ldap. /etc/openldap/slapd.d/
service slapd restart

以上完成后可进行测试

# centos7 部署nginx +配置SSL证书

nginx.conf (opens new window)## 首先安装依赖

yum install gcc-c++  
yum install pcre pcre-devel  
yum install zlib zlib-devel  
yum install openssl openssl-devel 

# 下载 解压

wget从官网下载最新稳定版本

wget wget http://nginx.org/download/nginx-1.19.4.tar.gz
tar -xzvf nginx-1.19.4.tar.gz

# 配置

配置安装的路径和模块,不带参数为默认配置 安装在 /usr/local/nginx

./configure --prefix=/opt/nginx --with-http_stub_status_module --with-http_gzip_static_module --with-http_ssl_module

# 编译安装

make
make install

# 配置SSL nginx.conf配置

#运行用户
#user  nobody;
#启动进程,通常设置成和cpu的数量相等
worker_processes  1;
#全局错误日志
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#PID文件
#pid        logs/nginx.pid;

#工作模式及连接数上限
events {
    worker_connections  1024; #单个后台worker process进程的最大并发链接数
}

#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
#设定mime类型,类型由mime.type文件定义
    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;
  #指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
  #必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
    sendfile        on;
    #tcp_nopush     on;
#连接超时时间
    #keepalive_timeout  0;
    keepalive_timeout  65;
#开启gzip压缩
    #gzip  on;
  

    server {
	#侦听11111端口
        listen       443 ssl;
	#定义使用本机访问
        server_name  kfwy.chwit.vip;
        #charset koi8-r;
     #设定本虚拟主机的访问日志
        #access_log  logs/host.access.log  main;
        ssl_certificate   cert/4729903_kfwy.chwit.vip.pem;
        ssl_certificate_key  cert/4729903_kfwy.chwit.vip.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
     #默认请求
        location / {
            root   html;
            index  index.html index.htm Index.jsp index.jsp; 
		client_max_body_size  100m;			#定义首页索引文件的名称

			
        }

	
     # 定义错误提示页面
        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
	    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
		#禁止访问 .htxxx 文件
        #location ~ /\.ht {
        #    deny  all;
        #}
	
		
		location /kfpsm/ {
        index  index.html index.htm index.jsp;
        proxy_pass        http://127.0.0.1:8008/kfpsm/;
		proxy_set_header  X-Real-IP  $remote_addr;
		#			auth_basic "nginx basic http test for ttlsa.com";
        #      auth_basic_user_file passwd.db; 
		client_max_body_size  100m;
        proxy_next_upstream http_502 http_504 http_404 error timeout invalid_header;
        #proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_connect_timeout 300s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;
        proxy_http_version 1.1;

         }

    }   

	server {

        listen       80;
        server_name  kfwy.chwit.vip; #修改为申请证书绑定的域名
        rewrite ^(.*)$ https://${server_name}$1 permanent; 
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
	#第一个虚拟服务器
    #server {
	#侦听8000端口,8080端口
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}
  • 成集云nginx配置文件
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    # 限制body大小
    client_max_body_size 100m;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    upstream server {
        ip_hash;
        server 10.11.11.52:41066;
    }

    upstream monitor-admin {
        server 10.11.11.52:41063;
    }

    upstream xxljob-admin {
        server 10.11.11.52:61064;
    }

    server {
        listen       80;
        server_name  10.11.11.52;

        # https配置参考 start
        #listen       443 ssl;

        # 证书直接存放 /docker/nginx/cert/ 目录下即可 更改证书名称即可 无需更改证书路径
        #ssl on;
        #ssl_certificate      /etc/nginx/cert/xxx.local.crt; # /etc/nginx/cert/ 为docker映射路径 不允许更改
        #ssl_certificate_key  /etc/nginx/cert/xxx.local.key; # /etc/nginx/cert/ 为docker映射路径 不允许更改
        #ssl_session_timeout 5m;
        #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        #ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        #ssl_prefer_server_ciphers on;
        # https配置参考 end

        # 演示环境配置 拦截除 GET POST 之外的所有请求
        # if ($request_method !~* GET|POST) {
        #     rewrite  ^/(.*)$  /403;
        # }

        # location = /403 {
        #     default_type application/json;
        #     return 200 '{"msg":"演示模式,不允许操作","code":500}';
        # }

        # 限制外网访问内网 actuator 相关路径
        location ~ ^(/[^/]*)?/actuator(/.*)?$ {
            return 403;
        }

        location / {
            root   /opt/nginx/html;
            try_files $uri $uri/ /index.html;
            index  index.html index.htm;
        }

        location /prod-api/ {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://server/;
        }
		
		# 积木报表
        location /jmreport/ {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://server/jmreport/;
        }
		

        # https 会拦截内链所有的 http 请求 造成功能无法使用
        # 解决方案1 将 admin 服务 也配置成 https
        # 解决方案2 将菜单配置为外链访问 走独立页面 http 访问
        location /admin/ {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://monitor-admin/admin/;
        }

        # https 会拦截内链所有的 http 请求 造成功能无法使用
        # 解决方案1 将 xxljob 服务 也配置成 https
        # 解决方案2 将菜单配置为外链访问 走独立页面 http 访问
        location /chwjob/ {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://xxljob-admin/chwjob/;
        }

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

# 开机自动启动

echo -e "/opt/nginx/sbin/nginx" >>/etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local

# RedHat/centos安装python3和virtualenv

因需要把一个Windows机器下架,一个python3下做的自动读Oracle数据库发邮件的脚本迁移到RedHat6机器上,RedHat自带python,且yum依赖python2,所以单独安装一个python3. 以后部署其他python程序可能用到版本不同的包,所以安装virtualenv来创建一个隔离的python3运行环境

  1. 下载解压python3源码包
https://www.python.org/downloads/source/
xz -d Python-3.5.2.tar.xz
tar xvf Python-3.5.2.tar
  1. yum安装Python3依赖后编译安装
sudo yum -y install gcc gcc-c++ 
sudo yum -y install zlib zlib-devel
sudo yum -y install libffi-devel 
./configure
make
make install
  1. pip安装virtualenv
pip3 install virtualenv

# linux Centos部署frps

# 安装

# 解压文件
 tar -xzvf frp_0.27.0_linux_amd64.tar.gz 

# 删除多余文件(可省略)
 rm -rf frp_0.27.0_linux_amd64/
 rm -rf frpc*
 rm -rf frps_full.ini 

# 修改配置文件
 vi frps.ini 

# 设置开机启动

 cp /opt/frp/frps /usr/bin/
 chmod -R 775 /usr/bin/frps
 mkdir /etc/frp/
 cp /opt/frps/frps.ini /etc/frp/
 cp /opt/frps/systemd/frps.service /lib/systemd/system/frps.service
 systemctl daemon-reload
 systemctl start frps
 systemctl enable frps

# Centos7安装MySQL8

# 卸载旧版本(MySQL或者mariadb)

慎用,如果之前的数据库有数据要先备份

for i in $(rpm -qa|grep mysql);do rpm -e $i --nodeps;done
for i in $(rpm -qa|grep mariadb);do rpm -e $i --nodeps;done
rm -rf /var/lib/mysql && rm -rf /etc/my.cnf

# 安装Mysql8的yum源

yum localinstall https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm

# 安装MySQL8服务端

yum install mysql-community-server
  • 如果报错 失败的软件包是:mysql-community-client-8.0.32-1.el7.x86_64
  • 原因是Mysql的GPG已升级,要重新获取
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

升级GPG 再次安装即可

# 启动服务和设置自动启动

systemctl start mysqld
systemctl enable mysqld

# 查询初始化密码,重置密码

初次登录, 必须重置密码,密码需符合安全要求

grep 'temporary password' /var/log/mysqld.log
mysql -hlocalhost -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Qq+89416695';

# 测试连接,创建数据库

mysql -hlocalhost -uroot -p
create database chwdmsdb0 default character set utf8mb4 collate utf8mb4_general_ci;

# centos7 安装redis6并设置开机启动

# 解压安装包

cd /opt
tar -xzvf redis-6.2.10.tar.gz

# 编译并安装到指定目录

  • 安装依赖,gcc最低7以上版本
yum install gcc
  • 编译安装redis6
mkdir /opt/redis6
cd /opt/redis-6.2.10
make
make install PREFIX=/opt/redis6

# 指定配置文件启动

  • 修改配置文件
vi /opt/redis6/redis.conf
  • 成集云redis配置
# redis 密码
requirepass password
# key 监听器配置
# notify-keyspace-events Ex
# 监听端口
port 16379
# 配置持久化文件存储路径
dir /data/redis
# 配置rdb
# 15分钟内有至少1个key被更改则进行快照
save 900 1
# 5分钟内有至少10个key被更改则进行快照
save 300 10
# 1分钟内有至少10000个key被更改则进行快照
save 60 10000
# 开启压缩
rdbcompression yes
# rdb文件名 用默认的即可
dbfilename dump.rdb

# 后台启动
daemonize yes

# 开启aof
appendonly yes
# 文件名
appendfilename "appendonly.aof"
# 持久化策略,no:不同步,everysec:每秒一次,always:总是同步,速度比较慢
# appendfsync always
appendfsync everysec
# appendfsync no
  • 启动redis
/opt/redis6/bin/redis-server /opt/redis6/redis.conf

# 设置开机自动启动

  • 复制启动脚本到init目录
cp /opt/redis-6.2.10/utils/redisredis_init_script /etc/init.d/redis
  • 修改启动配置文件
vi /etc/init.d/redis
  • 成集云redis启动配置
#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.

### BEGIN INIT INFO
# Provides:     redis_6379
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    Redis data structure server
# Description:          Redis data structure server. See https://redis.io
### END INIT INFO

REDISPORT=16379
EXEC=/opt/redis6/bin/redis-server
CLIEXEC=/opt/redis6/bin/redis-cli

PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/opt/redis6/redis.conf"

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
        ;;
    stop)
        if [ ! -f $PIDFILE ]
        then
                echo "$PIDFILE does not exist, process is not running"
        else
                PID=$(cat $PIDFILE)
                echo "Stopping ..."
                $CLIEXEC -p $REDISPORT shutdown
                while [ -x /proc/${PID} ]
                do
                    echo "Waiting for Redis to shutdown ..."
                    sleep 1
                done
                echo "Redis stopped"
        fi
        ;;
    *)
        echo "Please use start or stop as first argument"
        ;;
esac
  • 设置开机启动
cd /etc/init.d/
chkconfig redis on
systemctl start redis

# 时间同步设置

# 安装ntpdate

yum install ntpdate

# 从阿里云ntp服务器同步时间

也可以设置其他的ntp服务器(如中国国家授时中心:210.72.145.44)或者自己搭建的ntp服务器

ntpdate ntp1.aliyun.com

# crontab开启定时同步

echo "*/10 * * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1" >> /var/spool/cron/root