Linux下nginx与Tomcat的https非443端口配置

nginx的安装

本文中采用编译安装。步骤如下: 

  1. # 检查和安装依赖项(gcc、正则表达式工具、传送内容压缩的zlib库、openssl开启https支持),-y表示静默安装
  2. yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
  3. 创建www用户和组
    /usr/sbin/groupadd www
    /usr/sbin/useradd -g www -d /dev/null -s /usr/sbin/nologin www
  4.  mkdir -p /data/logs
  5. chmod +w /data/logs
  6.  chown -R www:www /data/logs
  7. # 下载源码包
  8. wget http://nginx.org/download/nginx-1.10.2.tar.gz
  9.  
  10. # 解压源码包
  11. tar zxvf nginx-1.10.2.tar.gz
  12.  
  13. # 进入解压的目录配置相关参数(可以使用--help查看可选项)
  14. cd nginx-1.10.2.tar.gz
    /
  15. ./configure --help
  16. ./configure --user=www --group=www --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-openssl=/data/soft/openssl-1.0.2j --with-http_ssl_module --with-http_realip_module --with-http_flv_module
  17. 注意:编译nginx添加ssl支持,如果需要编译的openssl,--with-openssl=DIR DIR是openssl的源码路径,不是openssl的安装路径,否则make时将出错:

Nginx编译参数
--user            指定启动程序所属用户
--group          指定组
--prefix          指定安装路径
--with-http_stub_status_module    安装可以监控nginx状态的模块
--with-http_ssl_module                启用SSL支持

 

 

  1. # 安装
  2. make && make install
  3. 启动前检查一下: /usr/local/webserver/nginx/sbin/nginx -t
  4. # 启动nginx
  5. /usr/local/webserver/nginx/sbin/nginx
  6. ps -aux|grep nginx # 查看进程(正常工作的时候有守护进程和工作进程)
  7. ./nginx -h # 查看帮助

 

Nginx服务启动、停止和重启等操作的SHELL脚本

#! /bin/bash
#
# 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
# pidfile:     /var/run/nginx/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/local/webserver/nginx/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/usr/local/webserver/nginx/conf/nginx.conf"


[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

lockfile=/var/lock/nginx.lock

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
}

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

将上面的shell脚本内容以Unix格式(不能用dos哦)保存并命名为nginx,然后上传到centos系统的/etc/init.d/目录,接着添加可执行权限,最后执行添加到开机启动的命令:chkconfig --add nginxchkconfig nginx on即可。

最后,我们可以使用如下命令对Nginx服务进行操作:

######启动Nginx服务
[root@typecodes ~]# service nginx start
######停止Nginx服务
[root@typecodes ~]# service nginx stop
######重启Nginx服务
[root@typecodes ~]# service nginx restart
######Nginx服务的状态
[root@typecodes ~]# service nginx status
######在Nginx服务启动的状态下,重新加载nginx.conf这个配置文件
[root@typecodes ~]# service nginx reload

nginx的配置

nginx的主配置文件位于安装目录下的conf/nginx.conf.

nginx的优化

 

user  www www;
worker_processes  8;
#开启全局错误日志类型
error_log  /data/logs/nginx/error.log info;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        /data/logs/nginx/nginx.pid;
#一个Nginx进程打开的最多文件描述数目 建议与ulimit -n一致
#如果面对高并发时 注意修改该值 ulimit -n 还有部分系统参数 而并非这个单独确定
worker_rlimit_nofile 65535;

