【Nginx】 Nginx實現端口轉發

什么是端口轉發

當我們在服務器上搭建一個圖書以及一個電影的應用,其中圖書應用啟動了 8001 端口,電影應用啟動了 8002 端口。此時如果我們可以通過

localhost:8001    //圖書
localhost:8002    //電影

?

  但我們一般訪問應用的時候都是希望不加端口就訪問域名,也即兩個應用都通過 80 端口訪問。但我們知道服務器上的一個端口只能被一個程序使用,這時候如何該怎么辦呢?一個常用的方法是用 Nginx 進行端口轉發。Nginx 的實現原理是:用 Nginx 監聽 80 端口,當有 HTTP 請求到來時,將 HTTP 請求的 HOST 等信息與其配置文件進行匹配并轉發給對應的應用。例如當用戶訪問 book.douban.com 時,Nginx 從配置文件中知道這個是圖書應用的 HTTP 請求,于是將此請求轉發給 8001 端口的應用處理。當用戶訪問 movie.douban.com 時,Nginx?從配置文件中知道這個是電影應用的 HTTP 請求,于是將此請求轉發給 8002 端口的應用處理。一個簡單的 Nginx 配置文件(部分)如下面所示:

#配置負載均衡池
#Demo1負載均衡池
upstream book_pool{server 127.0.0.1:8001;
}
#Demo2負載均衡池
upstream movie_pool{server 127.0.0.1:8002;
}#Demo1端口轉發
server {listen       80;server_name  book.chanshuyi.com;access_log logs/book.log;error_log logs/book.error;#將所有請求轉發給demo_pool池的應用處理location / {proxy_set_header Host $host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://book_pool;}
}
#Demo2端口轉發
server {listen       80;server_name  movie.chanshuyi.com;access_log logs/movie.log;error_log logs/movie.error;#將所有請求轉發給demo_pool池的應用處理location / {proxy_set_header Host $host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://movie_pool;}
}

上面這段配置實現了:

1、當用戶訪問的域名是:http://book.chanshuyi.com 時,我們自動將其請求轉發給端口號為 8001 的 Tomcat 應用處理。

2、當用戶訪問的域名是:http://movie.chanshuyi.com 時,我們自動將其請求轉發給端口號為 8002 的 Tomcat 應用處理。

  上面的這種技術實現就是端口轉發。端口轉發指的是由軟件統一監聽某個域名上的某個端口(一般是80端口),當訪問服務器的域名和端口符合要求時,就按照配置轉發給指定的 Tomcat 服務器處理。我們常用的 Nginx 也有端口轉發功能。

?

?

?

例如我的一個80端口轉發到8080tomcat服務器的配置:(注意紅字地方即修改的地方)

linux下面修改的文件是:??/etc/nginx/nginx.conf

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;events {worker_connections 1024;
}http {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  /var/log/nginx/access.log  main;sendfile            on;tcp_nopush          on;tcp_nodelay         on;keepalive_timeout   65;types_hash_max_size 2048;include             /etc/nginx/mime.types;default_type        application/octet-stream;# Load modular configuration files from the /etc/nginx/conf.d directory.# See http://nginx.org/en/docs/ngx_core_module.html#include# for more information.include /etc/nginx/conf.d/*.conf;    upstream forwardport{server 127.0.0.1:8080;}server {listen       80 default_server;listen       [::]:80 default_server;     server_name  qiaoliqiang.cnroot         /usr/share/nginx/html;# Load configuration files for the default server block.include /etc/nginx/default.d/*.conf;        location / {proxy_connect_timeout    3;proxy_send_timeout    30;proxy_read_timeout      30;proxy_pass      http://forwardport;}error_page 404 /404.html;location = /40x.html {}error_page 500 502 503 504 /50x.html;location = /50x.html {}}# Settings for ap TLS enabled server.
#
#    server {
#        listen       443 ssl http2 default_server;
#        listen       [::]:443 ssl http2 default_server;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers HIGH:!aNULL:!MD5;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        location / {
#        }
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }}

