##################################################################################################################################################测试环境:(虚拟机为主)

OS:                  CentOS release 6.8

OS Name:        Linux

OS Version:      2.6.32-642.el6.x86_64

Architecture:     Intel(R) Core(TM) i5-3470

CPU:                   4 cpus      MEM: 1G      Disk: 50G


nginx服务器:192.168.9.245

tomcat服务器:192.168.9.244

##################################################################################################################################################

nginx部分参考:

http://www.linuxidc.com/Linux/2017-03/141983.htm

http://www.linuxidc.com/Linux/2016-10/136227.htm


在实际生产中,Tomcat服务器一般不单独使用在项目中,对于静态资源的响应Nginx表现的比较好,另外由于nginx是专门用于反向代理的服务器,所以很容易实现将java的请求转发到后端交给tomcat容器处理,而本身用来处理静态资源。

在Nginx中,一个server {}块往往用来配置一个比较大的项目,一般就是对于一个域名的所有配置,一个server块内一般有多个location来定义多个请求规则,比如域名和根目录配置,静态资源支持,php fastcgi请求,url重写,错误页面配置等多种配置,所以nginx代理tomcat和前面的转发php-fpm一样,就是将请求转发到后端的动态模块去处理该请求

下面在server中简单配置一个location局部规则,将指定的nginx请求转发至tomcat容器


一、ningx安装


1、安装依赖包

 nginx部署之前,首先根据项目的需要选择需要安装的组件,实际环境一般会考虑需要支持gzip压缩和rewrite模块,所以安装的第一步是下载Ngix及Ngix的相关组件.


源码包安装方式:

zlib-1.2.11.tar.gz:gzip压缩依赖库

下载地址:http://prdownloads.sourceforge.net/libpng/zlib-1.2.11.tar.gz?download


Rewrite模块的正则表达式依赖库:pcre,简称:Perl兼容正则表达式

下载地址::ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre2-10.21.tar.gz

tar -zxvf pcre-8.02.tar.gz

./configure

make

make install

默认安装到/usr/local/lib下即可,安装完成后可以#ls -l /usr/local/lib/libpcre.so

rpm安装方式:

GCC编译器目前可以编译的语言包括:C、C++、Objective-C、Fortran、java等。

Autoconf、Automake:用于自动创建功能完善的Makefile,大多数软件都是用它生成makefile。

m模块依赖性:gzip模块需要zlib库,ssl功能需要openssl库,在DEBIAN上是libssl。

rewrite模块需要pcre库:

301重定向把某目录整个重定向到一个二级域名,或者不带www的顶级域名请求全部重定向到带www的二级域名.如果是Apache,需要配置.htaccess,nginx不支持,需要在配置文件里面使用rewrite指令来实现。

顶级域名重定向到www

ttlsa.com的请求都会重定向到www.ttlsa.com

server {

 server_name ttlsa.com;

 rewrite ^/(.*)$ http://www.ttlsa.com/$1 permanent;

 }

www二级域名重定向到顶级域名

江湖盛传顶级域名的权重会比www二级域名的权重高,有些seoer会要求运维一定要把www的请求转到顶级域名

server {

 server_name www.ttlsa.com;

 rewrite ^/(.*)$ http://domain.com/$1 permanent;

 }

目录重定向

有些seoer会要求运维一定要把www的请求转到顶级域名

if ( $request_filename ~ nginxjiaocheng/ ) {

 rewrite ^ http://www.ttlsa.com/nginx/? permanent;

 }

目录跳转新域名