events {
    #使用epoll模型提高性能
    use epoll;
    #单个进程最大连接数
    worker_connections  65535;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

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

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nopush on;
    tcp_nodelay on;
    types_hash_max_size 2048;

    proxy_redirect off;
    proxy_set_header Host $host:$server_port;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto  $scheme;
    client_max_body_size 10m;
    client_body_buffer_size 128k;
    proxy_connect_timeout 65;
    proxy_send_timeout 65;
    proxy_read_timeout 65;
    proxy_buffer_size 4k;
    proxy_buffers 4 32k;
    proxy_busy_buffers_size 64k;
    #日志
    access_log /data/logs/nginx/access.log;
    error_log /data/logs/nginx/error.log;
    #gzip 压缩传输
    gzip on;
    gzip_min_length 1k;  #最小1K
    gzip_buffers 16 64K;
    gzip_http_version 1.1;
    gzip_comp_level 6;
    gzip_types text/plain application/x-javascript text/css application/xml application/javascript;
    gzip_vary on;

    upstream tomcat.dynamic {
       server 127.0.0.1:8000 fail_timeout=0;
    }
    upstream tomcat.static{
       server 127.0.0.1:8080 fail_timeout=0;
    }
server{
        listen 8080;
        server_name static;
        location / {

        }
        location ~ .*\.(js|css|ico|png|jpg|eot|svg|ttf|woff) {
        #所有静态文件直接读取硬盘
        root /data/soft/apache-tomcat-7.0.73/webapps/ROOT ;
        expires 30d; #缓存30天
        }
}
# HTTPS server
server {
     listen       4443 ssl;
     server_name dps.vivo.xyz;
     root /data/htdocs;
     index  index.html index.htm
     ssl                  on;
     ssl_certificate      server.pem;
     ssl_certificate_key  server.key;
     ssl_session_timeout  5m;
     ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
     #启用TLS1.1、TLS1.2要求OpenSSL1.0.1及以上版本,若您的OpenSSL版本低于要求,请使用 ssl_protocols TLSv1;
     ssl_ciphers  HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM;
     ssl_prefer_server_ciphers   on;
     #让http请求重定向到https请求   
     error_page 497  https://$host:$server_port$request_uri;
     location / {

             }
   location ~ .*\.(js|css|ico|png|jpg|eot|svg|ttf|woff) {
                 proxy_pass http://tomcat.static$request_uri;
                 expires 30d;
        }
         location ~ .*$ {
                proxy_pass http://tomcat.dynamic$request_uri;
        }
}

linux下tomcat配置

安装Jdk和tomcat步骤省略,启用tomcat的apr步骤请参考:https://my.oschina.net/u/1160316/blog/806956

安装完后,配置环境变量:

vim /etc/profile,增加行

JAVA_HOME="/usr/local/webserver/jdk1.7.0_79"
PATH="$JAVA_HOME/bin:$JAVA_HOME/jre/bin:/usr/local/webserver/mysql/bin:$PATH"
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
CATALINA_HOME=/data/soft/apache-tomcat-7.0.73
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/webserver/apr/lib:/usr/local/apr/lib 
export JAVA_HOME PATH CLASSPATH LD_LIBRARY_PATH 


 

实时获取服务器的状态:tail -f /opt/apache-tomcat-8.0.26/logs/catalina.out

配置tomcat开机自启动

编辑/etc/rc.d/rc.local追加:

/data/soft/apache-tomcat-7.0.73/bin/startup.sh

tomcat的优化

tomcat的优化实际上就是合理配置$CATALINA_HOME/bin/catalina.sh$CATALINA_HOME/conf/server.xml

catalina.sh配置

  1. # windows下设置方法
  2. #set JAVA_OPTS=%JAVA_OPTS% -server -Xms512m -Xmx512m -XX:PermSize=512M -XX:MaxPermSize=512m
  3. # 通过内存设置充分利用服务器内存
  4. # -server模式启动应用慢,但可以极大程度提高运行性能
  5. # java8开始,PermSize被MetaspaceSize代替,MetaspaceSize共享heap,不会再有java.lang.OutOfMemoryError: PermGen space,可以不设置
  6. # headless=true适用于linux系统,与图形操作有关,如生成验证码,含义是当前使用的是无显示器的服务器,应用中如果获取系统显示有关参数会抛异常
  7. # 可通过jmap -heap proccess_id查看设置是否成功
  8. JAVA_OPTS=" -server -Xms2048m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m -Djava.awt.headless=true"

server.xml的配置

vim /data/soft/apache-tomcat-7.0.73/conf/server.xml

 

<Connector port="8000"
               protocol="org.apache.coyote.http11.Http11AprProtocol"
               connectionTimeout="20000"
               redirectPort="443"
               proxyPort="443"
               URIEncoding="UTF-8"
               acceptCount="500"
               enableLookups="false"
               maxThreads="400"
               executor="tomcatThreadPool"
               />
    <Executor name="tomcatThreadPool"  namePrefix="req-exec-"  maxThreads="1000"  minSpareThreads="50" maxIdleTime="60000" />
<Valve className="org.apache.catalina.valves.RemoteIpValve"
               remoteIpHeader="x-forwarded-for"
               protocolHeader="x-forwarded-proto"
               protocolHeaderHttpsValue="https"
               httpsServerPort="4443"


 

nginx和tomcat的负载均衡

源码地址 
nginx是一个反向代理服务器,它的负载均衡也是基于反向代理来实现的,反向代理的原理图如下: 
反向代理原理图 
从浏览器角度来看,它并不知道tomcat的存在。

配置nginx将所有请求转交给tomcat 
编辑nginx.conf,修改location如下:

 

重新加载nginx:./nginx -s reload。如果我们的服务器IP地址是http://192.168.132.144/,我们提交的http://192.168.132.144/test.jsp请求将被替换为http://192.168.132.144:8080/test.jsp.

所谓的负载均衡就是后台有多个应用服务器tomcat(集群),nginx根据一定的策略(默认是平均策略)将请求转发给多个tomcat分担了来自前端的请求——最终多个后台服务器均衡分担了前端的负载。 
负载均衡

在http节点中添加tomcat集群:

  1. # tomcat集群
  2. upstream tomcats{
  3. server 127.0.0.1:8080;
  4. server 192.168.132.145:8080;
  5. server 192.168.132.146:8080;
  6. }

配置location为tomcat集群

  1. location / {
  2. # root html;
  3. index index.html index.htm;
  4. # 将请求转交给tomcat集群
  5. proxy_pass http://tomcats;
  6. }

nginx的集群配置详解:

  1. # upstream 配置一组后端服务器,
  2. # 请求转发到upstream后,nginx按策略将请求指派出某一服务器
  3. # 即配置用于负载均衡的服务器群信息
  4. upstream backends {
  5. #均衡策略
  6. #none 轮询(权重由weight决定)
  7. #ip_hash
  8. #fair
  9. #url_hash
  10.  
  11. server 192.168.1.62:8080;
  12. server 192.168.1.63;
  13.  
  14. # weight:权重,值越高负载越大;
  15. # server 192.168.1.64 weight=5;
  16.  
  17. # backup:备份机,只有非备份机都挂掉了才启用;
  18. server 192.168.1.64 backup;
  19.  
  20. # down: 停机标志,不会被访问,主要用于停机维护
  21. server 192.168.1.65 down;
  22.  
  23. # max_fails:达到指定次数认为服务器挂掉;
  24. # fail_timeout:挂掉之后过多久再去测试是否已恢复
  25. server 192.168.1.66 max_fails=2 fail_timeout=60s;
  26. }

均衡策略

  • none 
    nginx缺省的负载均衡策略是平均策略。实际使用中应该使用加权轮询(配置高的服务器得到的请求多),缺省情况下每个serrver的weight = 1.

例如有以下的配置:

 
  1. server 192.168.61.22 weight = 6; # 60% 请求
  2. server 192.168.61.23 weight = 4; # 40% 请求
  • ip_hash 
    根据客户端的IP进行hash运算,产生的效果是如果用户的IP不变每次访问的都是同一台后台服务器。 
    配置只需要在upstream中加入ip_hash;即可.

  • 第三方策略

    • fair:自动管理(谁的响应能力强,自动分配更多负载)
    • url_hash:和IP哈希类似,只不过针对请求的url进行hash(基于缓存的server,页面静态化).

下面以fair模块为例,演示第三方策略的配置:

 
  1. # 解压
  2. unzip nginx-upstream-fair-master.zip
  3. # 编译nginx的时候指定添加的第三方模块
  4. ./configure --prefix=/opt/nginx --add-module=/root/nginx-upstream-fair-master
  5. # 如果是首次安装需要make && make install,已经安装nginx只需要make即可,编译结果在当前目录的objs目录下
  6. make
  7. # 使用objs/nginx 替换原来的nginx
  8. /opt/nginx/sbin/nginx -s stop
  9. cp nginx /opt/nginx/sbin/nginx

负载均衡时session的处理策略

session实际上是tomcat上的一个内存空间,所以在分布式集群的时候session存在一个问题。由于nginx的转发同一个用户的请求可能被转发到不同的Tomcat。

处理方式有以下3种:

  • 粘性session。将用户锁定到特定的tomcat(例如采用ip_hash策略)。优点是简单,但是缺乏容错性,一旦服务器挂掉,用户的请求被转发到其他的tomcat,用户的session丢失。
  • session复制。当任意一个tomcat的session发生改变,向整个集群发送广播。容错性高,但是网络性能消耗大,性能不高。实现session复制功能需要以下2步: 
    1.在tomcat的server.xml中开启集群功能(在Engine标签中增加以下代码):
 
  1. <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
  2. <!-- 基于网络广播的策略,一个节点session变化,其它节点同步复制,节点多或数据量大时性能低下 -->
  3. <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
  4. <Channel className="org.apache.catalina.tribes.group.GroupChannel">
  5. <!--
  6. 1.tomcat集群的端口冲突问题。例如同一台服务器运行多个tomcat。
  7. 2.服务器一般有多块网卡(内网和外网),tomcat都应该使用内网网卡
  8. -->
  9. <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
  10. address="auto"
  11. port="4000" />
  12. </Channel>
  13. </Cluster>

2.修改应用的部署描述符web.xml告诉tomcat该应用支持分布式。在web-app标签下新增<distributable/>.

  • 额外创建一个共享的空间用来存放session。我们需要借助一个分布式缓存,例如memcached、redis。

下面介绍使用memcached来管理分布式缓存。

memchched的安装依赖于libevent.

 
  1. ## 安装libevent
  2. # 下载libevent
  3. wget https://sourceforge.net/projects/levent/files/libevent/libevent-2.0/libevent-2.0.22-stable.tar.gz
  4. # 解压
  5. tar zxvf libevent-2.0.22-stable.tar.gz
  6. cd libevent-2.0.22-stable/
  7. # configure
  8. ./configure -prefix=/opt/libevent
  9. # 编译和编译安装
  10. make && make install
  11.  
  12. ## 安装memcached
  13. wget http://www.memcached.org/files/memcached-1.4.24.tar.gz
  14. tar axvf memcached-1.4.24.tar.gz
  15. cd memcached-1.4.24/
  16. ./configure --prefix=/opt/memcached --with-libevent=/opt/libevent
  17. make && make install
  18.  
  19. ## 启动分布式缓存(后台进程,以root用户,监听11211端口,使用内存128M,最大支持1024连接)
  20. cd /opt/memcached/bin
  21. ./memcached -d -u root -p 11211 -m 128 -c 1024

所有的memcached服务器是同步的。 
使用memcached管理session的工作原理(粘性session): 
memcached-tomcat-1 
以tomcat为主存储,将session的变更存储到memcached中,一旦1tomcat down,就从memcached2中取出session推送到tomcat2.

使用memcached管理session的工作原理(非粘性session): 
tomcat本身并不存储session,每次从共享的memcached中读写。 
memcached-tomcat-2

配置memcached:

  1. 复制jar包到tomcat/lib目录,jar分三类 
    1)spymemcached.jar memcached java客户端 
    2)msm相关的包 
    memcached-session-manager-{version}.jar 核心包 
    memcached-session-manager-tc{tomcat-version}-{version}.jar Tomcat版本相关的包 
    3)序列化工具包,有多种可选方案,不设置时使用jdk自带序列化,其它可选kryo,javolution,xstream,flexjson等 
    msm-{tools}-serializer-{version}.jar 
    其它序列化工具相关包 一般第三方序列化工具不需要实现serializable接口

  2. 配置Context,加入处理session的Manager MemcachedBackupSessionManager Context配置查找顺序: 1)conf/context.xml 全局配置,作用于所有应用 
    2) conf/[enginename]/[hostname]/context.xml.default 全局配置,作用于指定host下全部应用 
    3) conf/[enginename]/[hostname]/[contextpath].xml 只作用于contextpath指定的应用 
    4) 应用META-INF/context.xml 只作用于本应用 
    5) conf/server.xml 下 作用于Context docBase指定的应用 所以,只希望session管理作用于特定应用,最好用3,4方式设置,希望作用全体,可用1,2,5设置。

