首頁 > 軟體

Ubuntu下搭建與設定Nginx服務

2022-06-01 14:01:31

一、Nginx

Nginx("engine x")是一款是由俄羅斯的程式設計師Igor Sysoev所開發高效能的 Web和 反向代理 伺服器,也是一個 IMAP/POP3/SMTP 代理伺服器。

三大WEB伺服器:apache, Nginx, lighttpd之一。在高連線並行的情況下,Nginx是Apache伺服器不錯的替代品。

nginx應用場合

  • 靜態伺服器。(圖片,視訊服務)另一個是lighttpd。並行幾萬,html,js,css,flv,jpg,gif等。
  • 動態服務,nginx——fastcgi 的方式執行PHP,jsp。(PHP並行在500-1500,MySQL 並行在300-1500)。
  • 反向代理,負載均衡。日pv2000W以下,都可以直接用nginx做代理。
  • 快取服務。類似 SQUID,VARNISH。

官方網址:http://nginx.org/en/download.html

官網提供三種版本:

Nginx官網提供了三個型別的版本 
Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以說是開發版 
Stable version:最新穩定版,生產環境上建議使用的版本 
Legacy versions:遺留的老版本的穩定版

二、nginx服務搭建 

1、使用apt安裝

sudo apt install nginx

2、安裝後的位置: 

  • /usr/sbin/nginx:主程式
  • /etc/nginx:存放組態檔
  • /usr/share/nginx:存放靜態檔案
  • /var/log/nginx:存放紀錄檔

3、啟動並驗證效果

service nginx start  # 啟動nginx
service nginx reload  # 重新載入nginx組態檔

在瀏覽器輸入你的ip地址,如果出現Wellcome to nginx 那麼就是設定成功。

另外兩個命令

nginx -s reopen            # 重啟 Nginx
nginx -s stop              # 停止 Nginx

4、檢視版本號:

~$ nginx -v
 nginx version: nginx/1.14.0 (Ubuntu)

三、nginx組態檔介紹

1、nginx 檔案結構

  • 全域性塊:設定影響nginx全域性的指令。一般有執行nginx伺服器的使用者組,nginx程序pid存放路徑,紀錄檔存放路徑,組態檔引入,允許生成worker process數等。
  • events塊:設定影響nginx伺服器或與使用者的網路連線。有每個程序的最大連線數,選取哪種事件驅動模型處理連線請求,是否允許同時接受多個網路連線,開啟多個網路連線序列化等。
  • http塊:可以巢狀多個server,設定代理,快取,紀錄檔定義等絕大多數功能和第三方模組的設定。如檔案引入,mime-type定義,紀錄檔自定義,是否使用sendfile傳輸檔案,連線超時時間,單連線請求數等。
  • server塊:設定虛擬主機的相關引數,一個http中可以有多個server。
  • location塊:設定請求的路由,以及各種頁面的處理情況。
...              # 全域性塊。設定影響nginx全域性的指令。

events {         # events塊。設定影響nginx伺服器或與使用者的網路連線。
   ...
}

http      # http塊。可以巢狀多個server,設定代理,快取,紀錄檔定義等絕大多數功能和第三方模組的設定。
{
    ...   # http全域性塊
    server        # server塊。設定虛擬主機的相關引數,一個http中可以有多個server。 
    { 
        ...       # server全域性塊
        location [PATTERN]   # location塊。設定請求的路由,以及各種頁面的處理情況。
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     # http全域性塊
}

2、預設的設定

##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# https://www.nginx.com/resources/wiki/start/
# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
# https://wiki.debian.org/Nginx/DirectoryStructure
#
# In most cases, administrators will remove this file from sites-enabled/ and
# leave it as reference inside of sites-available where it will continue to be
# updated by the nginx packaging team.
#
# This file will automatically load configuration files provided by other
# applications, such as Drupal or Wordpress. These applications will be made
# available underneath a path with that package name, such as /drupal8.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##

# Default server configuration
#
server {
    listen 80 default_server;
    listen [::]:80 default_server;

    # SSL configuration
    #
    # listen 443 ssl default_server;
    # listen [::]:443 ssl default_server;
    #
    # Note: You should disable gzip for SSL traffic.
    # See: https://bugs.debian.org/773332
    #
    # Read up on ssl_ciphers to ensure a secure configuration.
    # See: https://bugs.debian.org/765782
    #
    # Self signed certs generated by the ssl-cert package
    # Don't use them in a production server!
    #
    # include snippets/snakeoil.conf;

    root /var/www/html;

    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html;

    server_name _;

    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ =404;
    }

    # pass PHP scripts to FastCGI server
    #
    #location ~ .php$ {
    #    include snippets/fastcgi-php.conf;
    #
    #    # With php-fpm (or other unix sockets):
    #    fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
    #    # With php-cgi (or other tcp sockets):
    #    fastcgi_pass 127.0.0.1:9000;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /.ht {
    #    deny all;
    #}
}


# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
#    listen 80;
#    listen [::]:80;
#
#    server_name example.com;
#
#    root /var/www/example.com;
#    index index.html;
#
#    location / {
#        try_files $uri $uri/ =404;
#    }
#}

3、nginx的基本設定

########### 每個指令必須有分號結束。#################
#user administrator administrators;  #設定使用者或者組,預設為nobody nobody。
#worker_processes 2;  #允許生成的程序數,預設為1
#pid /nginx/pid/nginx.pid;   #指定nginx程序執行檔案存放地址
error_log log/error.log debug;  #制定紀錄檔路徑,級別。這個設定可以放入全域性塊,http塊,server塊,級別以此為:debug|info|notice|warn|error|crit|alert|emerg
events {
    accept_mutex on;   #設定網路連線序列化,防止驚群現象發生,預設為on
    multi_accept on;  #設定一個程序是否同時接受多個網路連線,預設為off
    #use epoll;      #事件驅動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大連線數,預設為512
}
http {
    include       mime.types;   #副檔名與檔案型別對映表
    default_type  application/octet-stream; #預設檔案型別,預設為text/plain
    #access_log off; #取消服務紀錄檔    
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定義格式
    access_log log/access.log myFormat;  #combined為紀錄檔格式的預設值
    sendfile on;   #允許sendfile方式傳輸檔案,預設為off,可以在http塊,server塊,location塊。
    sendfile_max_chunk 100k;  #每個程序每次呼叫傳輸數量不能大於設定的值,預設為0,即不設上限。
    keepalive_timeout 65;  #連線超時時間,預設為75s,可以在http,server,location塊。

    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #熱備
    }
    error_page 404 https://www.baidu.com; #錯誤頁
    server {
        keepalive_requests 120; #單連線請求上限次數。
        listen       80;   #監聽埠
        server_name  127.0.0.1;   #監聽地址       
        location  ~*^.+$ {       #請求的url過濾,正則匹配,~為區分大小寫,~*為不區分大小寫。
           #root path;  #根目錄
           #index vv.txt;  #設定預設頁
           proxy_pass  http://mysvr;  #請求轉向mysvr 定義的伺服器列表
           deny 127.0.0.1;  #拒絕的ip
           allow 172.18.5.54; #允許的ip           
        } 
    }
}

四、 nginx虛擬主機設定

#下面是server虛擬主機的設定段
 server
  {
    listen 80;#監聽埠
    server_name localhost;#域名
    index index.html index.htm index.php;
    root /usr/local/webserver/nginx/html;#站點目錄
      location ~ .*.(php|php5)?$
    {
      #fastcgi_pass unix:/tmp/php-cgi.sock;
      fastcgi_pass 127.0.0.1:9000;
      fastcgi_index index.php;
      include fastcgi.conf;
    }
    location ~ .*.(gif|jpg|jpeg|png|bmp|swf|ico)$
    {
      expires 30d;
    #access_log off;
    }
    location ~ .*.(js|css)?$
    {
      expires 15d;
     #access_log off;
    }
    access_log off;
  }

驗證組態檔:

root@ubuntu: nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