if ( $request_filename ~ nginx/ ) {

 rewrite ^ http://nginx.ttlsa.com/? permanent;


yum -y install gcc gcc-c++ autoconf automake   perl perl-devel perl-ExtUtils-Embed readline-devel ncurses-devel   libuuid-devel libtool* zlib zlib-devel openssl openssl-devel pcre pcre-devel


2、安装nginx

nginx-1.10.3下载地址:http://nginx.org/download/nginx-1.10.3.tar.gz

nginx目前有3个版本:旧的稳定版、最新的稳定版、开发版。开发版刚发布不久Bug会比较多不建议。旧的稳定版不一定会加新的功能。最合适使用的是最新的稳定版。


tar zxvf nginx-1.10.3.tar.gz

cd nginx-1.10.3

./configure --prefix=/usr/local/nginx  --with-poll_module   --with-http_stub_status_module

./configure  --prefix=/usr/local/nginx  --with-http_perl_module --with-http_gzip_static_module --with-file-aio --with-http_realip_module --with-http_stub_status_module --with-http_sub_module --with-http_ssl_module --with-http_flv_module

make && make install


 --with-http_ssl_module             使nginx支持https访问。

 --with-poll_module                   允许poll模式,如果没有更好的kqueue(sun)/epoll(linux kenel 2.6+)则开启。

--with-http_flv_module              flv视频点播服务器

-with-http_perl_module             启用ngx_http_perl_module支持(该模块使nginx可以直接使用perl或通过ssi调用perl)

--with-file-aio                             启用file aio支持(一种APL文件传输格式)

-with-http_gzip_static_module   启用ngx_http_gzip_static_module支持(在线实时压缩输出数据流)


--with-http_realip_module  允许我们改变客户端请求头中客户端IP地址值

语    法: set_real_ip_from [the address|CIDR|"unix:"]          ///允许哪个IP段的机器做代理。

默 认 值: none

使用环境: http, server, location


语    法: real_ip_header [X-Real-IP|X-Forwarded-For]            ///接收客户端请求头中客户端IP地址值。

默 认 值: real_ip_header X-Real-IP

使用环境: http, server, location


语    法: real_ip_recursive                                   ///是否递归地排除直至得到用户ip(默认为off) 

首先,real_ip_header 指定一个http首部名称,默认是X-Real-Ip,假设用默认值的话,nginx在接收到报文后,会查看http首部X-Real-Ip。

(1)如果有1个IP,它会去核对,发送方的ip是否在set_real_ip_from指定的信任ip列表中。如果是被信任的,它会去认为这个X-Real-Ip中的IP值是前代理告诉自己的,用户的真实IP值,于是,它会将该值赋值给自身的$remote_addr变量;如果不被信任,那么将不作处理,那么$remote_addr还是发送方的ip地址。

(2)如果X-Real-Ip有多个IP值,比如前一方代理是这么设置的:proxy_set_header X-Real-Ip $proxy_add_x_forwarded_for;

得到的是一串IP,那么此时real_ip_recursive 的值就至关重要了。nginx将会从ip列表的右到左,去比较set_real_ip_from 的信任列表中的ip。如果real_ip_recursive为off,那么,当最右边一个IP,发现是信任IP,即认为下一个IP(右边第二个)就是用户的真正IP;如果real_ip_recursive为on,那么将从右到左依次比较,知道找到一个不是信任IP为止。然后同样把IP值复制给$remote_addr。

原文:https://blog.csdn.net/qq_33101675/article/details/79013248 



--with-http_sub_module        是一个过滤器,它修改网站响应内容中的字符串,比如你想把响应内容中的‘ttlsa’全部替换成‘运维生存时间’,这个模块已经内置在nginx中,但是默认未安装,需要安装需要加上配置参数:--with-http_sub_module

    location / {

        sub_filter  ttlsa '运维生存时间';                        ///sub_filter string replacement;

        sub_filter_types text/html;                            ///被替换的MIME类型,默认为“text/html”

        sub_filter_once on;                                      ///sub_filter_last_modified on | off,on只一次,off替换全部。

    }

参考:http://www.ttlsa.com/html/3289.html


--with-http_headers_module   提供了两个重要的指令add_header和expires

语法: add_header name value;

默认值: —

配置段: http, server, location, if in location

对响应代码为200,201,204,206,301,302,303,304,或307的响应报文头字段添加任意域。如:


add_header From ttlsa.com


flash文件在浏览器本地缓存30天

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$

 {

           expires 30d;

 }


实例二:对js,css文件在浏览器本地缓存1小时

location ~ .*\.(js|css)$

 {

            expires 1h;

 }


--with-stream --with-stream_ssl_module  ///nginx转发TCP连接模块

nginx.conf events与http之间添加stream模块配置:

stream {

    upstream remote {

         server 192.168.9.20:3389;

    }

  server {

        listen                11128;

        proxy_connect_timeout 8s;

        proxy_timeout 24h;

        proxy_pass            remote;

           }

        }



nginx平滑升级:

已安装的nginx增加模块:

./configure  --prefix=/usr/local/nginx  --with-http_perl_module --with-http_gzip_static_module --with-file-aio --with-http_realip_module --with-http_stub_status_module --with-http_sub_module --with-http_ssl_module --with-http_flv_module --with-poll_module

make 

cp objs/nginx /usr/local/nginx/sbin/nginx


kill信号:

kill -2/15 快速关闭;

kill  -3/-QUIT      从容关闭;

kill -1 /-HUP      平滑重启,重新加载配置文件

kill -10/-USR1    重新打开配置文件

kill -12/-USR2    平滑升级可执行程序

kill -28/-WINCH 从容关闭工作进程


执行上一步骤重新编译后,kill -10/-USR1  旧的nginx主进程。

产生nginx.pid.oldbin文件:

ls /var/run/

nginx.pid       

nginx.pid.oldbin


新旧进程同时共同处理请求:

[root@dataserver245 tengine-2.0.3]# ps -ef |grep nginx

root      3604     1  0 21:40 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/ng

nginx     3605  3604  0 21:40 ?        00:00:00 nginx: worker process

root      8258  3604  0 22:00 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/ng

nginx     8259  8258  0 22:00 ?        00:00:00 nginx: worker process


逐步停止旧版本的nginx实例:

kill -WINCH  旧的nginx主进程

[root@dataserver245 tengine-2.0.3]# ps -ef |grep nginx

root      3604     1  0 21:40 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/ng

root      8258  3604  0 22:00 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/ng

nginx     8259  8258  0 22:00 ?        00:00:00 nginx: worker process


决定使用旧版本:

kill -HUP 旧进程    不加载配置文件重启旧的工作进程

kill -QUIT 新进程   从容关闭其进程或 kill -TERM 新进程  强制退出

新的进程退出后旧的主进程移除nginx.pid.oldbin文件,恢复为.pid。恢复都升级之前。


决定使用新版本:

kill -QUIT 旧进程

nginx.pid.oldbin文件变为.pid,升级完成。






二、配置

vim  /usr/local/nginx/conf/nginx.conf

user nginx;

worker_processes  2;

pid        logs/nginx.pid;

events {

    worker_connections  10240;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    server_tokens off;

    keepalive_timeout  65;

    server {

        listen       808;

        server_name  localhost;

        location / {

            root   html;

            index  index.html index.htm;

        }

        error_page  404              /404.html;

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

        root   /html;

        }

        error_page  404              /404.html;

        location = /404.html {

        root html;

        }

        }

        include vhost/*.conf;

      }






生产配置:

[root@nameserver241 conf]# vim nginx.conf

user  nginx;

worker_processes  1;

pid        logs/nginx.pid;

events {

    use epoll;

    worker_connections  65535;

}

# load modules compiled as Dynamic Shared Object (DSO)                  \\\\Tengine特性动态模块加载(DSO)支持。加入一个模块不再需要重新编译整个Tengine

#dso {

#     load ngx_http_fastcgi_module.so;

#     load ngx_http_rewrite_module.so;

#     }

http {

    include       mime.types;

    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" "$http_origin"'

                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    sendfile        on;

    tcp_nopush     on;                       \\\tcp_nopush 配置和 tcp_nodelay 互斥。配置一次发送数据的包大小。它不是按时间累计0.2 秒后发送包,而是当包累计到一定大小后就发送。在 nginx 中,tcp_nopush 必须和 sendfile 搭配使用。

    tcp_nodelay    on;                          \\\禁用Nagle算法,不会发送一个数据包,等待数据 0.2秒钟,将这段时间内的数据打成一个大的包。 

#    server_tag     off;                          \\\Tengine特性自定义设置HTTP响应的server头,‘off’可以禁止返回server头。如果什么都不设置,就是返回默认Nginx的标识。

#    server_info    off;                          \\\Tengine特性关闭server_info,不显示错误页面时会显示URL、服务器名称和出错时间。

    server_tokens off;                          \\\隐藏版本号

    keepalive_timeout  65;                   \\\请求完成之后还要保持连接多久,不是请求时间多久

    client_max_body_size 100m;            \\\限制上传文件最大100m

 #   limit_zone one $binary_remote_addr 10m;        \\\声明一个名为one 的limit_zone,$binary_remote_addr是替代 $remore_addr变量,会话状态储存空间10m 。

 #   limit_conn one 10;                         \\\限制用户并发连接数10个

    limit_conn_zone $binary_remote_addr zone=one:10m;  #容器共使用10M的内存来对于IP传输开销,Nginx从v1.1.8版本之后就用limit_conn_zone替换掉了limit_zone,具体见:nginx v1.1.8新语法 limit_conn_zone 替换和 limit_conn 用法

    gzip  on;

    gzip_min_length 1k;                        \\\超过1k即打包

    gzip_buffers 4 16k;

    gzip_http_version 1.1;

    gzip_comp_level 3;

    gzip_types text/plain application/x-javascript text/css application/xml image/jpeg image/gif image/png;

    gzip_vary on;

# NginxHttpRealIpModule

    set_real_ip_from 192.168.9.245/24;

    real_ip_header X-Forwarded-For;

    real_ip_recursive on;


    server {

        listen       80;

        server_name  localhost www.csh.com 192.168.9.241;

        location / {

        root   html;

        index  index.html index.htm;

       limit_conn one 1;#限制每个IP只能发起一个并发连接

       limit_rate 300k;   #对每个连接限速300k.连接限速,而不是对IP限速。如果一个IP允许两个并发连接,那么这个IP就是限速limit_rate×2

    }

}

    server {

        listen       443;

        server_name  localhost;

        ssl          on;

      ssl_certificate  domain-crt.txt;

      ssl_certificate_key  domain-key.txt;

      ssl_session_cache   shared:SSL:1m;           

\\\设置存储session参数的缓存的类型和大小,只使用shared,性能会更高

Syntax:ssl_session_cache off | none | [builtin[:size]] [shared:name:size];

默认:

ssl_session_cache none;

Context:http, server

  所有工作进程之间共享缓存。缓存大小以字节为单位指定;一兆字节可以存储大约4000个session

      ssl_session_timeout 5m;                         \\\指定客户端可以重用会话参数的时间(超时之后不可使用)

      ssl_protocols SSLv2 SSLv3 TLSv1;

      ssl_ciphers  HIGH:!aNULL:!MD5;             \\\密码加密方式

      ssl_prefer_server_ciphers on;                     \\\依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码

    }

include /usr/local/nginx/conf/vhost/*.conf;

}


lua配置:

      location /tps/gateway {

              access_by_lua_file /opt/nginx/lua/hsop_api_limits.lua;

              proxy_pass http://ps/hsop-tps-access-ps/tps/gateway;

              proxy_redirect default;

              proxy_set_header Host $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;

       }





\\\ssl_protocols  SSLv2 SSLv3 TLSv1;            //指定密码为openssl支持的格式



sendfile

=================

nginx 的 sendfile 选项可以在 nginx 发送文件时使用系统调用 sendfile(2)

sendfile(2) 可以在传输文件数据时使用内核空间中的一些数据。这样可以节省大量的资源:

1.sendfile(2) 是系统调用,这就意味着操作是在内核中完成的,因此没有昂贵的上下文切换资源

2.sendfile(2) 取代了系统 read 和 write 操作。

3.sendfile(2) 允许零复制,也就是可以直接从 DMA 写数据

先来看一下不用 sendfile 的传统网络传输过程:

read(file, tmp_buf, len);

write(socket, tmp_buf, len);

硬盘 >> kernel buffer >> user buffer >> kernel socket buffer >> 协议栈

一般来说一个网络应用是通过读硬盘数据,然后写数据到 socket 来完成网络传输的。

具体过程是:

1、系统调用 read() 产生一个上下文切换:从 user mode 切换到 kernel mode,然后 DMA 执行拷贝,把文件数据从硬盘读到一个 kernel buffer 里。

2、数据从 kernel buffer 拷贝到 user buffer,然后系统调用 read() 返回,这时又产生一个上下文切换:从kernel mode 切换到 user mode。

3、系统调用 write() 产生一个上下文切换:从 user mode 切换到 kernel mode,然后把步骤2读到 user buffer 的数据拷贝到 kernel buffer(数据第2次拷贝到 kernel buffer),不过这次是个不同的 kernel buffer,这个 buffer 和 socket 相关联。

4、系统调用 write() 返回,产生一个上下文切换:从 kernel mode 切换到 user mode(第4次切换了),然后 DMA 从 kernel buffer 拷贝数据到协议栈(第4次拷贝了)。

上面4个步骤有4次上下文切换,有4次拷贝,在kernel 2.0+ 版本中,系统调用 sendfile() 就是用来简化上面步骤提升性能的。

sendfile() 不但能减少切换次数而且还能减少拷贝次数。

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

再来看一下用 sendfile() 来进行网络传输的过程:

sendfile(socket, file, len);

硬盘 >> kernel buffer (快速拷贝到kernel socket buffer) >> 协议栈

1、系统调用 sendfile() 通过 DMA 把硬盘数据拷贝到 kernel buffer,然后数据被 kernel 直接拷贝到另外一个与 socket 相关的 kernel buffer。这里没有 user mode 和 kernel mode 之间的切换,在 kernel 中直接完成了从一个 buffer 到另一个 buffer 的拷贝。

2、DMA 把数据从 kernel buffer 直接拷贝给协议栈,没有切换,也不需要数据从 user mode 拷贝到 kernel mode,因为数据就在 kernel 里。

























mkdir /usr/local/nginx/conf/vhost/

mkdir  -p  /var/nginxhtml/csh

cp /usr/local/nginx/html  /var/nginxhtml/csh


vim  /usr/local/nginx/conf/vhost/www.csh.com.conf


upstream https-xiaoyi  {

             server 192.168.9.243:8080;

              server 192.168.9.244:8080;

              ip_hash;

}    

server  {

listen        443 ssl;

server_name www.csh.com csh.com 192.168.9.245;

location / {

  error_page 500 502 503 504   /50x.html;

  root /var/nginxhtml/csh;

  index index.html index.htm;

  error_page 404  /404.html;

  location = /404.html {

     root  html;

    }

}

location /xiaoyi {

proxy_redirect off;

proxy_pass http://https-xiaoyi /TestProject/;

proxy_set_header Host $host;

 client_max_body_size 10m;

}

}


nginx启动脚本:

vim /etc/init.d/nginx

#!/bin/bash

# nginx Startup script for the nginx HTTP Server

# it is v.0.0.2 version.

# chkconfig: - 85 15

# description: nginx is a high-performance web and proxy server.

#              It has a lot of features, but it's not for everyone.

# processname: nginx

# pidfile: /var/run/nginx.pid

# config: /usr/local/nginx/conf/nginx.conf

nginxd=/usr/local/nginx/sbin/nginx

nginx_config=/usr/local/nginx/conf/nginx.conf

nginx_pid=/var/run/nginx.pid

RETVAL=0

prog="nginx"

# Source function library.

. /etc/rc.d/init.d/functions

# Source networking configuration.

. /etc/sysconfig/network

# Check that networking is up.

[ ${NETWORKING} = "no" ] && exit 0

[ -x $nginxd ] || exit 0

# Start nginx daemons functions.

start() {

if [ -e $nginx_pid ];then

 echo "nginx already running...."

 exit 1

fi

 echo -n $"Starting $prog: "

 daemon $nginxd -c ${nginx_config}

 RETVAL=$?

 echo

 [ $RETVAL = 0 ] && touch /var/lock/subsys/nginx

 return $RETVAL

}

# Stop nginx daemons functions.

stop() {

      echo -n $"Stopping $prog: "

      killproc $nginxd

      RETVAL=$?

      echo

      [ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /var/run/nginx.pid

}

# reload nginx service functions.

reload() {

  echo -n $"Reloading $prog: "

  #kill -HUP `cat ${nginx_pid}`

  killproc $nginxd -HUP

  RETVAL=$?

  echo

}

# See how we were called.

case "$1" in

start)

      start

      ;;

stop)

      stop

      ;;

reload)

      reload

      ;;

restart)

      stop

      start

      ;;

status)

      status $prog

      RETVAL=$?

      ;;

*)

      echo $"Usage: $prog {start|stop|restart|reload|status|help}"

      exit 1

esac

exit $RETVAL



chmod +x  /etc/init.d/nginx


nginx 启动:

service nginx start


nginx 自启动:

chkconfig --level 2345 nginx on    

vi /etc/rc.local 

/etc/init.d/nginx start

重启生效


kill -HUP Nginx进程号 

平滑重启,运行新的工作进程并从容关闭旧的工作进程,通知旧的进程关闭监听套接字直到客户端的服务完成。如果新的配置文件应用失败,nginx讲继续使用旧的配置文件。




发现问题与解决问题:

1、启动nginx报错:nginx: [emerg] "server" directive is not allowed here in /usr/local/nginx/conf/vhost/www.csh.com.conf:1

解决方法:检查/usr/local/nginx/conf/vhost/www.csh.com.conf文件没有语法错误,检查/usr/local/nginx/conf/nginx.conf语法错误,多了一个“}”,注释掉问题解决。




因为上面配置了php-fpm的支持,所以这里使用/tomcat/请求来确定是否转发到tomcat容器,前面的^~就是匹配任意的域名或者IP地址部分,所以当访问http://ip/tomcat这样的请求时,那么tomcat容器就会起作用,和访问http://ip:8080效果是一样的,包括容器下的项目都是完全一样的

  保存之后,重新载入nginx配置文件: /usr/local/nginx/nginx -s reload 


当然这里的location可以配置好多个,从而代理到多个服务器上的tomcat,也可以自由配置多个server {}块,代理到多个服务器,这之间都是根据自己的需要灵活配置的,另外加上静态资源规则等配置,可以实现强大的功能,比如配置负载均衡,实现网站的高并发访问以及图片服务器的资源共享等等。




location指令:

用来对url进行匹配,即语法中的/uri/,可以是字符串或者正则(正则必须指定前缀)。

优先级:

#NO.1----------------------------------------

     location = /oldboy/test.jpg {

     return 400;

     }

#NO.2---------------------------------------

     location ~* \.jpg$ {

     return 403;

     }

#NO.3-----------------------------------------

     location /oldboy/test.jpg {

     return 401;

     }

#NO.4------------------------------------------

     location ^~ /oldboy/ {

     return 402;

     }

#NO.5----------------------------------------->NO.4不能同时存在

#     location /oldboy/ {

#     return 404;

#     }

#NO.6---------------------------------------

     location / {

     return 500;

     }

 

优先级测试结论:

不是按上下来进行先后匹配,首先对字符串进行匹配查询,最确切的匹配将被使用。然后正则表达式开始匹配,匹配第一个结果后停止查询。没有找到正则将使用字符串匹配,如果字符串正则都匹配正则优先。

1、优先级最高的是:= 号。它会最先备匹配到。工作中我们尽量把等号的匹配放在开头。

2、去掉 “=”号,优先级较高的试:~* \.JPG$

3@name/.jpg

4[ ^~ ]

5[ @ ][ ^~ ]不能同时存在

6/

 

[ = ]  精确匹配,如果知道匹配=号的内容,立即停止搜索,并立即处理请求(优先级最高)

[ ~ ]  区分大小写

[ ~* ] 不区分大小写

[ ^~ ] 只匹配字符串,不匹配正则表达式

[ @ ] 指定一个命名的location,一般只用于内部重定向请求,location @name { ... }


测试是否可行:location ~* /.*\.(gif|jpg|jpeg)${ ...}

curl -o /dev/null -s -w "%{http_code}" 192.168.235.70/oldboy/test.jpg




##################################################################################################################################################

一、基础软件安装

1、卸载OpenJDK

rpm -qa | grep jdk

java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.x86_64

java-1.7.0-openjdk-1.7.0.45-2.4.3.3.0.1.el6.x86_64


 rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.x86_64

 rpm -e --nodeps java-1.7.0-openjdk-1.7.0.45-2.4.3.3.0.1.el6.x86_64


2、安装Sun JDK

cd /usr

tar -zvxf jdk-7u75-linux-x64.tar.gz

rm -rf jdk-7u75-linux-x64.tar.gz


vi /etc/profile

JAVA_HOME=/usr/jdk1.7.0_75

PATH=$JAVA_HOME/bin:$PATH

CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export JAVA_HOME PATH CLASSPATH

export LD_LIBRARY_PATH=/usr/local/apr/lib


source /etc/profile


java -version

java version "1.7.0_75"

Java(TM) SE Runtime Environment (build 1.7.0_75-b13)

Java HotSpot(TM) 64-Bit Server VM (build 24.75-b04, mixed mode)


3、TomcatAPR安装


生产服务器yum源严格要求一致,否则所装软件版本不一致可能导致不可估计的错误。

确认用public-yum-ol6.repo 源   

ls /etc/yum.repos.d

public-yum-ol6.repo


安装apr依赖 

yum install apr apr-util apr-devel openssl-devel -y


应用APR到Tomcat

cd  /opt/apache-tomcat-8.0.20/bin

tar -zvxf tomcat-native.tar.gz

cd /opt/apache-tomcat-8.0.20/bin/tomcat-native-1.1.32-src/jni/native

 

./configure --with-apr=/usr/bin --with-ssl=/usr/bin

make && make install


server.xml修改如下

<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"

connectionTimeout="20000"

redirectPort="8443"

useBodyEncodingForURI="true" URIEncoding="UTF-8"/>


应用用户及权限


应用用户: appuser/appuser   禁止使用root用户操作


groupadd appuser

adduser appuser -g appuser

passwd appuser

 

mkdir -p /var/cshlog/

mkdir -p /opt/cshserv/

mkdir -p /var/cshfiles/

 

chown -R appuser:appuser /usr/jdk1.7.0_75

chown -R appuser:appuser /opt/apache-tomcat-8.0.20

chown -R appuser:appuser /opt/cshserv

chown -R appuser:appuser /var/cshlog

chown -R appuser:appuser /varcshfiles/


 crontab -e

*/10 * * * * /usr/sbin/ntpdate time.gyist.com;hwclock -w


应用安装位置


1. /usr/jdk1.7.0_75/  jdk安装位置

2. /opt/apache-tomcat-8.0.20第三方应用安装位置(copy完成放/opt), 其他安装安默认位置安装


1. /opt/apache-tomcat-8.0.20/logs  tomcat logs位置

2. /opt/cshserv/apps  应用war包部署位置

3. /opt/cshserv/config应用配置部署位置

4. /var/cshfiles/   应用文件保存位置

5. /var/cshlog   应用log

webapp主位置

/opt/hsserv/apps/ufe-paygateway


4、tomcat配置


<?xml version='1.0' encoding='utf-8'?>

<!--

  Licensed to the Apache Software Foundation (ASF) under one or more

  contributor license agreements.  See the NOTICE file distributed with

  this work for additional information regarding copyright ownership.

  The ASF licenses this file to You under the Apache License, Version 2.0

  (the "License"); you may not use this file except in compliance with

  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software

  distributed under the License is distributed on an "AS IS" BASIS,

  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

  See the License for the specific language governing permissions and

  limitations under the License.

-->

<!-- Note:  A "Server" is not itself a "Container", so you may not

     define subcomponents such as "Valves" at this level.

     Documentation at /docs/config/server.html

 -->

<Server port="8005" shutdown="SHUTDOWN">

  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />

  <!-- Security listener. Documentation at /docs/config/listeners.html

  <Listener className="org.apache.catalina.security.SecurityListener" />

  -->

  <!--APR library loader. Documentation at /docs/apr.html -->

  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />

  <!-- Prevent memory leaks due to use of particular java/javax APIs-->

  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />

  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <!-- Global JNDI resources

       Documentation at /docs/jndi-resources-howto.html

  -->

  <GlobalNamingResources>

    <!-- Editable user database that can also be used by

         UserDatabaseRealm to authenticate users

    -->

    <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>

  <!-- A "Service" is a collection of one or more "Connectors" that share

       a single "Container" Note:  A "Service" is not itself a "Container",

       so you may not define subcomponents such as "Valves" at this level.

       Documentation at /docs/config/service.html

   -->

  <Service name="Catalina">

    <!--The connectors can use a shared executor, you can define one or more named thread pools-->

    <!--

    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"

        maxThreads="150" minSpareThreads="4"/>

    -->

    <!-- A "Connector" represents an endpoint by which requests are received

         and responses are returned. Documentation at :

         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)

         Java AJP  Connector: /docs/config/ajp.html

         APR (HTTP/AJP) Connector: /docs/apr.html

         Define a non-SSL/TLS HTTP/1.1 Connector on port 8080

    -->

    <!--<Connector port="5050" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" /> -->

    <Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"

                executor="tomcatThreadPool"

                maxThreads="600"

                enableLookups="false"

                acceptCount="500"

                minSpareThreads="10"

                maxSpareThreads="100"

                connectionTimeout="60000"

                redirectPort="8443"

                disableUploadTimeout="true"

                debug="0" URIEncoding="UTF-8"

                compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"

                compression="on" compressionMinSize="2048"/>

    <!-- A "Connector" using the shared thread pool-->

    <!--

    <Connector executor="tomcatThreadPool"

               port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" />

    -->

    <!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443

         This connector uses the NIO implementation that requires the JSSE

         style configuration. When using the APR/native implementation, the

         OpenSSL style configuration is required as described in the APR/native

         documentation -->

    <!--

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"

               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"

               clientAuth="false" sslProtocol="TLS" />

    -->

    <!-- Define an AJP 1.3 Connector on port 8009 -->

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

    <!-- An Engine represents the entry point (within Catalina) that processes

         every request.  The Engine implementation for Tomcat stand alone

         analyzes the HTTP headers included with the request, and passes them

         on to the appropriate Host (virtual host).

         Documentation at /docs/config/engine.html -->

    <!-- You should set jvmRoute to support load-balancing via AJP ie :

    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">

    -->

    <Engine name="Catalina" defaultHost="localhost">

      <!--For clustering, please take a look at documentation at:

          /docs/cluster-howto.html  (simple how to)

          /docs/config/cluster.html (reference documentation) -->

      <!--

      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

      -->

      <!-- Use the LockOutRealm to prevent attempts to guess user passwords

           via a brute-force attack -->

      <Realm className="org.apache.catalina.realm.LockOutRealm">

        <!-- This Realm uses the UserDatabase configured in the global JNDI

             resources under the key "UserDatabase".  Any edits

             that are performed against this UserDatabase are immediately

             available for use by the Realm.  -->

        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"

               resourceName="UserDatabase"/>

      </Realm>

      <Host name="localhost"  appBase="webapps"

            unpackWARs="true" autoDeploy="true">

        <!-- SingleSignOn valve, share authentication between web applications

             Documentation at: /docs/config/valve.html -->

        <!--

        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />

        -->

        <!-- Access log processes all example.

             Documentation at: /docs/config/valve.html

             Note: The pattern used is equivalent to using pattern="common" -->

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

               prefix="localhost_access_log" suffix=".txt"

               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      </Host>

      <!-- Host name="xxx.test.gyist.com" debug="0" unpackWARs="true" autoDeploy="true">

           <Context path="" docBase="/opt/hsserv/apps/xxx" reloadable="true"></Context>

      </Host -->

    </Engine>

  </Service>