Context.xml的配置如下:

 
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Context>
  3. <WatchedResource>WEB-INF/web.xml</WatchedResource>
  4. <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
  5.  
  6. <!-- sticky session 最小配置-->
  7. <!-- className 管理器类名 -->
  8. <!-- memcachedNodes memcached服务器节点,以节点名:主机:端口形式表示,其中节点名随意命名,但不同tomcat间要一致 -->
  9. <!-- sticky隐含默认值为true,此时为sticky session模式 -->
  10. <!-- failoverNodes 仅适用于sticky模式, n1表示主要将session备份到n2,如果n2不可用,再用n1-->
  11. <!-- 另一台服务器配置正好相反,这样保证将session保存到其它机器,避免整个机器崩溃时tomcat与session一起崩溃-->
  12. <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
  13. memcachedNodes="n1:192.168.1.62:11211,n2:192.168.1.63:11211"
  14. failoverNodes="n1"
  15. />
  16.  
  17. <!-- 经常用到的生产环境sticky模式配置 -->
  18. <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
  19. memcachedNodes="n1:192.168.1.62:11211,n2:192.168.1.63:11211"
  20. failoverNodes="n1"
  21. requestUriIgnorePattern=".*\.(jpg|png|css|js)$"
  22. memcachedProtocol="binary"
  23. transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
  24. />
  25.  
  26. <!-- 经常用到的生产环境non-sticky模式配置 -->
  27. <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
  28. memcachedNodes="n1:192.168.1.62:11211,n2:192.168.1.63:11211"
  29. sticky="false"
  30. sessionBackupAsync="false"
  31. lockingMode="auto"
  32. requestUriIgnorePattern=".*\.(jpg|png|css|js)$"
  33. memcachedProtocol="binary"
  34. transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
  35. />
  36.  
  37. <!--
  38. <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
  39. memcachedNodes="n1:192.168.1.62:11211,n2:192.168.1.63:11211"
  40.  
  41. #sticky模式,默认true
  42. sticky="false"
  43.  
  44. #仅适用于sticky模式,n1表示主要将session备份到n2,如果n2不可用,再用n1
  45. failoverNodes="n1"
  46.  
  47. #忽略的请求类型,这些类型请求不处理session
  48. requestUriIgnorePattern=".*\.(jpg|png|css|js)$"
  49.  
  50. #例如context中设置sessionPath=/时,一个host下多个应用可能有相同session_id,
  51. #此时向memcached写入时会造成混乱,可通过以下方式加前缀区分不同应用
  52. storageKeyPrefix="static:name|context|host|webappVersion|context.hash|host.hash|多项组合,以,间隔"
  53.  
  54. #设置mecached协议数据传输方式,默认text,设为binary有助力性能提升
  55. memcachedProtocol="binary"
  56.  
  57. #是否异步存储session变化,默认true,性能好,适用于sticky模式,
  58. #non-sticky时建议设置为false,避免延迟造成信息不一致
  59. sessionBackupAsync="false"
  60.  
  61. #仅适用于non-sticky模式,为避免同步编辑冲突,在修改session时锁定
  62. #同步编辑一种可能发生的情况是在ajax请求时,同一页多个请求同时发起,可能会访问不同后端
  63. #auto 读模式不锁写模式锁
  64. #uriPattern模式,将URI+"?"+queryString与模式Regex匹配,如果匹配则锁定
  65. lockingMode="none|all|auto|uriPattern:Regex"
  66.  
  67. #使用第三方序列化工具,提高序列化性能
  68. #常用的第三方工具kryo, javolution, xstream等
  69. #此时需要向tomcat/lib下添加相关jar包
  70. transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
  71.  
  72. />
  73. -->
  74. </Context>

