安装依赖:

yum -y install cmake bison bison-devel gcc gcc-c++ autoconf zlib zlib-devel libxml2 libxml2-devel ncurses-devel libtool-ltdl libtool-ltdl-devel make 

建立mysql用户:

groupadd mysql
useradd -r -g mysql mysql

编译:

cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DSYSCONFDIR=/usr/local/mysql -DWITH_INNOBASE_STORAGE_ENGINE=1 -DDEFAULT_CHARSET=utf8mb4 -DEXTRA_CHARSETS=all -DDEFAULT_COLLATION=utf8_general_ci -DMYSQL_USER=mysql -DMYSQL_TCP_PORT=3306 -DWITH_DEBUG=0
make -j 4 && make install
ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
chown -R mysql /usr/local/mysql/.
chgrp -R mysql /usr/local/mysql/.
cd /usr/local/mysql
chmod +x scripts/mysql_install_db
./scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --collation-server=utf8_general_ci
chown -R root /usr/local/mysql/.
chown -R mysql /usr/local/mysql/data
cp ./support-files/my-huge.cnf /usr/local/mysql/my.cnf
cp ./support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig --level 345 mysqld on

编辑mysql的配置文件
vi /usr/local/mysql/my.cnf,在[mysqld]标签里面加入:datadir=/usr/local/mysql/data
启动
service mysqld start
连接
mysql -uroot -proot@Mysql

本来就应该是这样了,但是测试环境本身存在一个mysql5.5,于是灾难就开始了
一切根源其实在于默认的配置文件,确切的说是路径问题,首先编译安装时要指定不同的目录

cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/maria -DSYSCONFDIR=/usr/local/maria -DWITH_INNOBASE_STORAGE_ENGINE=1 -DDEFAULT_CHARSET=utf8mb4 -DEXTRA_CHARSETS=all -DDEFAULT_COLLATION=utf8_general_ci -DMYSQL_USER=mysql -DMYSQL_TCP_PORT=3306 -DWITH_DEBUG=0
make -j 4 && make install

安装完成后修改 my.cnf 配置文件
port 和 socket 自然要修改,最好也指定一下 datadir

然后是修改服务脚本

cp ./support-files/mysql.server /etc/init.d/mariad

进入以后修改datadir和basedir并不会改变 my.cnf 的加载位置,一劳永逸的方法是在’start’)下面的mysqld_safe直接添加启动参数–defaults-file=/usr/local/maria/my.cnf
而且几乎每一项mysql的程序操作都要指定配置文件,否则会使用 /etc/my.cnf 配置文件造成冲突,严重的可能损毁数据库
然后是初始化数据库也要指定 –defaults-file=/usr/local/maria/my.cnf参数

最严重的一个问题,连接maria时一定要看下连接到的是哪台数据库,test环境亲测./mysql -P2206 -uroot -p 连接上的却是原本的mysql数据库而非maria数据库,测试环境就是卡在这里了好久,一个简单的方法就是其实进入控制台后查看前缀是 MySQL [(none)]> 还是 MariaDB [(none)]>

关于./mysql -P2206 -uroot -p 连接上的是原本的mysql数据库而非maria数据库的原因是:
linux上面mysql存在两种连接方式,一种是TCP/IP ,另一种是 socket 方式。
socket 方式性能更好但只允许本机访问,所以为了安全mysql和Maria推荐这种方式连接本机,具体到命令上就是
./mysql 不指定IP地址或者 localhost 的话,默认以 socket 方式连接,只有指定了IP地址才以 TCP/IP 方式连接。
而这里有一个坑,./mysql 默认使用 /etc/my.cnf 配置文件,所以执行 ./mysql -P2206 的时候实际是忽略端口,进而使用socket方式连接的,而因为默认加载的是 /etc/my.cnf 所以使用原来 mysql 的socket也就不为怪了。
所以要连接 maria 数据库有两种方法:
1、指定配置文件,./mysql –defaults-file=/usr/local/maria/my.cnf
2、指定 socket 文件,./mysql -S /tmp/maria.sock

另外mariadb 10 也不再支持log-slow-queries,改为slow-query-log-file

其它编译参数

cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/mydata/data/ \
-DSYSCONFDIR=/etc \
-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 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8_general_ci