</Server>









JVM参数及应用配置包外注入

cd /opt/apache-tomcat-8.0.20/bin

[appuser@slave1 bin]$ cat setenv.sh

CATALINA_OPTS="-Xms1024m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m -Dlog.home=/var/cshlog -Dlog.level=debug -Dfile.encoding=UTF-8 -Dhazelcast.client.config=/opt/cshserv/config/hazelcast-client.xml"

CLASSPATH=/opt/cshserv/config:$CLASSPATH

-Dhazelcast.client.config=/opt/cshserv/config/hazelcast-client.xml  全局缓层配置


应用上下文同域名配置

cd /opt/apache-tomcat-8.0.20/conf

cat server.xml 

<Host name="csh.dev.gyist.com" debug="0" unpackWARs="true" autoDeploy="true">

           <Context path="" docBase="/opt/cshserv/prvg-web/acl" reloadable="true"></Context>

      </Host>

<Host name="zxy.dev.gyist.com" debug="0" unpackWARs="true" autoDeploy="true">

           <Context path="" docBase="/opt/cshserv/gcs-web/gcs" reloadable="true"></Context>

      </Host>


如下是权限系统https定制(其他系统同上)

HTTP方式

<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"

       connectionTimeout="20000"

       redirectPort="8443" URIEncoding="UTF-8"/>

 

