最小化安装,生成快照 root/root
网络配置,
🌝#配置命令别名(进入网卡配置目录)
cat << eof >> /etc/profile
alias cdif='cd /etc/sysconfig/network-scripts/'
eof
source /etc/profile
cdif
虚拟机网卡:桥接模式
🌝#配置网卡参数
vi ifcfg-eth0
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.0.180
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
DNS1=192.168.0.1
🌝#关闭防火墙和selinux,重启网卡
service iptables stop
setenforce 0
vi /etc/sysconfig/selinux
SELINUX=disabled
#SELINUXTYPE=targeted
service network restart
ping www.baidu.com
linux系统基本优化,
🌝#安装基本网络工具 开发工具 各语言编译器
yum install wget vim net-tools -y
yum groupinstall "Development tools" -y
yum -y install gcc wget gcc-c++ automake autoconf libtool libxml2-devel libxslt-devel perl-devel perl-ExtUtils-Embed pcre-devel openssl-devel
🌝#配置yum 及 epel源
yum clean all
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS6-Base-163.repo
yum makecache
yum install https://mirrors.tuna.tsinghua.edu.cn/epel/6/x86_64/epel-release-6-8.noarch.rpm -y
yum makecache
🌝#ssh免密码登陆配置
cd ~
ssh-keygen -t rsa
ll ~/.ssh/
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.100.10 #A主机生成一对私钥和公钥,把A的公钥上传到B主机,B主机可不用密码访问A主机。
🌝#更改字符集
cp /etc/sysconfig/i18n /etc/sysconfig/i18n.bak
echo 'LANG="en_US.UTF-8"' > /etc/sysconfig/i18n
source /etc/sysconfig/i18n
🌝#NTP时钟同步
ntpdate time.windows.com
crontab -e
00 01 * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1 #计划任务去更新,客户端要service crond stop 关闭crond服务
🌝#精简开机自启服务
(筛选出运行级别为3的自启服务并关闭自启)
for i in ` chkconfig --list |grep 3:on |awk '{print $1}' ` ;do chkconfig --level 3 $i off ;done
(只开启crond、sshd、network、syslog自启动)
for i in {crond,sshd,network,rsyslog} ;do chkconfig --level 3 $i on ;done
🌝#锁定关键系统文件
chattr +ai /etc/passwd
chattr +ai /etc/shadow
chattr +ai /etc/group
chattr +ai /etc/gshadow
chattr +ai /etc/inittab
for i in {paawd,shadow,group,gshadow,inittab} ;do chattr +ai /etc/$i ; done
🌝#系统参数优化
(调整文件描述符 /etc/security/limits.conf)
增加文件描述符打开数
echo '* - nofile 65535' >>/etc/security/limits.conf
(TCP参数优化 /etc/sysctl.conf)
[ -f /etc/sysctl.conf.bak ] && /bin/cp /etc/sysctl.conf.bak /etc/sysctl.conf.bak.$(date +%F-%H%M%S) || /bin/cp /etc/sysctl.conf /etc/sysctl.conf.bak
cat << EOF >> /etc/sysctl.conf
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 4000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_orphans = 16384
EOF
sysctl -p /dev/null 2>&1
🌝#升级有漏洞的软件版本
(升级openssl、openssh、bash等漏洞)
yum update -y openssl openssh bash
🌝#命令审计
cp /etc/profile /etc/profile.bak
vi /etc/profile
HISTTIMEFORMAT="%F %T `whoami` "
export HISTIMEFORMAT
export LANG="zh_CN.UTF-8"
mkdir -p /var/log/usermonitor/
echo "#########" >/var/log/usermonitor/usermonitor.log
chown nobody:nobody /var/log/usermonitor/usermonitor.log
chmod 002 /var/log/usermonitor/usermonitor.log
chattr +a /var/log/usermonitor/usermonitor.log
vi /etc/profile
export HISTORY_FILE=/var/log/usermonitor/usermonitor.log
export PROMPT_COMMAND='{ date "+%Y-%m-%d %T ##### $(who am i |awk "{print \$1\" \"\$2\" \"\$5}") #### $(id|awk "{print \$1}") #### $(history 1 | { read x cmd; echo "$cmd"; })"; } >>$HISTORY_FILE'
source /etc/profile
tail -f /var/log/usermonitor/usermonitor.log
🌝#修改ssh端口
sed - i 's/#Port=22/Port=2002/g' /etc/ssh/sshd_config
service sshd restart
iptables -A INPUT -p tcp --dport 2002 -j ACCEPT
service iptables restart (这行和下面那行顺序不能反)
/etc/rc.d/init.d/iptables save
安装LNMP,
参考 https://help.aliyun.com/document_detail/50700.html?spm=a2c4g.11186623.4.2.9ZByjw
✍✍✍ 安装Nginx
🌝 1、添加运行nginx服务进程的用户及组 ##########
groupadd -r nginx
useradd -r -g nginx nginx
(-r 系统账号 -g 指定组)
🌝 2、下载源码包、解压、编译、安装 ,创建目录 ##########
wget http://nginx.org/download/nginx-1.10.2.tar.gz
tar xzf nginx-1.10.2.tar.gz -C /usr/local/src
yum groupinstall "Development tools" -y
yum -y install gcc wget gcc-c++ automake autoconf libtool libxml2-devel libxslt-devel perl-devel perl-ExtUtils-Embed pcre-devel openssl-devel
cd /usr/local/src/nginx-1.10.2
./configure \
--prefix=/usr/local/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/tmp/nginx/client \
--http-proxy-temp-path=/var/tmp/nginx/proxy \
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
--http-scgi-temp-path=/var/tmp/nginx/scgi \
--user=nginx \
--group=nginx \
--with-pcre \
--with-http_v2_module \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_addition_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_random_index_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-http_auth_request_module \
--with-mail \
--with-mail_ssl_module \
--with-file-aio \
--with-ipv6 \
--with-http_v2_module \
--with-threads \
--with-stream \
--with-stream_ssl_module
make && make install
mkdir -pv /var/tmp/nginx/client
🌝 3、添加SysV启动脚本 ##########
vi /etc/init.d/nginx
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
killall -9 nginx
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac
:wq
🌝 4、添加脚本权限,添加到服务管理列表,并设置开机自启。 ##########
chmod +x /etc/init.d/nginx
chkconfig --add nginx
chkconfig nginx on
🌝 5、启动服务,浏览器访问 ##########
service nginx start
浏览器访问nginx服务器的IP,进入欢迎网页。
✍✍✍ 安装MySQL
🌝 1、准备编译环境 ##########
yum groupinstall "Server Platform Development" "Development tools" -y
yum install cmake -y
🌝 2、创建mysql数据存放目录,和相关用户及组 ,更改目录属主属组##########
mkdir /mnt/data
groupadd -r mysql
useradd -r -g mysql -s /sbin/nologin mysql
id mysql
chown -R mysql:mysql /mnt/data
🌝 3、下载编译安装 5.6.24版本 ##########
wget
tar xzf mysql-5.6.24.tar.gz -C /usr/local/src
cd /usr/local/src/mysql-5.6.24
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/mnt/data \
-DSYSCONFDIR=/etc \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_LIBWRAP=0 \
-DMYSQL_TCP_PORT=3306 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
make && make install
🌝 4、修改安装目录的属组为mysql ##########
chown -R mysql:mysql /usr/local/mysql
🌝 5、初始化数据库 ##########
/usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/mnt/data/
🌝 6、拷贝配置文件和启动脚本 ##########
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
cp support-files/my-default.cnf /etc/my.cnf
🌝 7、设置开机启动 ##########
chkconfig mysqld on
chkconfig --add mysqld
🌝 8、修改配置文件中的安装路径及数据目录存放路径 ##########
echo -e "basedir = /usr/local/mysql\ndatadir = /mnt/data\n" >> /etc/my.cnf
🌝🌝🌝🌝🌝安装到一半放弃,yum去安装
yum 安装吧 太费劲了。。。。
yum install libmcrypt libmcrypt-devel mhash mhash-devel libxml2 libxml2-devel bzip2 bzip2-devel
yum install php php-fpm php-mysql php-devel
yum -y install mysql mysql-server mysql-devel
service mysqld start
service php-fpm start
✍✍✍ 安装PHP
✍✍✍ 添加nginx对fastcgi的支持
🌝 首先备份默认的配置文件。
cp /etc/nginx/nginx.conf /etc/nginx/nginx.confbak
cp /etc/nginx/nginx.conf.default /etc/nginx/nginx.conf
🌝 编辑/etc/nginx/nginx.conf,在所支持的主页面格式中添加php格式的主页,类似如下:
location / {
root /usr/local/nginx/html;
index index.php index.html index.htm;
}
🌝 取消以下内容前面的注释:
location ~ \.php$ {
root /usr/local/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html/$fastcgi_script_name;
include fastcgi_params;
}
🌝
service nginx reload
在/usr/local/nginx/html/新建index.php的测试页面,内容如下。
<?php
$conn=mysql_connect('127.0.0.1','root','');
if ($conn){
echo "LNMP platform connect to mysql is successful!";
}else{
echo "LNMP platform connect to mysql is failed!";
}
phpinfo();
?>
浏览器访问 ip/index.php
yum安装完之后,访问php文件,一直报错file not found。
查看nginx的errror日志报错:
2018/04/30 18:56:01 [error] 6007#6007: *1 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client:", upstream: "fastcgi://127.0.0.1:9000", host: "192.168.0.180"
需要把下图的/scripts改为$document_root ,然后重启服务。