cmake . -DMYSQL_UNIX_ADDR=/tmp/mariadb.sock \
-DSYSCONFDIR=/home/local/mariadb \
-DMYSQL_TCP_PORT=3309 \
-DEXTRA_CHARSETS=all \
-DMYSQL_USER=mariadb \
-DCMAKE_INSTALL_PREFIX=/home/local/mariadb \
-DMYSQL_DATADIR=/home/data/mariadb \
-DWITH_XTRADB_STORAGE_ENGINE=1 \
-DWITH_FEDERATEDX_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-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=utf8mb4 \
-DDEFAULT_COLLATION=utf8_general_ci

mysql版本需要5.5.3以上

原理分析:

UTF-8编码有可能是2、3、4个字节,而Mysql的utf8编码最多3个字节。Emoji表情是4个字节,进而出现问题。

后台报错:

Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x84' for column 'review' at row 1
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458)

解决方法:

1、修改mysql配置文件my.cnf,重启

[client]
default-character-set=utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
[mysql]
default-character-set=utf8mb4

2、修改需要添加库、表、字段的字符集

修改数据库字符集: ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

修改表的字符集: ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

修改字段的字符集: ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 如果只是某个字段需要 只需要修改那个字段的字符集就可以了

 

导入与导出

最好使用自带工具,导出时指定编码,否则导入时乱码

mysqldump –default-character-set-utf8mb4 –u 用户名 –p 数据库名 > 导出该文件的物理路径

 

附:RDS MySQL使用utf8mb4字符集存储emoji表情

 

这天打开某个页面提示:

WARNING: mysqli::real_connect(): Headers and client library minor version mismatch. Headers:50552 Library:50631……

猜测是php的mysql驱动与mysql server版本不一致造成的,上网一查这种可能性不小,于是检查了一下php的mysql client,使用的是默认mysql驱动,由于官方推荐mysqlnd,性能也更好,于是更换mysqlnd,重启php-fpm后解决

 

tmux分为三个层级:会话(session)、窗口(window)、窗格(pane)

tmux 开启tmux

tmux ls 显示已有tmux会话(等同Ctrl+b s)

tmux a(ttach-session) -t 数字或名字 进入指定tmux会话

会话

Ctrl+b s 显示已有tmux会话

Ctrl+b $ 重命名当前会话

窗口

Ctrl+b c(reate) 创建一个新的窗口

Ctrul+b , 重命名当前窗口

Ctrl+b 数字 直接跳到你按的数字所在的窗口

Ctrl+b d 临时断开会话

Ctrl+b & 退出当前窗口

Ctrl+b Ctrl+o 调换窗口位置,类似与vim 里的C-w

Ctrl+b n(ext) 切换到下一个窗口

Ctrl+b p(revious) 切换到上一个窗口

Ctrl+b l(ast) 最后一个窗口

Ctrl+b w 选择当前会话的窗口

窗格(布局)

Ctrl+b % 向右分割出来一个窗格

Ctrl+b ” 向下分割出来一个窗格

Ctrl+b 方向键 选择当前窗口中打开的会话

Ctrl+b (方向键) 不要松开Ctrl,方向键 – 调整窗格大小

Ctrl+b q – 显示窗格(布局)的编号

Ctrl+b ! 关闭所有窗格

Ctrl+b x 关闭当前窗格

Ctrl+b 空格键 – 采用下一个内置布局

Ctrl+b o 切换下一个窗格

其它

Ctrl+b ? 显示快捷键帮助

Ctrl+b t 钟表

Ctrl+b pageup/pagedo 翻页

去掉小圆点,当多终端同时使用同一个tmux session时,默认调整为最小的那个会话连接的窗口,如果确定没有其他人用,进入时使用 tmux a -d参数进入,如果进入后才发现,使用 : a -d 踢掉其它终端

 