如果用ssl请增加

<Connector protocol="org.apache.coyote.http11.Http11Protocol"

           port="8443" 

       connectionTimeout="20000"

       scheme="https" secure="true" SSLEnabled="true"

          keystoreFile="/opt/cshserv/config/server.keystore"

          keystorePass="changeit"

          clientAuth="false" sslProtocol="TLS" URIEncoding="UTF-8"/>  

 

APR方式

<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"

connectionTimeout="20000"

redirectPort="8443"

useBodyEncodingForURI="true" URIEncoding="UTF-8"/>

 

如果用ssl请增加

<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"

connectionTimeout="20000"

        scheme="https" secure="true" SSLEnabled="true"

        SSLCertificateFile="/opt/cshserv/config/server.keystore.pem"

SSLCertificateKeyFile="/opt/cshserv/config/server.keystore.pem"

        keystorePass="changeit" clientAuth="false" sslProtocol="TLS"

useBodyEncodingForURI="true" URIEncoding="UTF-8"/>


cd /opt/apache-tomcat-8.0.20/bin

./configtest.sh 

./startup.sh

./shutdown.sh

如果不能停止,可用ps -ef |grep java 查看,手动杀死进程。

查看log是否应用成功


./configtest.sh

INFO: Loaded APR based Apache Tomcat Native library 1.1.31 using APR version 1.3.9. 说明APR应用成功。


