【Nginx】Nginx安裝及反向代理配置

Nginx (engine x) 是一個(gè)高性能的HTTP和反向代理web服務(wù)器,同時(shí)也提供了IMAP/POP3/SMTP服務(wù)。Nginx是由伊戈?duì)枴べ愃饕驗(yàn)槎砹_斯訪問量第二的Rambler.ru站點(diǎn)(俄文:Рамблер)開發(fā)的,第一個(gè)公開版本0.1.0發(fā)布于2004年10月4日。
其將源代碼以類BSD許可證的形式發(fā)布,因它的穩(wěn)定性、豐富的功能集、示例配置文件和低系統(tǒng)資源的消耗而聞名。2011年6月1日,nginx 1.0.4發(fā)布。
Nginx是一款輕量級的Web 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,在BSD-like 協(xié)議下發(fā)行。其特點(diǎn)是占有內(nèi)存少,并發(fā)能力強(qiáng),事實(shí)上nginx的并發(fā)能力在同類型的網(wǎng)頁服務(wù)器中表現(xiàn)較好

目錄

  • 一、安裝環(huán)境
  • 二、Nginx安裝
  • 三、反向代理配置案例
  • 四、配置文件詳解
  • 五、參考并致謝

一、安裝環(huán)境

操作系統(tǒng):CentOS 7
應(yīng)用:Nginx 1.6.2

二、Nginx安裝

1、yum方式安裝
配置yum源

默認(rèn)情況下CentOS 7是沒有Nginx源,需要手動(dòng)配置

[root@bogon /]# rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
安裝nginx
[root@bogon /]# yum install -y nginx
啟動(dòng)或關(guān)閉nginx
[root@bogon /]# systemctl start nginx.service  -- 啟動(dòng)
[root@bogon /]# systemctl stop nginx.service  -- 關(guān)閉  
[root@bogon /]# systemctl enable nginx.service  -- 設(shè)置開機(jī)啟動(dòng)
驗(yàn)證

啟動(dòng)了nginx服務(wù)后,在瀏覽器中輸入你服務(wù)器的地址

2、rpm方式安裝
下載PCRE包

下載地址:http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz

[root@bogon src]# cd /usr/local/src/
[root@bogon src]# wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
解壓并安裝PCRE包
[root@bogon src]# tar zxvf pcre-8.35.tar.gz
[root@bogon src]# cd pcre-8.35  
[root@bogon pcre-8.35]# ./configure
[root@bogon pcre-8.35]# make && make install
驗(yàn)證PCRE版本
[root@bogon pcre-8.35]# pcre-config --version
下載nginx
[root@bogon src]# cd /usr/local/src/
[root@bogon src]# wget http://nginx.org/download/nginx-1.6.2.tar.gz
解壓并安裝
[root@bogon src]# tar zxvf nginx-1.6.2.tar.gz  
[root@bogon src]# cd nginx-1.6.2  
[root@bogon nginx-1.6.2]# ./configure --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.35
[root@bogon nginx-1.6.2]# make && make install
驗(yàn)證nginx版本
[root@bogon nginx-1.6.2]# /usr/local/webserver/nginx/sbin/nginx -v
創(chuàng)建nginx運(yùn)行使用的用戶:
[root@bogon conf]# /usr/sbin/groupadd www 
[root@bogon conf]# /usr/sbin/useradd -g www www
修改配置文件
[root@bogon conf]# vim /usr/local/webserver/nginx/conf/nginx.conf

將user一行改為 user www www;


至于其它配置項(xiàng)按需修改(后面給出配置項(xiàng)的意義)

啟動(dòng)及相關(guān)命令
[root@bogon conf]# /usr/local/webserver/nginx/sbin/nginx
[root@bogon conf]# /usr/local/webserver/nginx/sbin/nginx -s reload            # 重新載入配置文件
[root@bogon conf]# /usr/local/webserver/nginx/sbin/nginx -s reopen            # 重啟 Nginx
[root@bogon conf]# /usr/local/webserver/nginx/sbin/nginx -s stop              # 停止 Nginx
驗(yàn)證

啟動(dòng)了nginx服務(wù)后,在瀏覽器中輸入你服務(wù)器的地址

三、反向代理配置案例

