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支持javascript

 

 

  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便可。css

最後,咱們可使用以下命令對Nginx服務進行操做:html

######啓動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.java

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.一、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/806956node

安裝完後,配置環境變量:mysql

vim /etc/profile,增長行linux

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

配置tomcat開機自啓動git

編輯/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 #使配置當即生效
相關文章
相關標籤/搜索