##################################################################################################################################################

一、什么是CA,为什么使用CA

http://1inux.blog.51cto.com/10037358/1638154

 CA(Certificate Authority)是数字证书认证中心的简称,是指发放、管理、废除数字证书的机构。CA的作用是检查证书持有者身份的合法性,并签发证书(在证书上签字),以防证书被伪造或篡改,以及对证书和密钥进行管理。

CA是PKI(Public Key Infrastructure)体系的核心。它为客户的公开密钥签发公钥证书、发放证书和管理证书,并提供一系列密钥生命周期内的管理服务。它将客户的公 钥与客户的名称及其他属性关联起来,为客户之间电子身份进行认证。证书中心是一个具有权威性、可信赖性和公证性的第三方机构。它是电子商务存在和发展的基础。

简单的说,使用CA不仅能保证数据的安全传输,还能保证目标的可信赖性。


由于是使用openssl架设私有证书中心,因此要保证以下字段在证书中心的证书、服务端证书、客户端证书中都相同

Country Name

 State or Province Name

 Locality Name

 Organization Name

 Organizational Unit Name


编辑证书中心配置文件

vim /etc/pki/tls/openssl.cnf

[ req_distinguished_name ]

countryName                     = Country Name (2 letter code)

countryName_default             = CN

countryName_min                 = 2