配置文件(转载:http://www.cnblogs.com/scue/p/3705309.html

# 设置Shell
set-option -g default-shell /bin/zsh

# 设置复制模式,空格开始选,Enter结束复制
setw -g mode-keys vi 

#开启status-bar uft-8支持
set -g status-utf8 on

# 设定窗口起始
set -g base-index 1

# history
set-option -g history-limit 4096

#urxvt tab like window switching (-n: no prior escape seq)
#ruxvt标签式窗口切换
bind -n S-down new-window
bind -n S-left prev
bind -n S-right next
bind -n C-left swap-window -t -1
bind -n C-right swap-window -t +1

# 切换panes
bind-key C-l last-pane

# 设置鼠标可以操作|滚动设置
#   --> 使用shift键+鼠标键选择文件,Ctrl+Shift+C复制,Ctrl+Shift+V粘贴
# set -g mode-mouse on
# set -g mode-mouse off  # --> let cygwin mouse can be used.
# disable mouse control by default - change 'off' to 'on' to enable by default.
setw -g mode-mouse off
set-option -g mouse-resize-pane off
set-option -g mouse-select-pane off
set-option -g mouse-select-window off
# toggle mouse mode to allow mouse copy/paste
# set mouse on with prefix m
bind m \
    set -g mode-mouse on \;\
    set -g mouse-resize-pane on \;\
    set -g mouse-select-pane on \;\
    set -g mouse-select-window on \;\
    display 'Mouse: ON'
# set mouse off with prefix M
bind M \
    set -g mode-mouse off \;\
    set -g mouse-resize-pane off \;\
    set -g mouse-select-pane off \;\
    set -g mouse-select-window off \;\
    display 'Mouse: OFF'

# 设置窗口可自动调整index
set -g renumber-windows on

# 复制和粘贴模式的快捷键
bind y copy-mode
bind c-y copy-mode
bind p paste-buffer
bind c-p paste-buffer

# Toggle log to file
bind H pipe-pane -o 'cat >>$HOME/#W-tmux.log' '\;' display-message 'Toggled logging to $HOME/#W-tmux.log'

bind h pipe-pane \; display-message 'Ended logging to $HOME/#W-tmux.log'

# 设置窗口名字不能修改
set-option -g allow-rename off

# 设置启动窗口时默认名字
# bind-key c new-window -n 'zsh'

# 设置r键为加载配置文件,并提示信息
bind r source-file ~/.tmux.conf \; display "配置文件已重新加载!" 

# other
setw -g xterm-keys on

#------------------------------------------------------------------------------#
#  *** 基本终终端操作 ***
#  tmux new -s "session_name"       // 创建一个seesion
#  tmux new -s "session_name" -d    // 创建一个seesion, 并在后台运行
#  tmux ls                          // 列出tmux会话列表
#  tmux attach -t session           // 进入指定的会话(可终端共享)
#  tmux kill-session -t "session"   // 删除指定会话
#
#  ** 容易混淆 **
#  bind-key ;   // switch to last pane
#  bind-key l   // switch to last window
#  bind-key L   // switch to last session
#  bind-key C-l // switch to last pane(like: bind-key 😉
#
#  *** 控制台-操作说明 ***
#  Ctrl+b  // 激活控制台
#  ** 系统操作   
#      ?   // 列出所有快捷键;按q返回   
#      d   // 脱离当前会话;
#      D   // 选择要脱离的会话;在同时开启了多个会话时使用   
#      Ctrl+z  // 挂起当前会话   
#      r   // 强制重绘未脱离的会话   
#      s   // 选择并切换会话;在同时开启了多个会话时使用   
#      :   // 进入命令行模式;
#               :new-session         // 创建新会话
#      [   // 进入复制模式;此时的操作与vi/emacs相同,按q/Esc退出   
#      ]   // 进入粘贴模式;
#      ~   // 列出提示信息缓存;其中包含了之前tmux返回的各种提示信息   
#
#  ** 会话操作
#      (   preview session
#      )   next session
#      L   last session
#      s   list session
#      $   rename seesion
#
#  ** 窗口操作
#      c   // 创建新窗口   
#      &   // 关闭当前窗口   
#      [0-9] // 切换至指定窗口   
#      p   // 切换至上一窗口   
#      n   // 切换至下一窗口   
#      l   // 在前后两个窗口间互相切换   
#      w   // 通过窗口列表切换窗口   
#      ,   // 重命名当前窗口;这样便于识别   
#      .   // 修改当前窗口编号;相当于窗口重新排序   
#      f   // 在所有窗口中查找指定文本   
#      i   // 显示tmux当前信息
#
#  ** 面板操作   
#      ”   // 将当前面板平分为上下两块|横向切割 --> 分割成面板
#      %   // 将当前面板平分为左右两块|竖向切割 --> 分割成面板
#      x   // 关闭当前面板   
#      ;   // 切换到最后的pane
#      !   // 将当前面板置于新窗口;即新建一个窗口,其中仅包含当前面板   
#      Ctrl+方向键  // 以1个单元格为单位移动边缘以调整当前面板大小   
#      Alt+方向键   // 以5个单元格为单位移动边缘以调整当前面板大小   
#      Space        // 在预置的面板布局中循环切换;依次包括:
#                       even-horizontal、
#                       even-vertical、
#                       main-horizontal、
#                       main-vertical、
#                       tiled   
#      q   // 显示面板编号   
#      o   // 在当前窗口中选择下一面板   
#      {   // 向前置换当前面板   
#      }   // 向后置换当前面板   
#      方向键   // 移动光标以选择面板   
#      Alt+o    // 逆时针旋转当前窗口的面板   
#      Ctrl+o   // 顺时针旋转当前窗口的面板   


#  *** 参考配置 ***
#
#  ** 配置1 **
#  #设置pan前景色  
#  set -g pane-border-fg green  
#  #设置pane背景色  
#  set -g pane-border-bg black 
#  #设置终端颜色为256色
#  set -g default-terminal "screen-256color"
#  #开启status-bar uft-8支持
#  set -g status-utf8 on
#  #设置pan前景色
#  set -g pane-border-fg green
#  #设置pane背景色
#  set -g pane-border-bg black
#  #设置活跃pane前景色
#  set -g pane-active-border-fg white
#  #设置活跃pane背景色
#  set -g pane-active-border-bg yellow
#  #设置消息前景色
#  set -g message-fg white
#  #设置消息背景色
#  set -g message-bg black
#  #设置消息高亮显示
#  set -g message-attr bright
#  #设置status-bar颜色
#  set -g status-fg white
#  set -g status-bg black
#  #设置窗口列表颜色
#  setw -g window-status-fg cyan
#  setw -g window-status-bg default
#  setw -g window-status-attr dim
#  #设置当前窗口在status bar中的颜色
#  setw -g window-status-current-fg white
#  setw -g window-status-current-bg red
#  setw -g window-status-current-attr bright
#  #设置status bar格式
#  set -g status-left-length 40
#  set -g status-left "#[fg=green]Session: #S #[fg=yellow]#I #[fg=cyan]#P"
#  set -g status-right "#[fg=cyan]%d %b %R"
#  set -g status-interval 60
#  set -g status-justify centre
#  #开启window事件提示
#  setw -g monitor-activity on
#  set -g visual-activity on
#
#  ** 配置2 **
#  # 同一个窗口中的面板操作
#  # up
#  bind-key k select-pane -U 
#  #down
#  bind-key j select-pane -D
#  #left
#  bind-key h select-pane -L
#  #right
#  bind-key l select-pane -R
#  #select last window
#  bind-key C-l select-window -l
#------------------------------------------------------------------------------#

==================开启HTTP2的前提是HTTPS======================

注:系统环境为CentOS7

一、查看当前版本

本站当前nginx版本为1.10.2,yum安装,猜测应该不支持HTTP2


nginx -V
nginx version: nginx/1.10.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/share/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib64/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/lib/nginx/tmp/client_body \
--http-proxy-temp-path=/var/lib/nginx/tmp/proxy \
--http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi \
--http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi \
--http-scgi-temp-path=/var/lib/nginx/tmp/scgi \
--pid-path=/run/nginx.pid \
--lock-path=/run/lock/subsys/nginx \
--user=nginx --group=nginx \
--with-file-aio \
--with-ipv6 \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_xslt_module=dynamic \
--with-http_image_filter_module=dynamic \
--with-http_geoip_module=dynamic \
--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_degradation_module \
--with-http_slice_module \
--with-http_stub_status_module \
--with-http_perl_module=dynamic \
--with-mail=dynamic \
--with-mail_ssl_module \
--with-pcre --with-pcre-jit \
--with-stream=dynamic \
--with-stream_ssl_module \
--with-google_perftools_module \
--with-debug \
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic' \
--with-ld-opt='-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E'

分析一下,可以看出以下信息:

1、版本为1.10.2,修复了nginx的HTTP2的Bug

2、虽然启用了HTTP2模块,但是却以OpenSSL 1.0.1版本编译,而1.0.2+才支持ALPN,Chrome从51版起已经移除了对NPN的支持,所以只能自编译或更换添加其他源,这里选择了自编译

经测试,CentOS 7最新的openssl版本为1.0.2k,不再需要自编译,直接通过yum安装即可。

二、编译

下面是自己的编译参数


./configure --prefix=/usr/share/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib64/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/lib/nginx/tmp/client_body \
--http-proxy-temp-path=/var/lib/nginx/tmp/proxy \
--http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi \
--http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi \
--http-scgi-temp-path=/var/lib/nginx/tmp/scgi \
--pid-path=/run/nginx.pid \
--lock-path=/run/lock/subsys/nginx \
--user=www --group=www \
--with-openssl=/usr/src-packages/openssl-1.0.2k \
--with-http_ssl_module \
--with-http_v2_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_degradation_module \
--with-http_slice_module \
--with-http_stub_status_module \
--with-pcre \
--with-pcre-jit \
--with-stream \
--with-stream_ssl_module \
--with-cc-opt='-O2 -g -pipe -Werror -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic' \
--with-ld-opt='-Wl,-z,relro -Wl,-E'

三、修改nginx配置文件并重启Nginx

listen       443 ssl http2 fastopen=3 reuseport;

四、验证

浏览自己的网站,然后在地址栏输入chrome://net-internals/#http2

HTTP/2 sessions出现自己的网站代表开启了HTTP2

[Unit]
Description=MongoDB document-oriented database
After=network.target

[Service]
PIDFile=/var/run/mongod.pid
ExecStart=/usr/local/mongodb/bin/mongod -f /etc/mongod.conf
ExecStop=/bin/kill -INT $MAINPID

[Install]
WantedBy=multi-user.target

如果启动日志出现”WARNING: /sys/kernel/mm/transparent_hugepage/defrag is ‘always’.”
加入一行

ExecStartPre=echo never >> /sys/kernel/mm/transparent_hugepage/enabled && echo never >> /sys/kernel/mm/transparent_hugepage/defrag

1、iptables规则

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

2、编写脚本,通过/var/log/secure记录的ssh登陆请求,写入IP到/etc/hosts.deny

#! /bin/bash
cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}' > /usr/local/bin/black.list
for i in `cat  /usr/local/bin/black.list`
do
	IP=`echo $i |awk -F= '{print $1}'`
	NUM=`echo $i|awk -F= '{print $2}'`
	
        #例外IP,准确IP与阿里云内网IP
        if [[ "$IP" = "此处输入例外IP" ]] || [[ $IP =~ 10\.[0-9]*\.[0-9]*\.[0-9]* ]]
        then
            echo ""
        elif [ $NUM -gt 3 ]
        then
            grep $IP /etc/hosts.deny > /dev/null
            if [ $? -gt 0 ]
            then
                echo "sshd:$IP:deny" >> /etc/hosts.deny
            fi
        fi