五、nginx全域性變數

  • $remote_addr 與 $http_x_forwarded_for 用以記錄使用者端的ip地址;
  • $remote_user :用來記錄使用者端使用者名稱稱;
  • $time_local : 用來記錄存取時間與時區;
  • $request : 用來記錄請求的url與http協定;
  • $status : 用來記錄請求狀態;成功是200;
  • $body_bytes_s ent :記錄傳送給使用者端檔案主體內容大小;
  • $http_referer :用來記錄從那個頁面連結存取過來的;
  • $http_user_agent :記錄使用者端瀏覽器的相關資訊;
存取連結是:http://localhost:88/test1/test.php 
網站路徑是:/var/www/html

$host:localhost
$server_port:88
$request_uri:<a href="http://localhost:88/test1/test.php" rel="external nofollow"   target="_blank">http:</a>//localhost:88/test1/test.php
$document_uri:/test1/test.php
$document_root:/var/www/html
$request_filename:/var/www/html/test1/test.php

六、Nginx主要設定

1、靜態Http伺服器設定

首先,Nginx是一個HTTP伺服器,可以將伺服器上的靜態檔案(如HTML、圖片)通過HTTP協定展現給使用者端。 
設定:

server {
    listen 80;   # 埠
    server_name localhost  192.168.1.100;   # 域名   
    location / {             # 代表這是專案根目錄
        root /usr/share/nginx/www;   # 虛擬目錄
    }
}

2、反向代理伺服器設定

什麼是反向代理? 
使用者端本來可以直接通過HTTP協定存取某網站應用伺服器,如果網站管理員在中間加上一個Nginx,使用者端請求Nginx,Nginx請求應用伺服器,然後將結果返回給使用者端,此時Nginx就是反向代理伺服器。

反向代理設定:

server {
    listen 80;
    location / {
        proxy_pass http://192.168.0.112:8080;   # 應用伺服器HTTP地址
    }
}

既然伺服器可以直接HTTP存取,為什麼要在中間加上一個反向代理,不是多此一舉嗎?反向代理有什麼作用?繼續往下看,下面的負載均衡、虛擬主機,都基於反向代理實現,當然反向代理的功能也不僅僅是這些。

3、負載均衡設定

當網站存取量非常大,也攤上事兒了。因為網站越來越慢,一臺伺服器已經不夠用了。於是將相同的應用部署在多臺伺服器上,將大量使用者的請求分配給多臺機器處理。同時帶來的好處是,其中一臺伺服器萬一掛了,只要還有其他伺服器正常執行,就不會影響使用者使用。Nginx可以通過反向代理來實現負載均衡。

負載均衡設定:

upstream myapp {
    server 192.168.0.111:8080;   # 應用伺服器1
    server 192.168.0.112:8080;   # 應用伺服器2
}
server {
    listen 80;
    location / {
        proxy_pass http://myweb;
    }
}

4、虛擬主機設定

有的網站存取量大,需要負載均衡。然而並不是所有網站都如此出色,有的網站,由於存取量太小,需要節省成本,將多個網站部署在同一臺伺服器上。 
例如將www.aaa.com和www.bbb.com兩個網站部署在同一臺伺服器上,兩個域名解析到同一個IP地址,但是使用者通過兩個域名卻可以開啟兩個完全不同的網站,互相不影響,就像存取兩個伺服器一樣,所以叫兩個虛擬主機。

虛擬主機設定:

server {
    listen 80 default_server;
    server_name _;
    return 444;   # 過濾其他域名的請求,返回444狀態碼
}
server {
    listen 80;
    server_name www.aaa.com;   # www.aaa.com域名
    location / {
        proxy_pass http://localhost:8080;   # 對應埠號8080
    }
}
server {
    listen 80;
    server_name www.bbb.com;   # www.bbb.com域名
    location / {
        proxy_pass http://localhost:8081;   # 對應埠號8081
    }
}

在伺服器8080和8081分別開了一個應用,使用者端通過不同的域名存取,根據server_name可以反向代理到對應的應用伺服器。

虛擬主機的原理是通過HTTP請求頭中的Host是否匹配server_name來實現的,有興趣的同學可以研究一下HTTP協定。

另外,server_name設定還可以過濾有人惡意將某些域名指向你的主機伺服器。

到此這篇關於Ubuntu下搭建與設定Nginx服務的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com