countryName_max                 = 2


stateOrProvinceName             = State or Province Name (full name)

stateOrProvinceName_default     = GD


localityName                    = Locality Name (eg, city)

localityName_default    = SZ


0.organizationName              = Organization Name (eg, company)

0.organizationName_default      = csh


# we can do this but it is not needed normally :-)

#1.organizationName             = Second Organization Name (eg, company)

#1.organizationName_default     = World Wide Web Pty Ltd


organizationalUnitName          = Organizational Unit Name (eg, section)

organizationalUnitName_default  = csh


commonName                      = Common Name (eg, your name or your server\'s hostname)

commonName_max                  = 64


[root@nameserver242 conf]# touch /etc/pki/CA/index.txt

[root@nameserver242 conf]# echo 01 > /etc/pki/CA/serial


创建证书私钥

cd /etc/pki/CA/private

 (umask 077;openssl genrsa -out cakey.pem 2048)


生成自签证书

cd /etc/pki/CA/

 openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days=3655


3、创建服务器证书

mkdir /usr/local/nginx/ssl

 cd /usr/local/nginx/ssl

 (umask 077;openssl genrsa -out nginx.key 1024)

 openssl req -new -key nginx.key -out nginx.csr

 openssl ca -in nginx.csr -out nginx.crt -days=3650


4、创建客户端浏览器证书

(umask 077;openssl genrsa -out client.key 1024)

 openssl req -new -key client.key -out client.csr

 openssl ca -in client.csr -out client.crt -days=3650

 将文本格式的证书转换成可以导入浏览器的证书

 openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12


vim /usr/local/nginx/conf/nginx.conf

 ssl on;

 ssl_certificate         /usr/local/nginx/ssl/nginx.crt;

 ssl_certificate_key     /usr/local/nginx/ssl/nginx.key;

 ssl_client_certificate  /usr/local/nginx/ssl/cacert.pem;

 ssl_session_timeout     5m;

 #ssl_verify_client       on;                         服务器验证客户端,暂时不开启,让没有证书的客户端可以访问,先完成单向验证

 ssl_protocols           SSLv2 SSLv3 TLSv1;


错误:

1、

2、Sign the certificate? [y/n]:y

failed to update database

TXT_DB error number 2

rm -rf /etc/pki/CA/index.txt  &&  touch /etc/pki/CA/index.txt





5、测试

192.168.9.245:808

192.168.9.245:80

192.168.9.245:80/xiaoyi

192.168.9.244:8080/TestProject


发现问题与解决问题:

vim catalina.out

14-Apr-2017 15:20:05.932 INFO [main] org.apache.catalina.core.AprLifecycleLi    stener.lifecycleEvent Loaded APR based Apache Tomcat Native library 1.1.32 u    sing APR version 1.5.0.

如此表示APR应用成功;