优化nginx,
########## 3、 ##########
########## 3、 ##########
########## 3、 ##########
########## 3、 ##########
安装JDK tomcat
✍✍✍ 下载源码包,并创建用户和相关目录
useradd www
mkdir -p /data/wwwroot/default
echo tomcat test > /data/wwwroot/default/index.jsp
chown -R www.www /data/wwwroot
wget https://mirrors.aliyun.com/apache/tomcat/tomcat-8/v8.5.30/bin/apache-tomcat-8.5.30.tar.gz
wget http://mirrors.linuxeye.com/jdk/jdk-8u141-linux-x64.tar.gz
✍✍✍ 安装JDK
mkdir /usr/java
tar xzf jdk-8u141-linux-x64.tar.gz -C /usr/java
vi /etc/profile
#set java environment
export JAVA_HOME=/usr/java/jdk1.8.0_141
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
:wq
source /etc/profile
java -version
✍✍✍ 安装Tomcat
tar xzf apache-tomcat-8.5.23.tar.gz
mv apache-tomcat-8.5.23 /usr/local/tomcat/
chown -R www.www /usr/local/tomcat/
说明:
在 /usr/local/tomcat/ 目录里:
bin 目录中存放 Tomcat 的一些脚本文件,包含启动和关闭 Tomcat 服务脚本。
conf:存放 Tomcat 服务器的各种全局配置文件,其中最重要的是 server.xml 和 web.xml。
webapps:Tomcat 的主要 Web 发布目录,默认情况下把 Web 应用文件放于此目录。
logs:存放 Tomcat 执行时的日志文件。
🌝 配置 server.xml 文件
cd /usr/local/tomcat/conf/
mv server.xml server.xml.bak
vi server.xml
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8006" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>
<Listener className="org.apache.catalina.core.AprLifecycleListener"/>
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml"/>
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="1000"
minSpareThreads="20"
acceptCount="1000"
maxHttpHeaderSize="65536"
debug="0"
disableUploadTimeout="true"
useBodyEncodingForURI="true"
enableLookups="false"
URIEncoding="UTF-8"/>
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="/data/wwwroot/default" unpackWARs="true" autoDeploy="true">
<Context path="" docBase="/data/wwwroot/default" debug="0" reloadable="false" crossContext="true"/>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
:wq
🌝 设置 JVM 内存参数
vi /usr/local/tomcat/bin/setenv.sh
JAVA_OPTS=’-Djava.security.egd=file:/dev/./urandom -server -Xms256m -Xmx496m -Dfile.encoding=UTF-8’
:wq
🌝 设置 Tomcat 自启动脚本
wget https://github.com/lj2007331/oneinstack/raw/master/init.d/Tomcat-init
mv Tomcat-init /etc/init.d/tomcat
chmod +x /etc/init.d/tomcat
sed -i 's@^export JAVA_HOME=.*@export JAVA_HOME=/usr/java/jdk1.8.0_141@' /etc/init.d/tomcat
chkconfig --add tomcat
chkconfig tomcat on
service tomcat start
🌝 浏览器访问ip:8080
优化tomcat,
tomcat7 优化和tomcat8 优化参数不同的。
Tomcat优化详细教程
如何优化tomcat配置(从内存、并发、缓存4个方面)优化
tomcat 8.x setenv.sh 配置
Java虚拟机的堆、栈、堆栈如何去理解?
java的gc为什么要分代?
java的新生代 老年代 永久代