?

當然也可以iptables進行轉發:(80轉到8080處理)

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

?

轉載于:https://www.cnblogs.com/qlqwjy/p/9206937.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250089.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250089.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250089.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機網絡知識總結

一 OSI與TCP/IP各層的結構與功能,都有哪些協議 OSI的七層體系結構概念清楚,理論也很完整,但是它比較復雜而且不實用。在這里順帶提一下之前一直被一些大公司甚至一些國家政府支持的OSI失敗的原因: OSI的專家缺乏實際經驗&#xff…

使用redis做為MySQL的緩存

介紹 在實際項目中,MySQL數據庫服務器有時會位于另外一臺主機,需要通過網絡來訪問數據庫;即使應用程序與MySQL數據庫在同一個主機中,訪問MySQL也涉及到磁盤IO操作(MySQL也有一些數據預讀技術,能夠減少磁盤I…

[Head First Java] - 給線程命名

參考 - P503 public class RunThreads implements Runnable {public static void main (String[] args) {RunThreads runner new RunThreads();Thread alpha new Thread(runner);Thread beta new Thread(runner);alpha.setName("Alpha thread");beta.setName(&qu…

Cortex-M3 的SVC、PendSV異常,與操作系統(ucos實時系統)(轉)

Cortex-M3 的SVC、PendSV異常,與操作系統(ucos實時系統)轉載于:https://www.cnblogs.com/LittleTiger/p/10070824.html

快速排序的C++版

int Partition(int a[], int low, int high) {int x a[high];//將輸入數組的最后一個數作為主元&#xff0c;用它來對數組進行劃分int i low - 1;//i是最后一個小于主元的數的下標for (int j low; j < high; j)//遍歷下標由low到high-1的數{if (a[j] < x)//如果數小于…

springboot---整合shiro

Shiro是一個非常不錯的權限框架&#xff0c;它提供了登錄和權限驗證功能 1.創建數據庫腳本 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0; -- ---------------------------- -- Table structure for module -- ---------------------------- DROP TABLE IF EXISTS module; C…

[Head First Java] - 線程共享數據問題

參考 - P507 1. 說明 兩個線程共享同一份數據,每次使用數據時,需要先判斷其是否在合理范圍每次使用數據完畢使用Thread.sleep函數讓線程阻塞 2.代碼 class BankAccount {private int balance 100;public int getBalance() {return balance;}public void withdraw(int amou…

asp.net中提交表單數據時提示從客戶端(。。。)中檢測到有潛在危險的 Request.Form 值...

看到這個圖是不是很親切熟悉哈&#xff0c;做過。net的肯定都見過哈 已經 將近4年沒碰。net了&#xff0c;今天正好朋友的程序有幾個bug,讓我幫忙修復下&#xff0c;于是我就抱著試試看的心情改了改&#xff0c;改到最后一個問題的時候也就是上面的這個問題&#xff0c;我一看&…

Openresty編寫Lua代碼一例

1.前段時間糾結了很久&#xff0c;一直弄不清lua和tomcat的聯系。一直認為是lua調用tomcat的接口才可使用&#xff0c;后面才明白過來&#xff0c;進入了一個誤區&#xff0c;lua本身就是一門獨立的腳本語言。在openresty里面配置好&#xff0c;即可編寫映射和響應。 下面是自己…

Shiro表結構設計

表設計 開發用戶-角色-權限管理系統&#xff0c;首先我們需要知道用戶-角色-權限管理系統的表結構設計。 在用戶-角色-權限管理系統找那個一般會涉及5張表&#xff0c;分別為&#xff1a; 1.sys_users用戶表 2.sys_roles角色表 3.sys_permissions權限表&#xff08;或資源表&…

[Java核心技術(卷I)] - 簡易的日歷

參考 - P102~P103 1. 目標 生成一個日歷,格式如下圖所示。 ps: 當前的天數需要標記為* 2. 核心 對日歷的變量 import java.time.*; public class CalendarTest{public static void main(String[] args) {LocalDate date LocalDate.now(); // 獲取當前日期int month date…

個人作業——福大微信公眾號使用評測

案例分析&#xff1a;在福州大學公眾號上&#xff0c;我們可以即時使用手機關注福大新聞&#xff0c;查看自身課表、成績等。公眾號可能存在一些小bug影響同學們的用戶體驗。本次作業中&#xff0c;作為一個用戶——福大的學生&#xff0c;將切身體驗該公眾號的功能&#xff0c…

在winform中使用wpf窗體

在winform項目&#xff0c;通過引用dll可以添加WPF窗體&#xff0c;如下 但是如果直接在winform的項目中添加wpf窗體還是有部分問題&#xff0c;圖片的顯示。 直接在XAML界面中用Source屬性設置圖片會出現錯誤。必須通過后臺代碼的方式來實現。 image1.Source GetImageIcon(gl…

shiro---注解

RequiresAuthentication 驗證用戶是否登錄&#xff0c;等同于方法subject.isAuthenticated() 結果為true時。 RequiresUser 驗證用戶是否被記憶&#xff0c;user有兩種含義&#xff1a; 一種是成功登錄的&#xff08;subject.isAuthenticated() 結果為true&#xff09;&…

[Java核心技術(卷I)] - Java中的參數能做什么和不能做什么

1. 參考 - P123 ~ P126 2. 你將學到 Java中對方法參數能做什么和不能做什么 方法不能修改基本數據類型的參數(數值型或布爾型)方法可以改變對象參數的狀態方法不能讓一個對象參數引用一個新的對象 3. 代碼證明 public class ParamTest {public static void main(String[] ar…

軟件構造 第五章第一節 可復用性的度量、形態和外部觀察

第五章第一節 可復用性的度量、形態和外部觀察 面向復用編程(programming for reuse)&#xff1a;開發出可復用的軟件 基于復用編程(programming with reuse)&#xff1a;利用已有的可復用軟件搭建應用系統 代碼復用的類型&#xff1a; 白盒復用&#xff1a;源代碼可見&#x…

洛谷團隊月賽題:題解

10pts10pts10pts 暴力算不解釋&#xff0c;時間復雜度O(knk2)O(knk^2)O(knk2)。 30pts30pts30pts 我們觀察到nnn很大&#xff0c;楊輝三角會T&#xff0c;直接算會上溢&#xff0c;所以需要預處理出111~kkk逆元再算&#xff0c;時間復雜度O(knnlogkn2)O(knnlogkn^2)O(knnlogkn2…

Angular Forms - 自定義 ngModel 綁定值的方式

在 Angular 應用中&#xff0c;我們有兩種方式來實現表單綁定——“模板驅動表單”與“響應式表單”。這兩種方式通常能夠很好的處理大部分的情況&#xff0c;但是對于一些特殊的表單控件&#xff0c;例如input[typedatetime]、input[typefile]&#xff0c;我們需要重寫默認的表…

[web性能優化] - 使用在線工具對html、js、css進行壓縮

參考 1. 學習點 使用 在線工具對html、css、js進行壓縮學會分析壓縮前后的效率提高點 2. 解決方案: 2.1 HTML壓縮 在線壓縮nodejs提供了 html-minifier工具(在構建層對代碼進行壓縮)后端模板引擎渲染壓縮 2.2 CSS壓縮 使用html-minifier對html中的css進行壓縮使用clean-cs…

【LOJ】 #2540. 「PKUWC2018」隨機算法

題解 感覺極其神奇的狀壓dp \(dp[i][S]\)表示答案為i&#xff0c;然后不可選的點集為S 我們每次往答案里加一個點&#xff0c;然后方案數是&#xff0c;設原來可以選的點數是y&#xff0c;新加入一個點后導致了除了新加的點之外x個點不能選&#xff0c;那么方案就是把x個數在y …