范例效果:使用nginx反向代理功能,當(dāng)訪問www.catke.com時(shí),直接跳轉(zhuǎn)到本機(jī)的127.0.0.1:8080

1、部署tomcat

為了展示效果,我們部署了個(gè)tomcat,并啟動(dòng),在瀏覽器地址欄中輸入:本機(jī)IP:8080出現(xiàn)tomcat的主頁


2、修改服務(wù)器的host
[root@bogon ~]# vim /etc/hosts

在末尾加上192.168.15.204 www.catke.com,其中,192.168.15.204是我的本機(jī)IP

此時(shí),打開瀏覽器,并輸入www.catke.com:8080的時(shí)候能進(jìn)入到tomcat的主頁

3、修改nginx配置文件

在nginx.conf配置文件中添加如下配置:

server {

    listen       80;

    server_name  www.catke.com;

    location / {

        proxy_pass http://192.168.15.204:8080;

        index  index.html index.htm index.jsp;

    }
}

以上配置的意思是:當(dāng)訪問www.catke.com這個(gè)域名時(shí),頁面會(huì)跳轉(zhuǎn)到http://192.168.15.204:8080這個(gè)地址上
然后保存退出,然后重新加載一下配置文件

[root@bogon /]# /usr/local/webserver/nginx/sbin/nginx -s reload
4、驗(yàn)證
5、說明和注意

在nginx中配置proxy_pass時(shí),當(dāng)在后面的url加上了/,相當(dāng)于是絕對根路徑,則nginx不會(huì)把location中匹配的路徑部分代理走;如果沒有/,則會(huì)把匹配的路徑部分也給代理走。

第一種
location  /proxy/ {

proxy_pass http://127.0.0.1:81/;

}

結(jié)論:會(huì)被代理到http://127.0.0.1:81/test.html 這個(gè)url

第二種
location  /proxy/ {

proxy_pass http://127.0.0.1:81;

}

結(jié)論:會(huì)被代理到http://127.0.0.1:81/proxy/test.html 這個(gè)url

第三種
location  /proxy/ {

proxy_pass http://127.0.0.1:81/ftlynx/;

}

結(jié)論:會(huì)被代理到http://127.0.0.1:81/ftlynx/test.html 這個(gè)url。

第四種
location  /proxy/ {

proxy_pass http://127.0.0.1:81/ftlynx;

}

}
結(jié)論:會(huì)被代理到http://127.0.0.1:81/ftlynxtest.html 這個(gè)url

四、配置文件詳解

nginx配置文件結(jié)構(gòu)大致如圖所示:

1、全局塊:配置影響nginx全局的指令。一般有運(yùn)行nginx服務(wù)器的用戶組,nginx進(jìn)程pid存放路徑,日志存放路徑,配置文件引入,允許生成worker process數(shù)等。
    # 指定nginx進(jìn)程使用什么用戶啟動(dòng)
    user www www;
    # 指定啟動(dòng)多少進(jìn)程來處理請求,一般情況下設(shè)置成CPU的核數(shù)。
    worker_processes 4;
    # 在高并發(fā)情況下,通過設(shè)置將CPU和具體的進(jìn)程綁定來降低由于多核CPU切換造成的寄存器等現(xiàn)場重建帶來的性能損耗。
    worker_cpu_affinity 0001 0010 0100 1000;
    # 定義全局錯(cuò)誤日志文件。日志輸出級別有debug、info、notice、warn、error、crit可供選擇,其中,debug輸出日志最為最詳細(xì),而crit輸出日志最少。
    error_log /data/logs/nginx_error.log crit;
    # 指定進(jìn)程pid文件的位置。
    pid /usr/local/webserver/nginx/nginx.pid;
    # 用于指定一個(gè)nginx進(jìn)程可以打開的最多文件描述符數(shù)目,這里是65535,需要使用命令“ulimit -n 65535”來設(shè)置。
    worker_rlimit_nofile 65535;