🌝内存优化
【说明】
默认情况下,内存配置较低,并发到一定程度会报错:
严重:Exception invoking periodic operation: java.lang.OutOfMemoryError: Java heap space
严重:Error processing request java.lang.OutOfMemoryError: GC overhead limit exceeded
说明Tomcat已不能处理访问请求,内部GC也不行了。
【优化】
✌ 1、修改内存等JVM相关配置
• 一种:在bin/catalina.sh文件CLASSPATH=下面添加:
JAVA_OPTS="-server -XX:PermSize=512M -XX:MaxPermSize=1024M -Xms2048m -Xmx2048m"
• 另一种: 在bin/setenv.sh文件里配置:
JDK1.7的配置: JAVA_OPTS="-server -Xms256m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m -Dfile.encoding=UTF-8 -Duser.timezone=GMT+08 -Djava.security.egd=file:/dev/./urandom"
JDK1.8的配置: JAVA_OPTS="-server -Xms256m -Xmx1024m -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 -Duser.timezone=GMT+08 -Djava.security.egd=file:/dev/./urandom"
【解释】
-server 启用JDK的server版本
-Xms JVM初始时heap堆的最小内存
-Xmx JVM可用的heap堆的最大内存
-XX:PermSize JVM永久代大小
-XX:MaxPermSize JVM永久代最大
-Xms=-Xmx=服务器内存*70%,如部署tomcat,jboss在同一台服务器-Xms=-Xmx=服务器内存*80%*1/4
GC全称为Gabage Collection,英文意思就是垃圾回收。对于Java程序开发而言,内存管理是非常重要的一部分。当某一对象无法被其他的程序继续引用,为了不让它继续占用内存空间,Java虚拟机会定时检测并回收这样的对象,这也就是垃圾回收的原理。那么GC为什么要分代?下面的解释提供了较好的参考。
最重要的是年轻代,存放对象实例。分为三个区Eden(占80%)、存活区Survivor0(占10%)、存活区Survivor1(占10%) ; 还有老年代、永久代(JDK1.6后已经取消)
新生代主要存放的是哪些很快就会被GC回收掉的或者不是特别大的对象。
老年代则是存放那些在程序中经历了好几次回收仍然还活着或者特别大的对象。
永久代放着一些被虚拟机加载的类信息,静态变量,常量等数据。
【报错解决】
1.8版本会报错:
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=512M; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=1024m; support was removed in 8.0
-XX:PermSize和-XX:MaxPermSize在jdk1.8中被弃用了,使用-XX:MetaspaceSize和-XX:MaxMetaspaceSize替代。
所以此时VM参数正确应为:-Xmx2048m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=768m -Xss2m
🌝 2、配置优化
1.Connector优化
Connector是连接器,负责接收客户请求,响应回复。默认情况下,只支持200线程访问,超过将等待或超时丢弃。
修改TOMCAT_HOME/conf/server.xml,打开server.xml找到Connector 标签项。
【默认配置】
<Connector port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
【优化配置】
<Connector port="8080"
protocol="HTTP/1.1"
maxThreads="1000"
minSpareThreads="100"
acceptCount="1000"
maxConnections="1000"
connectionTimeout="20000"
maxHttpHeaderSize="8192"
tcpNoDelay="true"
compression="on"
compressionMinSize="2048"
disableUploadTimeout="true"
redirectPort="8443"
enableLookups="false"
URIEncoding="UTF-8" />
【解释】
port Tomcat监听端口,网站的访问端口,默认8080
protocol 协议类型有四种:BIO、NIO、NIO2、APR。默认BIO性能最差。
protocol="org.apache.coyote.http11.Http11NioProtocol" //NIO
protocol="org.apache.coyote.http11.Http11Nio2Protocol" //NIO2
protocol="org.apache.coyote.http11.Http11AprProtocol" //APR (提升对静态文件或者SSL的处理性能)
maxThreads 连接器可创建用来处理请求的线程最大数。一般设置成1000,默认200,不是越大越好,追求最优值。(重要配置) 更详细,查看https://blog.csdn.net/u012562943/article/details/51441157
QPS:每秒查询率。来衡量服务器性能,单位时间内处理流量的参数。QPS = 并发数/平均响应时间 一个系统的吞吐量由QPS和并发数两个因素决定。
minSpareThreads 线程最小运行数,默认10。
acceptCount 请求处理线程用尽时,传入连接请求的最大队列长度。一般设为maxThreads的1倍或0.5倍。默认为100。
maxConnections 服务器接受和处理的最大连接数。达到时,只接受不处理。NIO与NIO2的默认值为10000,APR默认值为8192。
connection Timeout 等待的超时时间。请求已接受,未被处理。设为30000,默认60000毫秒。
maxHttpHeaderSize HTTP头部请求和响应的最大字节。默认8192(8KB)
tcpNoDelay true时,服务器socket会设置TCP_NO_DELAY选项,可提高性能。默认为ture。
compression gzip压缩。off(不压缩)、on(压缩)、force(强制压缩)三个选项。默认关闭。
compressionMinSize 超过这个值压缩。默认2048(2K),单位byte字节
disableUploadTimeout 允许servlet Container在一个servlet执行时,使用一个更长的超时时间。默认为false。
enableLookups 关闭DNS反向查询。
URIEncoding URL编码字符集。
2.BIO、NIO、APR
同步异步 对事
同步:事儿好了,不通知。
异步:事儿好了,主动通知。
阻塞非阻塞 对人
阻塞:等着。
非阻塞:不等,去干别的。
并不是说 BIO的性能就一定不如 NIO,这几种类型 Connector之间并没有明显的性能区别,它们之间实现流程和原理不同,所以它们的选择是需要根据应用的类型来决定的。
BIO更适合处理简单流程,如程序处理较快可以立即返回结果。简单项目及应用可以采用BIO。
NIO更适合后台需要耗时完成请求的操作,如程序接到了请求后需要比较耗时的处理这已请求,所以无法立即返回结果,这样如果采用BIO就会占用一个连接,而使用NIO后就可以将此连接转让给其他请求,直至程序处理完成返回为止。
APR可以大大提升Tomcat对静态文件的处理性能,同时如果你使用了HTTPS方式传输的话,也可以提升SSL的处理性能。
3.线程池
Executor代表一个线程池,在Tomcat组件之间共享,线程池好处是减少了创建销毁现成的开销,提高利用率。
【默认配置】
无
【线程池优化】
1)在Service标签中配置Executor
<Service name="Catalina">
<Executor name="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="1000"
minSpareThreads="100"
maxIdleTime="60000"
maxQueueSize="Integer.MAX_VALUE"
prestartminSpareThreads="false"
threadPriority="5"
className="org.apache.catalina.core.StandardThreadExecutor" />
【解释】
name 线程池名
namePrefix 创建的每个线程名前缀,线程名=前缀+线程号
maxThreads 池中最大线程数
minSpareThreads 活跃线程数,核心池的线程数,这些线程不会被销毁,一直存在。
maxIdleTime 线程空闲时间,超时就销毁。默认6000毫秒(1分钟)
maxQueueSize 在被执行前,最大线程排队数。 默认Int无限大,最好不要修改。
prestartminSpareTheads 启动线程池时是否启动活跃线程数部分线程。默认false,不启动。
threadPriority 线程池中线程优先级,默认5,范围1-10。
className 线程池实现类。
2)线程池配置完,还要在Connector中指定:
<Connector executor="tomcatThreadPool"
port="20003" protocol="HTTP/1.1"
acceptCount="800"
minProcessors="300"
maxProcessors = "1000"
redirectPort="8443" />
4.Listener
另一个影响Tomcat性能的因素时内存泄漏。
Server标签中可配置多个Listerner,其中JreMemoryLeakPreventionListener 是用来预防JRE内存泄漏的。
默认已经配置了此listener的。
🌝 3、组件优化
1.APR
APR(Apache Portable Runtime)是一个高可移植库,它是Apache HTTP Server 2.x的核心。APR有很多用途,包括访问高级 IO功能(例如sendfile,epoll和OpenSSL),OS级别功能(随机数生成,系统状态等等),本地进程管理(共享内存,NT管道和UNIX sockets)。这些功能可以使Tomcat作为一个通常的前台WEB服务器,能更好地和其它本地web技术集成,总体上让Java更有效率作为一个高性能web服务器平台而不是简单作为后台容器。
2.Tomcat Native
Tomcat可选组件,它可以让 Tomcat使用 Apache 的 APR包来处理包括文件和网络IO操作,从而提升性能及兼容性。
🌝 4、性能测试
1.Jmeter 压力测试工具
压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。 它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、[数据库](http://lib.csdn.net/base/14 "MySQL知识库")、FTP 服务器, 等等。
能够对HTTP和FTP服务器进行压力和性能测试, 也可以对任何数据库进行同样的测试(通过JDBC),Jmeter支持以下服务器协议类型测试:
(1)能够对HTTP和FTP服务器进行压力和性能测试, 也可以对任何数据库进行同样的测试(通过JDBC),Jmeter支持以下服务器协议类型测试:
• Web - HTTP, HTTPS
• SOAP / REST
• FTP
• Database via JDBC
• LDAP
• Message-oriented middleware (MOM) via JMS
• Mail - SMTP(S), POP3(S) and IMAP(S)
• MongoDB (NoSQL)
• Native commands or shell scripts
• TCP
(2)完全的可移植性和100% 纯java。
(3)完全 Swing 和轻量组件支持(预编译的JAR使用 javax.swing.*)包。
(4)完全多线程 框架允许通过多个线程并发取样和 通过单独的线程组对不同的功能同时取样。
(5)精心的GUI设计允许快速操作和更精确的计时。
(6)缓存和离线分析/回放测试结果。
安装及使用git,
🌝概念及名词:
►工作区:能看的到的目录,如 learngit
►暂存区:git add的文件放到这里。
►版本库:隐藏目录.git是git的版本库。这里存放着:
- 称为 stage(或叫index)的暂存区。
- 第一个分支 master。
- 一个指向master的叫HEAD的指针。
🌝SVN和Git的区别:
SVN是集中式的,Git是分布式的。
SVN只有一个集中管理的服务器,保存所有文件的修订版本。其他客户端都连到它去取出或提交更新。
Git每一个终端都是仓库,客户端不只是提取文件快照,是把原始代码库完整的镜像到本地。每一次提取,都是对代码仓库的完整备份。
简单来说,SVN只关心文件内容的具体差异,每次记录哪些文件更新了,更新了哪些内容。
Git只关心文件数据的整体是否变化,不记录具体的差异内容。
SVN按文件存储,Git把内容按元数据方式存储。Git没有全局版本号,而SVN有。
还有一点,SVN必须连网工作,Git clone到本地后,可以离线,pull、push时再连网。
Git和SVN分支不同。
Git跟踪并管理的是修改,而非文件。
Linux默认安装了git,没有的话yum install。
参考liaoxuefeng.com
🌝 创建及初始版本库,提交:
git add:把要提交的所有修改放到暂存区
git commit:一次性把暂存区的所有修改提交到分支 (注意只提交暂存区,也就是提交git add后的修改)
► 创建一个版本库 mkdir learngit && cd learngit
► 初始化git仓库 git init
► 添加文件到版本库 echo "line 1" > one.txt ; git add one.txt
► 把文件提交到仓库 git commit -m "a new file"
► 修改文件内容 echo "line 2" >> one.txt
► 查看仓库当前状态 git status (工作目录和缓存区的状态)
► 查看内容差异 git diff one.txt (库中保存的和更改后保存在缓存区中的差异)
► 提交修改 git add one.txt ; git commit -m "add 2"
► 查看提交的日志历史 git log 或 git log --pretty=oneline (显示一行)
🌝 时光穿梭
► 版本回退 git reset --hard 前七位版本号 或 git reset --hard HEAD~1 或 git reset --hard HEAD^
► 撤销修改
• 丢弃工作区修改 git checkout -- one.txt
情况1:还没放到缓存区(还没git add),就撤销到和版本库一样。
情况2:已添加到缓存区后(已经git add),又做了修改,撤销到刚添加到缓存区的状态。可以继续用 git reset HEAD one.txt 把修改从暂存区撤销,放回工作区。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
• 丢弃暂存区修改 git reset HEAD one.txt
► 删除文件 (删除也是一种修改,所以要提交。)
• 系统中删除是 rm -f test.txt
• 从版本库删除是 git rm test.txt ; git commit -m "remove test.txt"
• 删错只能回到最新版本 git checkout -- test.txt
• https://www.yiibai.com/git/git_reset.html
🌝 远程仓库
✌ 01 添加远程库
关联一个远程库 [root@192 learngit]# git remote add origin git@git.com:dadahai314/learin.git
第一次推送master分支的所有内容 [root@192 learngit]# git push -u origin master -f
GitHub提供Git仓库托管服务。
► 1、创建ssh key
• ssh-keygen -t rsa -C "usefor github"
• 复制 id_rsa.pub的文件内容,浏览器打开 github设置 --> SSH and GPG keys --> new SSH Keys,把公钥粘贴进去。
► 2、添加远程库
• 登陆Github,点击 + New repository --> 填入自定义的Repository name
► 3、本地仓库的内容推送到GitHub仓库
• git remote add origin git@github.com:dadahai314/learngit.git (在本地执行)
• 添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
► 4、把本地库的所有内容推送到远程库上
• git push -u origin master -f
• -f 强制覆盖,不然一般会报错,因为默认在web端创建repo后里面不是空的,有readme文件之类的,强制覆盖即可。
• 也可以通过如下命令进行代码合并【注:pull=fetch+merge] git pull --rebase origin master
✌ 02 从远程库克隆
► github上创建个新库gitskills
► 把远程库克隆到本地 git clone git@github.com:dadahai314/gitskills.git (报错的话,关掉代理或者用https协议)