done

其实关于获取Let’s Encrypted SSL证书之前的一篇博客已经涉及到了,之所以再写一下是这次网站迁移后获取途径不大一样,正好也总结一下

两种方法都是通过DNS验证的方式,由于 Let’s Encrypted 的特殊性,DNS验证方式才是最完美的

1、也是之前的方法,这里就不再重复写一次了,是国人写的,不存在语言障碍,缺点是需要一些依赖自己安装,还有就是只支持cloudxns和dnspod两种DNS服务商,由于本网站域名在阿里云上,所以用第二种方式

2、链接,基本上也很简单,也有国人编辑了中文文档,从头到尾不需任何依赖,而且还自动添加cron定时更新,支持20多种DNS API,国内的阿里云、DNSPOD也不在话下,文档已经够详细,也就不重新发明轮子了

生命不息,折腾不止  –沃狭基·巴朔德

最近得知京东云活动,趁机入手一台主机,打算把当前万网的博客网站迁移过来,毕竟万网的虚拟主机就是一个web空间,太缺乏可玩性
嗯,就是手痒了
迁移倒是容易,使用PHP7也提升了一部分速度,但是万网的虚拟主机还有半年才到期,不用感觉浪费了,正好可以做负载均衡
然后噩梦就来了
用在京东云端做Nginx反向代理?每次请求都要从用户端跑到京东云再转到万网空间,网络开销包括延迟都不好控制,同一局域网下还好
那就从域名解析层面做负载均衡吧
迅速做好负载均衡后,数据同步却又成了噩梦,DNS负载均衡无法将HTTP请求的上下文逻辑引入到调度策略中,也就是说DNS负载均衡适合上下文不存在逻辑的情况,而部分大型网站使用的DNS负载均衡只是作为一级调度均衡,下面还要做二级负载均衡以保证永远在线,否则DNS的典型缺点就暴露出来了
接下来的解决方案就是:
其中一个节点只做计算节点,数据都从另一个节点拿,于是数据就分为了两个层面
1.数据库,万网不支持自搭建的数据库,只支持自己提供的数据库,于是确定下来万网作为主节点,京东云作为单纯的计算节点
2.web文件,京东云节点还要主动地同步万网节点的web文件,毕竟万网节点就是一个web空间,只有一种FTP方式上传下载文件,如何进行同步呢?
可不可以像mount方式一样,映射为本地的一个目录,这样使用rsync进行同步就可以了
最终还找到了一个工具curlftpfs,使用方式如下:

curlftpfs -o tcp_nodelay ftp://username:password@ftp-address/doc/ /localdoc/

但是这个工具却存在着一个BUG,使用su或runuser以非root身份(此处设为A)执行命令后,相关目录权限变为d????????,root用户甚至不能读取,切换为A用户身份却看到该目录属于root用户
要知道为了安全,京东云的nginx和php-fpm都是以一般用户身份运行的,虽然可以将目录chmod 777但总感觉蛋疼
更为蛋疼的是,后期优化除了wordpress方面的优化,其他的优化一概不能,例如https,http2,memcached或redis等,奈掣肘何?
如此看来万网这个节点真是如同鸡肋,食之无味,弃之可惜,想废物利用实乃蛋疼之举
目前考量,趁早弃置。

转换方向后,目前能想到的优化方案有以下几点:
1.申请 lets-encrypt 证书,开启HTTPS(已完成)
2.使用 service worker(最终使用WP Super Cache实现静态缓存)
3.开启 HTTP2(已完成)
4.支持HTTP2的CDN(已完成,upyun)
5.使用 redis 缓存

目前想到的就这些了,放弃万网节点后,前景一片光明啊

yum 常用命令

yum localinstall:安装本地包
yum clean all:清除本地所有缓存
yum check-update:检测可更新软件包
yum reinstall:覆盖安装软件包
yum autoremove:去除多软件包
yum provides 命令:查看包含此命令的工具包