2、events塊:配置影響nginx服務(wù)器或與用戶的網(wǎng)絡(luò)連接。有每個(gè)進(jìn)程的最大連接數(shù),選取哪種事件驅(qū)動(dòng)模型處理連接請求,是否允許同時(shí)接受多個(gè)網(wǎng)路連接,開啟多個(gè)網(wǎng)絡(luò)連接序列化等。
events{
    # use是個(gè)事件模塊指令,用來指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。
    # 其中select和poll都是標(biāo)準(zhǔn)的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平臺(tái)上,而kqueue用在BSD系統(tǒng)中。
    # 對于Linux系統(tǒng),epoll工作模式是首選。在操作系統(tǒng)不支持這些高效模型時(shí)才使用select。
    use epoll;
    # 每一個(gè)worker進(jìn)程能并發(fā)處理的最大連接數(shù)
    worker_connections     1024;
}
3、http塊:可以嵌套多個(gè)server,配置代理,緩存,日志定義等絕大多數(shù)功能和第三方模塊的配置。如文件引入,mime-type定義,日志自定義,是否使用sendfile傳輸文件,連接超時(shí)時(shí)間,單連接請求數(shù)等。
http{
    # include是個(gè)主模塊指令,實(shí)現(xiàn)對配置文件所包含的文件的設(shè)定,可以減少主配置文件的復(fù)雜度。
    include       mime.types;
    # default_type屬于HTTP核心模塊指令,這里設(shè)定默認(rèn)類型為二進(jìn)制流,也就是當(dāng)文件類型未定義時(shí)使用這種方式。
    default_type  application/octet-stream;
    # 等待client發(fā)送一個(gè)請求頭的超時(shí)時(shí)間,超時(shí)后,nginx返回HTTP狀態(tài)碼408(“Request timed out”)
    client_header_timeout 120s;
    # 設(shè)置請求體的讀超時(shí)時(shí)間
    client_body_timeout 120s;
    #  允許客戶端請求的最大單文件字節(jié)數(shù)。如果有上傳較大文件,請?jiān)O(shè)置它的限制值。
    client_max_body_size 100m;
    # 開啟高效文件傳輸模式。
    # 對于普通應(yīng)用設(shè)為 on,如果用來進(jìn)行下載等應(yīng)用磁盤IO重負(fù)載應(yīng)用,可設(shè)置為off,以平衡磁盤與網(wǎng)絡(luò)I/O處理速度,降低系統(tǒng)的負(fù)載。
    sendfile on;
    # 長連接超時(shí)時(shí)間,單位是秒。
    keepalive_timeout 65 :
    
    # 開啟gzip壓縮
    gzip on;
    # 最小壓縮文件大小
    gzip_min_length 1k;
    #  壓縮緩沖區(qū)
    gzip_buffers    4 16k;
    # 用于設(shè)置識(shí)別HTTP協(xié)議版本
    gzip_http_version 1.1;
    # 壓縮等級
    gzip_comp_level 6;
    # 壓縮類型
    gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
    # vary header支持,該選項(xiàng)可以讓前端的緩存服務(wù)器緩存經(jīng)過GZIP壓縮的頁面。
    gzip_vary on;
    
    # Nginx本身不支持PHP等語言,但是它可以通過FastCGI來將請求扔給某些語言或框架處理
    # FastCGI相關(guān)參數(shù)是為了改善網(wǎng)站的性能:減少資源占用,提高訪問速度
    fastcgi_connect_timeout 300;  
    fastcgi_send_timeout 300;  
    fastcgi_read_timeout 300;  
    fastcgi_buffer_size 64k;  
    fastcgi_buffers 4 64k;  
    fastcgi_busy_buffers_size 128k;  
    fastcgi_temp_file_write_size 128k;  
    fastcgi_cache TEST;  
    fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;  
    fastcgi_cache_valid 200 302 1h;  
    fastcgi_cache_valid 301 1d;  
    fastcgi_cache_valid any 1m; 

    # 限流配置
    # $binary_remote_addr(NGINX變量),該變量代表了某個(gè)客戶端IP地址的二進(jìn)制形式。
    # zone=關(guān)鍵字標(biāo)識(shí)的區(qū)域名稱,冒號(hào)后面的表示內(nèi)存區(qū)域的大小
    # rate表示允許相同標(biāo)識(shí)的客戶端的訪問頻次
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
    server {
        ...
        location /login/ {
            # burst 設(shè)置緩沖區(qū)大小,當(dāng)有大量請求(爆發(fā))過來時(shí),超過了訪問頻次限制的請求可以先放到這個(gè)緩沖區(qū)內(nèi)
            # nodelay 允許請求在排隊(duì)的時(shí)候就立即被處理
            limit_req zone=mylimit burst=20 nodelay;
            ...
        }
    }

    # 緩存配置
    # proxy_cache_path 設(shè)置緩存的路徑和配置
    # levels 目錄的層次結(jié)構(gòu)
    # keys_zone 設(shè)置一個(gè)共享內(nèi)存區(qū)
    # max_size 緩存的上限
    # inactive指定了項(xiàng)目在不被訪問的情況下能夠在內(nèi)存中保持的時(shí)間
    # use_temp_path 將寫入緩存的文件先放入一個(gè)臨時(shí)存儲(chǔ)區(qū)域
    proxy_cache_path /data/app/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
    server {
        ...
        location /article/ {
            # 匹配緩存
            proxy_cache my_cache;
            ...
        }
    }
}
4、upstream塊:配置負(fù)載均衡
# 有五種配置方式
# 1、輪詢
upstream  backend  { 
    server   192.168.1.1:8080;
    server   192.168.1.2:8080;
}
# 2、weight
upstream  backend  { 
    server   192.168.1.1:8080 weight=1;
    server   192.168.1.2:8080 weight=2;
}
# 3、ip_hash 按照訪問ip(即Nginx的前置服務(wù)器或者客戶端IP)的hash結(jié)果分配
upstream  backend  { 
    ip_hash;
    server   192.168.1.1:8080;
    server   192.168.1.2:8080;
}
# 4、fair 響應(yīng)時(shí)間短即rt小的后端服務(wù)器優(yōu)先分配請求
upstream  backend  { 
    server   192.168.1.1:8080;
    server   192.168.1.2:8080;
    fair;
}
# 5、url_hash 按照訪問url的hash結(jié)果來分配請求,使得每個(gè)url定向到同一個(gè)后端服務(wù)器
upstream  backend  { 
    server   192.168.1.1:8080;
    server   192.168.1.2:8080;
    hash $request_uri;
    hash_method crc32;
}