🌝 分支管理
• 每次提交串成一条时间线,一个时间线就是一个分支。
• 默认情况,HEAD指向master分支,master指向提交。每次提交master向前一步。
• HEAD指向哪儿,哪儿就是当前分支。
• 新建一个分支dev,Git就会同时新建一个指针dev指向master,HEAD则指向dev。此时对工作区的提交和修改只针对dev分支,新提交一次后,dev向前一步,而master指针不动。
• 合并就是把master指向dev的当前提交。
► 创建与合并分支 回到master再合并
1、创建并切换分支 git checkout -b dev 等同于git branch dev && git checkout dev -b选项 创建并切换
2、查看当前分支 git branch 当前分支前有个*号
3、在dev上修改文件并提交 echo "Creating a new branch is quick." >> readme.txt ; git add readme.txt ; git commit -m "branch test" ; git checkout master
4、dev分支合并到master git merge dev
5、删除分支dev(合并后) git branch -d dev
► 解决冲突
1、创建分支 git checkout -b feature1
2、修改提交 vi readme.txt ; git add readme.txt ; git commit -m "AND simple"
3、切换分支,修改提交 git checkout master vi readme.txt ; git add readme.txt ; git commit -m "& simple"
4、合并分支 git merge feature1
5、查看状态 git status
6、手动解决冲突 vi readme.txt ; git add readme.txt ; git commit -m "conflict fixed"
7、图形查看log git log --graph --pretty=oneline --abbrev-commit
8、删除分支 git branch -d feature1
► 分支管理策略
• 合并分支默认用Fast forward模式时,删除分支后,会丢掉分支信息。
• --no-ff参数禁用Fast forward,会在merge时生成要给新的commit,可以历史中看到分支信息。git merge --no--ff
1、创建并切换dev分支 git checkout -b dev
2、修改文件并提交 vi readme ; git add readme.txt ; git commit -m "add merge"
3、切回master合并分支 git checkout master ; git merge --no-ff -m "merge with no-ff" dev
4、查看分支历史 git log --graph --pretty=oneline --abbrev-commit
*** 生产中,master是非常稳定的,只能用来发布新版本,干活都是在dev分支上。***
► Bug分支
• bug可通过一个新的临时的分支来修复,修复后合并分支,并删除临时分支。
• 当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。
• git stash 把暂存区的文件和状态先储存到栈上,把暂存区临时清空
• git stash list 查看出储存栈
• git stash apply 恢复储存栈,不删除stash内容
• git stash pop 恢复储存栈,同时删除stash内容
# git checkout dev ; echo "test stash" >> readme.txt ; git add readme.txt ; 在dev分支干活,已经放到暂存区,还没提交
# git status 查看git状态,此时,暂存区已经有修改,但是还不想提交
# git stash 把暂存区储存栈上
# git checkout master ; git checkout -b issue-101 ; vi readme.txt ; git add readme.txt ; git commit -m "fix bug 101" 切到master,创建bug分支101,修改文件修复bug并提交
# git checkout master ; git merge --no-ff -m "merged bug fix 101" issue-101 ; git branch -d issue-101 切到master,合并分支到master,删除分支
# git checkout dev 切到dev分支继续干活
# git status 查看暂存区,此时是干净的
# git stash list 查看储存栈
# git stash pop 恢复并删除储存栈
# git stash list
# git stash apply stash@{0}
► Feature分支
• 开发时会不断有新的功能feature添加进来。每添加一个功能,最好新建一个分支,开发好后再合并,删除分支。
• 如果修改提交后,分支没有合并就删除,会丢掉修改。
• git branch -D feature-vulcan 强制删除分支
# git checkout -b feature-vulcan ; vi vulcan.py ; git add vulcan.py ; git status ; git commit -m "add feature vulcan" 创建分支,修改并提交
# git checkout dev 回到dev,准备合并
# git branch -D feature-vulcan 强制删除分支
► 多人协作
远程仓库默认名是 origin
远程克隆仓库,就是把本地的master分支和远程的master分支对应起来。
1、查看远程库
# git remote -v
2、推送分支 push
# git push origin master
推送master分支 (如果报错403forbidden,vi .git/config 文件,修改 url = 为 url = ssh://git@github.com/dadahai314/gitskills.git)
# git push origin dev
推送dev分支
3、抓取分支 pull
在磁盘的其他目录模拟另外一个人A
# git clone git@github.com:dadahai314/gitskills.git
# git branch 只看到master分支
# git checkout -b dev origin/dev 要开发dev分支,就要创建远程origin的dev分支到本地
# git branch 就能看到dev分支了
A人修改file文件,并已经成功推送了提交,B也修改了file文件,推送时会冲突。解决办法是先git pull最新的到本地,在本地合并后(合并时可能需要手动解决冲突),再git push。
B人:
# vi readme.txt ; git add readme.txt ; git commit -m "asdf" 报错,因为冲突,所以要先git pull
# git pull 报错,因为没有指定本地dev分支和远程origin/dev分支的链接
# git branch --set-upstream dev origin/dev 指定本地dev分支和远程origin/dev分支的链接
# git pull 此时pull成功,但是合并有冲突,手动解决冲突。
# vi ; git add ; git commit -m "" 修改并提交
# git push origin dev 推送到远程仓库
因此,多人协作的工作模式通常是这样:
1. 首先,可以试图用`git push origin branch-name`推送自己的修改;
2. 如果推送失败,则因为远程分支比你的本地更新,需要先用`git pull`试图合并;
3. 如果合并有冲突,则解决冲突,并在本地提交;
4. 没有冲突或者解决掉冲突后,再用`git push origin branch-name`推送就能成功!
如果`git pull`提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令`git branch --set-upstream branch-name origin/branch-name`。
* 查看远程库信息,使用`git remote -v`;
* 本地新建的分支如果不推送到远程,对其他人就是不可见的;
* 从本地推送分支,使用`git push origin branch-name`,如果推送失败,先用`git pull`抓取远程的新提交;
* 在本地创建和远程分支对应的分支,使用`git checkout -b branch-name origin/branch-name`,本地和远程分支的名称最好一致;
* 建立本地分支和远程分支的关联,使用`git branch --set-upstream branch-name origin/branch-name`;
* 从远程抓取分支,使用`git pull`,如果有冲突,要先处理冲突。
🌝 标签管理
► 创建标签
► 操作标签
🌝 使用GitHub ssh / https
# git clone git@github.com:用户/仓库名.git
如:git clone git@github.com:michaelliao/sinaweibopy.git
# git clone https://github.com/用户/仓库名.git
如:git clone https://github.com/michaelliao/sinaweibopy.git
🌝 使用码云
►
🌝 自定义Git
► 忽略特殊文件
► 配置别名
1、配置user.name user.emal
2、让Git显示颜色
# git config --global color.ui true
3、配置忽略文件 (有些文件放到Git工作目录,但不希望提交,配置.gitignore文件)
4、
► 搭建Git服务器
安装git服务 yum install git
创建用户不许登陆 useradd git -s /sbin/nologin
把需要登陆的公钥放到/home/git/.ssh/authorized_keys文件里
初始化git仓库 mkdir mygit ; cd mygit ; git init
更改目录属主属组 chown -R git.git .git (.git目录是工作目录)
克隆远程仓库 git clone git@server:/srv/仓库名.git
► 管理公钥
如果团队很小,把每个人的公钥收集起来放到服务器的`/home/git/.ssh/authorized_keys`文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用[Gitosis](https://github.com/res0nat0r/gitosis)来管理公钥。
* 搭建Git服务器非常简单,通常10分钟即可完成;
* 要方便管理公钥,用[Gitosis](https://github.com/sitaramc/gitolite);
* 要像SVN那样变态地控制权限,用[Gitolite](https://github.com/sitaramc/gitolite)。

查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
git log --graph命令可以看到分支合并图。
安装及使用docker,
http://blog.51cto.com/xiangcun168/1957360
Docker 最低支持 CentOS 7, 推荐Centos7.3版本
🌝 一、centos7 安装docker
► 1、配置yum源
# tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
► 2、安装Docker
yum update
yum install docker-engine
► 3、启动Docker引擎
systemctl enable docker
systemctl start docker
🌝 二、本地私有仓库Registry的搭建与验证
► 1、获取registry镜像
docker pull registry:2.1.1
► 2、启动registry容器
docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:2.1.1
docker ps
curl http://127.0.0.1:5000/v2/
► 3、上传镜像
docker pull nginx:latest
docker images
docker tag nginx nginx:v2 以nginx镜像为基础,新建一个标签为v2的nginx镜像仓库。它们的image id是一样的(同样的内容),只是不同的标签罢了。
创建docker tag镜像
docker tag nginx:v2
127.0.0.1:5000/nginx:v2
docker images
docker push 127.0.0.1:5000/nginx:v2
curl http://192.168.0.164:5000/v2/_catalog
► 4、下载镜像
docker images
docker rmi -f xxxxxx
docker images
docker pull 127.0.0.1:5000/nginx:v2
docker images
🌝 三、创建自定义镜像
► 1、先拉一个nginx镜像
docker pull nginx
docker images
► 2、启动nginx,映射出端口
docker run --name webserver -d -p 80:80 nginx
docker ps
curl http://127.0.0.1
► 3、进入nginx docker里,修改东西
docker exec -it webserver bash
echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
exit
curl http://127.0.0.1
► 4、保存成镜像
docker commit --author "dadahai" --message "diy nginx" webserver webserver:v2
docker images
docker run --name web2 -d -p81:80 webserver:v2
curl http://127.0.0.1
► 和源镜像对比不同
docker diff webserver
docker history webserver:v2
🌝 四、Dockerfile创建自定义镜像
请在空文件夹下,用Dockerfile创建Docker。
Dockerfile 语法 参考:https://www.cnblogs.com/lighten/p/6900556.html
1、 在/opt/centos/目录下,创建Dockerfile,编写Dockerfile文件
mkdir -pv /opt/centos/
vim /opt/centos/Dockerfile
# Centos based container with Java and Tomcat
From 127.0.0.1:5000/centos:v2
MAINTAINER dadahai
ENV REFRESHED_AT 2018-5-4
# Prepare environment
ENV JAVA_HOME /opt/jdk1.8.0_131
ENV JRE_HOME /opt/jdk1.8.0_131/jre
ENV CLASSPATH .:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$JRE_HOME/bin:$PATH
RUN mkdir -p /data/tomcat8
#RUN yum install -y wget
# 建议用本地yum源,取包快。网络yum也行。
#RUN wget http://192.168.0.164:1234/jdk-8u131-linux-x64.tar.gz && tar -xvf jdk-8u131-linux-x64.tar.gz -C /opt/ #下载10.144安装包,解压
# Install Tomcat
#RUN wget http://192.168.0.164:1234/apache-tomcat-8.5.30.tar.gz && tar -xvf apache-tomcat-8.5.30.tar.gz -C /data/ && mv /data/tomcat /data/tomcat8
#不用yum装,用ADD 把本地文件复制到docker相关目录,因为用yum还要把镜像里配置好IP
#ADD 只把目录下的文件复制过去,不复制目录本身。。
ADD jdk1.8.0_131/ /opt/
ADD tomcat8/ /data/tomcat8
#RUN chmod +x /data/tomcat8/bin/*.sh 老是报错还没解决,先不管了。。。。。。。。。。。。。
VOLUME ["/data/tomcat8/webapps/"]
EXPOSE 8090 #对外提供服务的端口
EXPOSE 8009
ENTRYPOINT
#启动tomcat,注意docker里的进程要一直挂起,不然会推退出。
["/bin/sh /data/tomcat8/bin/catalina.sh", "run"]
:wq
► 来生成Docker (在Dockerfile所在的目录执行)
docker build -t test/test_app .
docker images
2、端口映射
► 启动docker并把端口8090映射出来 (端口映射是基于iptables的,所以iptables服务要起来)
docker run -d -p 8090:8090 --restart=always --name tomcat test/test_app
docker ps
3、卷挂载,即docker目录挂载到宿主机 用 -v
► 先关闭运行的docker
docker stop 92xxxx (docker进程号)
► 把宿主机的/usr/share/nginx/html 挂载到docker的/data/tomcat8/webapps/ROOT下 (左边是宿主机,右边docker)
docker run -d -v /usr/share/nginx/html:/data/tomcat8/webapps/ROOT -p 8090:8090 --restart=always --name tomcatapp test/test_app
docker ps
docker exec -it 987xxx /bin/bash #回到docker
cd /data/tomcat8/webapps/ROOT/ && ls #验证是否挂载成功
🌝 五、Docker常用命令总结
1、开启、停止、重启container(start、stop、restart)
docker start 容器id
docker stop 容器id
docker restart 容器id
2、连接到正在运行中的cantainer(attach)
docker attach --sig-proxy=false 容器id
3、查看image或container的底层信息(inspect)
docker inspect --format='{\{.NetworkSettings.IPAddress}}' 容器ID
4、删除一个或多个container、image(rm、rmi)
docker rm 容器名称
docker rmi 镜像id -f
docker rm $(docker ps -a -q) #删除所有已停止的容器
5、docker build生成新的镜像image
docker build -t 镜像名 . #最后有个. 别忘了
6、给镜像打上标签(tag)
docker tag 镜像id abc #将同意镜像id的所有tag,合并为abc
docker tag Registry/Repos:Tag New_Registry/New_Repos:New_Tag #新建一个tag,保留旧的那条记录
7、查看容器的信息container(ps) 可以看到ONTAINER ID、NAME、IMAGE NAME、端口开启及绑定、容器启动后执行的COMMNAD
docker ps 查看当前正在运行中的container
docker ps -a 查看包括已经停止的所有容器
docker ps -l 显示最新启动的一个容器(包括已停止的)
8、查看容器中正在运行的进程(top)
9、docker与宿主机文件互拷
docker cp /www/runoob 96f7f14e99ab:/www/ 将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下。
docker cp /www/runoob 96f7f14e99ab:/www 将主机/www/runoob目录拷贝到容器96f7f14e99ab中,目录重命名为www。
docker cp 96f7f14e99ab:/www /tmp/ 将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中。
10、docker容器保持后台运行的两种方式
1) run一个容器: (推荐方法)
[root@localhost ~]# docker run -dit --hostname centos --name centos --restart always a8493f5f50ff /bin/bash -dit 是后台运行、交互模式、分配终端,容器启动后不会退出。 如果没有it参数,run 一个容器以后,docker ps -a 容器状态就exited了 。--restart always 容器可以随docker服务启动而启动
2)run 一个容器,并一直发送ping包
[root@localhost ~]# docker run -d --name test --hostname test a8493f5f50ff ping 127.0.0.1
安装及使用svn,
安装及使用ansible
安装及使用puppet
MySQL操作
主从复制
优化
等等
java应用的性能优化,故障排错
Redis服务器 集群
ELK
Jenkins
gitlab+jenkins+maven+docker持续集成,也有docker
使用GitLab、Jenkins、Docker建立快速持续化集成交付部署方案(一)
https://blog.csdn.net/qq_35904833/article/details/78813638
gitlab+jenkins+maven+docker持续集成
一、Jenkins安装配置
二、maven安装配置
三、自动构建
四、Extended E-mail Notification配置
五、Maven项目构建配置
六、.Jenkins获取git tags代码进行持续集成
七、.Jenkins Pipeline持续集成
...
Hadoop了解下、tomcat排错、nginx排除、系统排错、pyhton自动化工具
其他
#时间
[root@localhost mmm]# date +%Y%m%d%H%M%S
20180430160607
[root@localhost mmm]# date +%F\ %T
2018-04-30 16:30:11
#替换
sed -i 's/aa/bb/g' /home/abc.txt
#循环
for i in {a,b,c} ;do echo this is %i ;done
for i in `chkconfig --list |grep 3:on|awk '{print $1}'` ;do chkconfig --level 3 $i off ; done
#awk截取
chkconfig --list |grep 3:on |awk '{print $1}'
#不看文件的备注内容
grep -Ev "^#|^$" /etc/profile
# 往文件内追加
cat >> a.txt << EOF
111
222
333
EOF
切记!!!!!!
在追加内容是命令时,不可以使用这种方式,必须用vi 文件,然后手动添加。!!!!!否则添加进去的是命令的执行结果,而非命令本身。。
如下示范:
[root@localhost mmm]# cat >> boy.txt << EOF
> cmd = `who am i`
> EOF
[root@localhost mmm]#
[root@localhost mmm]# cat boy.txt
cmd = root pts/1 2018-04-30 16:38 (192.168.0.176)
[root@localhost mmm]# 这里可以看到,添加的内容实际上是命令的执行结果,而非本来的命令。
简单方法:
echo "追加的内容" >> abc.txt
```
===================



网友评论