yum的配置一般有两种方式,一种是直接配置/etc目录下的yum.conf文件,另外一种是在/etc/yum.repos.d目录下增加.repo文件。
一、yum的配置文件

$ cat /etc/yum.conf 
[main]
cachedir=/var/cache/yum         #yum下载的RPM包的缓存目录
keepcache=0             #缓存是否保存,1保存,0不保存。
debuglevel=2             #调试级别(0-10),默认为2(具体调试级别的应用,我也不了解)。
logfile=/var/log/yum.log         #yum的日志文件所在的位置
exactarch=1             #在更新的时候,是否允许更新不同版本的RPM包,比如是否在i386上更新i686的RPM包。
obsoletes=1             #这是一个update的参数,具体请参阅yum(8),简单的说就是相当于upgrade,允许更新陈旧的RPM包。
gpgcheck=1             #是否检查GPG(GNU Private Guard),一种密钥方式签名。
plugins=1             #是否允许使用插件,默认是0不允许,但是我们一般会用yum-fastestmirror这个插件。
installonly_limit=3         #允许保留多少个内核包。
exclude=selinux*         #屏蔽不想更新的RPM包,可用通配符,多个RPM包之间使用空格分离。
#       This is the default, if you make this bigger yum won't see if the metadata
# is newer on the remote and so you'll "gain" the bandwidth of not having to
# download the new metadata and "pay" for it by yum not having correct
# information.
# It is esp. important, to have correct metadata, for distributions like
# Fedora which don't keep old packages around. If you don't like this checking
# interupting your command line usage, it's much better to have something
# manually check the metadata once an hour (yum-updatesd will do this).
# metadata_expire=90m
# PUT YOUR REPOS HERE or IN separate files named file.repo
# in /etc/yum.repos.d