# upstream中server指令語法如下:

server address [parameters]
# parameters是可選參數(shù),可以是如下參數(shù):
# 1、down:表示當(dāng)前server已停用
# 2、backup:表示當(dāng)前server是備用服務(wù)器,只有其它非backup后端服務(wù)器都掛掉了或者很忙才會(huì)分配到請求。
# 3、weight:表示當(dāng)前server負(fù)載權(quán)重,權(quán)重越大被請求幾率越大。默認(rèn)是1.
# 4、max_fails和fail_timeout一般會(huì)關(guān)聯(lián)使用,如果某臺(tái)server在fail_timeout時(shí)間內(nèi)出現(xiàn)了max_fails次連接失敗,
# 那么Nginx會(huì)認(rèn)為其已經(jīng)掛掉了,從而在fail_timeout時(shí)間內(nèi)不再去請求它,fail_timeout默認(rèn)是10s,max_fails默認(rèn)是1,
# 即默認(rèn)情況是只要發(fā)生錯(cuò)誤就認(rèn)為服務(wù)器掛掉了,如果將max_fails設(shè)置為0,則表示取消這項(xiàng)檢查。
5、server塊:配置虛擬主機(jī)的相關(guān)參數(shù),一個(gè)http中可以有多個(gè)server。
# 監(jiān)聽端口
listen 80;
# 服務(wù)器名,可以通過正則匹配
server_name blog.lazyrabbit.xyz;
# 定義服務(wù)器的默認(rèn)網(wǎng)站根目錄位置
root /data/htdocs/www;
# 定義路徑下默認(rèn)訪問的文件名
index index.html index.htm index.php;
6、location塊:配置請求的路由,以及各種頁面的處理情況。
# location匹配規(guī)則
# = 精確匹配,如果找到匹配=號(hào)的內(nèi)容,立即停止搜索,并立即處理請求(優(yōu)先級最高)
# ~ 區(qū)分大小寫
# ~* 不區(qū)分大小寫
# ^~ 只匹配字符串,不匹配正則表達(dá)式

