【Nginx】Nginx在Linux下的入門介紹

Nginx的安裝

下載、解壓

Nginx下載安裝包,我下的是nginx-1.8.0.tar.gz。解壓後的目錄爲:html

[root@blog third_package]# tar -zxf nginx-1.8.0.tar.gz 
[root@blog third_package]# ll nginx-1.8.0
total 652
drwxr-xr-x 6 1001 1001   4096 Jul 23 18:17 auto
-rw-r--r-- 1 1001 1001 249124 Apr 21  2015 CHANGES
-rw-r--r-- 1 1001 1001 379021 Apr 21  2015 CHANGES.ru
drwxr-xr-x 2 1001 1001   4096 Jul 23 18:17 conf
-rwxr-xr-x 1 1001 1001   2478 Apr 21  2015 configure
drwxr-xr-x 4 1001 1001   4096 Jul 23 18:17 contrib
drwxr-xr-x 2 1001 1001   4096 Jul 23 18:17 html
-rw-r--r-- 1 1001 1001   1397 Apr 21  2015 LICENSE
drwxr-xr-x 2 1001 1001   4096 Jul 23 18:17 man
-rw-r--r-- 1 1001 1001     49 Apr 21  2015 README
drwxr-xr-x 8 1001 1001   4096 Jul 23 18:17 src

依賴的軟件

安裝以前把依賴的軟件裝上,我這裏用YUMyum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-develnginx

安裝

[root@blog nginx-1.8.0]# pwd
/installation_package/nginx-1.8.0
[root@blog nginx-1.8.0]# 
[root@blog nginx-1.8.0]# ./configure --prefix=/opt/nginx_1

執行./configure後在添加了一個目錄objs--prefix表示安裝到此目錄,若是不設置默認安裝到/usr/local/nginxc++

編譯工做:web

make
make install

啓動

/opt/nginx_1/sbin/nginx啓動,默認使用的是安裝目錄的NGINX_HOME/conf/nginx.conf,也就是/opt/nginx_1/conf/nginx.conf
固然,也能夠使用/opt/nginx_1/sbin/nginx -c /opt/nginx_1/conf/nginx.conf指定配置文件。apache

Nginx的反向代理

咱們經常使用Nginx作反向代理,在設置反向代理前,應先了解下正向代理反向代理後端

如何設置

將到達Nginx的請求轉到後端具體的主機,可經過設置上游服務器代理轉發。好比:api

http {
    ...
    upstream myweb {
        server 127.0.0.1:9999;
    }

    server {
        ...
        location /myweb {
            proxy_pass  http://myweb;
        }
    }

}

設置好以後,將上游服務器127.0.0.1:9999也部署好,就能夠經過Nginx享受上游服務器的具體服務了。tomcat

但要注意請求的信息的轉發,好比後端是一臺TOMCAT,裏面運行一個Servet打印各項參數:服務器

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        StringBuffer sb = new StringBuffer();
        sb.append("request.getProtocol() : " + request.getProtocol()).append("\n");
        sb.append("request.getScheme() : " + request.getScheme()).append("\n");
        sb.append("request.getRemoteAddr() : " + request.getRemoteAddr()).append("\n");
        sb.append("request.getRemoteHost() : " + request.getRemoteHost()).append("\n");
        sb.append("request.getServerPort() : " + request.getServerPort()).append("\n");
        sb.append("request.getRemotePort() : " + request.getRemotePort()).append("\n");
        sb.append("request.getQueryString() : " + request.getQueryString()).append("\n");
        sb.append("request.getRemoteUser() : " + request.getRemoteUser()).append("\n");
        sb.append("request.getMethod() : " + request.getMethod()).append("\n");
        sb.append("request.getLocalAddr() : " + request.getLocalAddr()).append("\n");
        sb.append("request.getLocalName() : " + request.getLocalName()).append("\n");
        sb.append("request.getPathInfo() : " + request.getPathInfo()).append("\n");
        sb.append("request.getRequestURI() : " + request.getRequestURI()).append("\n");
        sb.append("request.getRequestURL() : " + request.getRequestURL()).append("\n");
        sb.append("request.getContextPath() : " + request.getContextPath()).append("\n");
        
        response.getWriter().append("Served at: ").append(request.getContextPath()).append("\n").append(sb);
    }

直接訪問TOMCAT,http://nick-huang.com:9999/myweb/PrintEnvInfoServlet?keyword=hello-world,打印的信息是這樣的:app

Served at: /myweb
request.getProtocol() : HTTP/1.1
request.getScheme() : http
request.getRemoteAddr() : 客戶端IP
request.getRemoteHost() : 客戶端IP
request.getServerPort() : 9999
request.getRemotePort() : 64494
request.getQueryString() : keyword=hello-world
request.getRemoteUser() : null
request.getMethod() : GET
request.getLocalAddr() : 服務端IP
request.getLocalName() : 服務端IP
request.getPathInfo() : null
request.getRequestURI() : /myweb/PrintEnvInfoServlet
request.getRequestURL() : http://nick-huang.com:9999/myweb/PrintEnvInfoServlet
request.getContextPath() : /myweb

只做反向代理的設置,訪問NGINX,https://nick-huang.com:777/myweb/PrintEnvInfoServlet?keyword=hello-world,後打印:

Served at: /myweb
request.getProtocol() : HTTP/1.0
request.getScheme() : http
request.getRemoteAddr() : 127.0.0.1
request.getRemoteHost() : 127.0.0.1
request.getServerPort() : 80
request.getRemotePort() : 54856
request.getQueryString() : keyword=hello-world
request.getRemoteUser() : null
request.getMethod() : GET
request.getLocalAddr() : 127.0.0.1
request.getLocalName() : localhost
request.getPathInfo() : null
request.getRequestURI() : /myweb/PrintEnvInfoServlet
request.getRequestURL() : http://myweb/myweb/PrintEnvInfoServlet
request.getContextPath() : /myweb

反向代理後的請求頭信息傳遞

能夠發現,反向代理後ProtocolRemoteAddrServerPortRequestURL等參數均有所不一樣,那麼咱們須要設置代理時傳遞參數。
Nginx配置:

upstream myweb {
        server 127.0.0.1:9999;
        keepalive 32;
    }
    ...
        location /myweb {
            proxy_set_header Host $host:$server_port;
            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;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_http_version 1.1;
            proxy_set_header Connection "";
            proxy_pass  http://myweb;
        }

相關說明,請點擊連接:proxy_http_versionkeepalive

Tomcat的/conf/server.xmlHost節點下添加:

<Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto" protocolHeaderHttpsValue="https" httpsServerPort="777" />

相關說明,請點擊連接:org.apache.catalina.valves Class RemoteIpValve

訪問https://nick-huang.com:777/myweb/PrintEnvInfoServlet?keyword=hello-world,日誌是這樣的:

Served at: /myweb
request.getProtocol() : HTTP/1.1
request.getScheme() : https
request.getRemoteAddr() : 客戶端IP
request.getRemoteHost() : 客戶端IP
request.getServerPort() : 777
request.getRemotePort() : 55022
request.getQueryString() : keyword=hello-world
request.getRemoteUser() : null
request.getMethod() : GET
request.getLocalAddr() : 127.0.0.1
request.getLocalName() : localhost
request.getPathInfo() : null
request.getRequestURI() : /myweb/PrintEnvInfoServlet
request.getRequestURL() : https://nick-huang.com:777/myweb/PrintEnvInfoServlet
request.getContextPath() : /myweb
相關文章
相關標籤/搜索