集群环境中应用代码应该注意的问题

  1. 实体类必须是可序列化的(Serialable接口)
  2. 使用request.getRemoteAddr()方法获取的是nginx代理的地址,如果需要知道客户端的IP,需要在nginx中设置代理的头信息。
 
  1. location / {
  2. # root html;
  3. index index.html index.htm;
  4. # 将请求转交给tomcat集群
  5. proxy_pass http://tomcats;
  6. # 设置代理的头信息
  7. proxy_set_header X-Real-IP $remote_addr;
  8. }

在我们的应用中可以这样获取客户端的真实IP:

 
  1. public class RealGetter{
  2. /**
  3. * 有X-Real-IP头,就获取X-Real-IP,否则request.getRemoteAddr()
  4. */
  5. public String getIP(HttpServletRequest request){
  6. String remoteIP = request.getRemoteAddr();
  7. String headIP = request.getHeader('X-Real-IP');
  8. return headIP == null ? remoteIP : headIP;
  9. }
  10. }

常见问题以及解决方案

  • 本机可以访问,而无法远程访问。 
    此种情况多数是由于防火墙设置不当或者启用了SELinux,我们可以执行以下的命令。
 
  1. # 清除所有规则
  2. iptables -F
  3. # 重启iptables
  4. service iptables restart

关闭SELinux

 
  1. vim /etc/selinux/config
  2.  
  3. #SELINUX=enforcing #注释掉
  4. #SELINUXTYPE=targeted #注释掉
  5. SELINUX=disabled #增加
  6.  
  7. setenforce 0 #使配置立即生效

转载于:https://my.oschina.net/u/1160316/blog/810607

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值