二、*.repo文件详解
什么是repo文件?
repo文件是Fedora中yum源(软件仓库)的配置文件,通常一个repo文件定义了一个或者多个软件仓库的细节内容,例如我们将从哪里下载需要安装或者升级的软件包,repo文件中的设置内容将被yum读取和应用!
我们以一份系统自带的repo文件做为实例来探讨(#号后面是我加的注释):

[fedora]      #方括号里面的是软件源的名称,将被yum取得并识别

name=Fedora $releasever - $basearch   #这里也定义了软件 仓库的名称,通常是为了方便阅读配置文件,一般没什么作用,$releasever变量定义了发行版本,通常是8,9,10等数字,$basearch变 量定义了系统的架构,可以是i386、x86_64、ppc等值,这两个变量根据当前系统的版本架构不同而有不同的取值,这可以方便yum升级的时候选择 适合当前系统的软件包,以下同……
failovermethod=priority   #failovermethod 有两个值可以选择,priority是默认值,表示从列出的baseurl中顺序选择镜像服务器地址,roundrobin表示在列出的服务器中随机选择
exclude=compiz* *compiz* fusion-icon* #exclude这个选项是后来我自己加上去的,用来禁止这个软件仓库中的某些软件包的安装和更新,可以使用通配符,并以空格分隔,可以视情况需要自行添加
#baseurl=http://download.fedoraproject.org/pub/fedora/linux/releases/$releasever/Everything/$basearch/os/
#上面的一行baseurl第一个字符是'#'表示该行已经被注释,将不会被读取,这一行的意思是指定一个baseurl(源的镜像服务器地址)
#mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=fedora-$releasever&arch=$basearch
#上面的这一行是指定一个镜像服务器的地址列表,通常是开启的,本例中加了注释符号禁用了,我们可以试试,将$releasever和$basearch替换成自己对应的版本和架构,例如10和i386,在浏览器中打开,我们就能看到一长串镜可用的镜像服务器地址列表。
选择自己访问速度较快的镜像服务器地址复制并粘贴到repo文件中,我们就能获得较快的更新速度了,格式如下baseurl所示:
baseurl=
ftp://ftp.sfc.wide.ad.jp/pub/Linux/Fedora/releases/10/Everything/i386/os
http://ftp.chg.ru/pub/Linux/fedora/linux/releases/10/Everything/i386/os
http://ftp.yz.yamagata-u.ac.jp/pub/linux/fedora/linux/releases/10/Everything/i386/os
http://mirror.nus.edu.sg/fedora/releases/10/Everything/i386/os
http://mirror.yandex.ru/fedora/linux/releases/10/Everything/i386/os
http://ftp.twaren.net/Linux/Fedora/linux/releases/10/Everything/i386/os
http://ftp.itu.edu.tr/Mirror/Fedora/linux/releases/10/Everything/i386/os

enabled=1 #这个选项表示这个repo中定义的源是启用的,0为禁用
gpgcheck=1 #这个选项表示这个repo中下载的rpm将进行gpg的校验,已确定rpm包的来源是有效和安全的
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch #定义用于校验的gpg密钥

##以下的软件仓库基本上用不到,选项含义同上
[fedora-debuginfo]
name=Fedora $releasever - $basearch - Debug
failovermethod=priority
#baseurl=http://download.fedoraproject.org/pub/fedora/linux/releases/$releasever/Everything/$basearch/debug/
mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=fedora-debug-$releasever&arch=$basearch
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch

[fedora-source]
name=Fedora $releasever - Source
failovermethod=priority
#baseurl=http://download.fedoraproject.org/pub/fedora/linux/releases/$releasever/Everything/source/SRPMS/
mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=fedora-source-$releasever&arch=$basearch
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch

转自:http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/10/09/2203916.html