location / {
    # 代理轉(zhuǎn)發(fā)
    proxy_pass http://backend;
    # 是將代理服務(wù)器收到的用戶的信息傳到真實(shí)服務(wù)器上
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    #允許訪問的ip
    allow   219.237.222.30;
    #禁止其他ip訪問
    deny    all; 
}
# 實(shí)現(xiàn)動(dòng)靜分離
location /img/ {
    proxy_pass http://backend;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
    #客戶端緩存30天
    expires      30d;
}
location ~ .*\.(js|css)?$ {
    expires      1h;
}
7、參考配置,包括反向代理,動(dòng)靜分離,負(fù)載均衡,緩存,限流
worker_processes  1;
error_log  logs/error.log;
events {
    use epoll;
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    client_header_timeout 120s;
    client_body_timeout 120s;
    # 限制上傳文件大小
    client_max_body_size 100m;
    # 開啟gzip壓縮
    gzip on;
    gzip_min_length 1k;
    gzip_buffers    4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 6;
    gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
    gzip_vary on;

    # 負(fù)載均衡
    upstream blog{
        server 123.123.123.123:8080;
        server 123.123.123.123:8081;
    }

    # 限流配置
    # $binary_remote_addr(NGINX變量),該變量代表了某個(gè)客戶端IP地址的二進(jìn)制形式。
    # zone=關(guān)鍵字標(biāo)識(shí)的區(qū)域名稱,冒號(hào)后面的表示內(nèi)存區(qū)域的大小
    # rate表示允許相同標(biāo)識(shí)的客戶端的訪問頻次
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;

    # 靜態(tài)html服務(wù)器
    server {
        listen       80;
        server_name  www.lazyrabbit.xyz lazyrabbit.xyz;
        root html/home;
        index index.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

    # 反向代理服務(wù)器
    server {
        listen       80;
        # 配置二級域名
        server_name  blog.lazyrabbit.xyz;

        location / {
            proxy_pass http://blog;
            # 將代理服務(wù)器收到的用戶的信息傳到真實(shí)服務(wù)器上
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        # login限流
        location /login/ {
            limit_req zone=mylimit burst=20 nodelay;
            proxy_pass http://blog;
            # 是將代理服務(wù)器收到的用戶的信息傳到真實(shí)服務(wù)器上
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        # 動(dòng)靜分離
        location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)${   
            root /data/app/nginx/;
            # 瀏覽器緩存
            expires      7d; 
        }
        # redirect server error pages to the static page /50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
8、全局變量
$args:這個(gè)變量等于請求行中的參數(shù),同$query_string。
$is_args: 如果已經(jīng)設(shè)置$args,則該變量的值為"?",否則為""。
$content_length: 請求頭中的Content-length字段。
$content_type: 請求頭中的Content-Type字段。
$document_uri: 與$uri相同。
$document_root: 當(dāng)前請求在root指令中指定的值。
$host: 請求主機(jī)頭字段,否則為服務(wù)器名稱。
$http_user_agent: 客戶端agent信息。
$http_cookie: 客戶端cookie信息。
$limit_rate: 這個(gè)變量可以限制連接速率。
$request_method: 客戶端請求的動(dòng)作,通常為GET或POST。
$remote_addr: 客戶端的IP地址。
$remote_port: 客戶端的端口。
$remote_user: 已經(jīng)經(jīng)過Auth Basic Module驗(yàn)證的用戶名。
$request_body_file`: 客戶端請求主體的臨時(shí)文件名。
$request_uri: 請求的URI,帶參數(shù)
$request_filename: 當(dāng)前請求的文件路徑,由root或alias指令與URI請求生成。
$scheme: 所用的協(xié)議,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;。
$server_protocol: 請求使用的協(xié)議,通常是HTTP/1.0或HTTP/1.1。
$server_addr: 服務(wù)器地址,在完成一次系統(tǒng)調(diào)用后可以確定這個(gè)值。
$server_name: 服務(wù)器名稱。
$server_port: 請求到達(dá)服務(wù)器的端口號(hào)。
$request_uri: 包含請求參數(shù)的原始URI,不包含主機(jī)名,如:/foo/bar.php?arg=baz。
$uri: 不帶請求參數(shù)的當(dāng)前URI,$uri不包含主機(jī)名,如/foo/bar.html可能和最初的值有不同,比如經(jīng)過重定向之類的。

五、參考并致謝

https://www.php.cn/nginx/436475.html

http://m.itdecent.cn/p/e1be6535a2d2

https://www.runoob.com/linux/nginx-install-setup.html

https://www.cnblogs.com/songxingzhu/p/8568432.html

https://www.cnblogs.com/ysocean/p/9392908.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容