LNMP環境搭建(二):Nginx

半斤桃花發表於2019-01-19

安裝

依賴安裝

  • 安裝依賴
    [root@localhost ~]# yum -y install gcc
    [root@localhost ~]# yum -y install gcc++
    [root@localhost ~]# yum -y install gcc-c++
    [root@localhost ~]# yum -y install wget
    [root@localhost ~]# yum -y install make
    [root@localhost ~]# yum -y install libxml2 
    [root@localhost ~]# yum -y install libxml2-devel 
    [root@localhost ~]# yum -y install openssl 
    [root@localhost ~]# yum -y install openssl-devel 
    [root@localhost ~]# yum -y install curl-devel 
    [root@localhost ~]# yum -y install libjpeg-devel 
    [root@localhost ~]# yum -y install libpng-devel
    [root@localhost ~]# yum -y install freetype-devel
    [root@localhost ~]# yum -y install bison
    [root@localhost ~]# yum -y install autoconf
    [root@localhost ~]# yum -y install automake
    [root@localhost ~]# yum -y install libtool
    [root@localhost ~]# yum -y install cmake
    [root@localhost ~]# yum -y install zlib
    [root@localhost ~]# yum -y install zlib-devel
    [root@localhost ~]# yum -y install pcre-devel
  • 下載並解壓

Nginx官網選擇穩定版下載

    [root@localhost ~]# wget http://211.143.146.219:82/1Q2W3E4R5T6Y7U8I9O0P1Z2X3C4V5B/nginx.org/download/nginx-1.14.1.tar.gz
    [root@localhost ~]# tar -zxvf nginx-1.14.1.tar.gz
  • 在解壓的目錄下配置、編譯安裝
    [root@localhost ~]# ./configure 
    [root@localhost ~]# --prefix=/usr/local/nginx 
    [root@localhost ~]# --with-http_stub_status_module 
    [root@localhost ~]# --with-http_ssl_module 
    [root@localhost ~]# --with-pcre 
    [root@localhost ~]# --with-stream 
    [root@localhost ~]# --with-mail=dynamic
    [root@localhost ~]# make && make install
  • 啟動nginx服務、檢視程式
    [root@localhost ~]# /usr/local/nginx/sbin/nginx
    [root@localhost ~]# ps -ef | grep nginx

配置

使用者管理

  • 新建 Nginx 使用者和使用者組,為 Nginx 使用者新增密碼並設定為不可登入伺服器

我們建立一個新的使用者和使用者組來執行nginx,這樣可以把nginx和root分開,保證nginx不具備root許可權。但是,我們並不希望nginx成為一個真實的可以登陸到遠端進行操作的使用者,所以,指定登入 shell 為 nologin

    > -r: 新增系統使用者

    > -g: 指定要建立的使用者所屬組

    > -s: 新帳戶的登入shell

    > -d: 新帳戶的主目錄

    > -M: 不要建立使用者的主目錄
    [root@centos7 ~]# groupadd -r nginx
    [root@centos7 ~]# useradd -r -g nginx -M nginx
    [root@centos7 ~]# passwd nginx
    [root@centos7 ~]# usermod -s /sbin/nologin nginx

基本操作

  • 建立連結

環境變數:輸入命令的時候LINUX會去查詢PATH裡面記錄的路徑

    [root@localhost ~]# echo $PATH
    
    [root@localhost ~]# ln -s  /usr/local/nginx/sbin/nginx /usr/local/sbin/

在環境變數:/usr/local/sbin/ 下建立 /usr/local/nginx/sbin/nginx 的軟連線,當我們在任意目錄輸入 nginx 時,系統去環境變數中查詢,通過軟連線指向 /usr/local/nginx/sbin/nginx

  • 基本操作

檢查配置檔案是否正確、檢視編譯選項、啟動、關閉、指定配置檔案啟動、重啟、殺死程式

    [root@centos7 /]# /usr/local/nginx/sbin/nginx -t
    [root@centos7 /]# /usr/local/nginx/sbin/nginx -V
    [root@centos7 /]# /usr/local/nginx/sbin/nginx
    [root@centos7 /]# /usr/local/nginx/sbin/nginx -s stop
    [root@centos7 /]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
    [root@centos7 /]# /usr/local/nginx/sbin/nginx -s reload
    [root@centos7 /]# pkill nginx

設定自啟

  • Systemd 設定自動啟動

具體文法參考:Systemd 入門教程:實戰篇

    [root@centos7 /]# vim /usr/lib/systemd/system/nginx.service
    
    [Unit]
    Description=nginx - high performance web server
    After=network.target remote-fs.target nss-lookup.target

    [Service]
    Type=forking
    ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
    ExecReload=/usr/local/nginx/sbin/nginx -s reload
    ExecStop=/usr/local/nginx/sbin/nginx -s stop

    [Install]
    WantedBy=multi-user.target

啟動 nginx,設定 nginx 自動啟動

    [root@centos7 /]# systemctl start nginx
    [root@centos7 /]# systemctl enable nginx

當下面的埠占用錯誤時,可以嘗試終止程式再次啟動

    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    [root@centos7 /]# netstat -ntpl
    [root@centos7 /]# kill 31448

配置

參考文章:
基本功能介紹
配置檔案詳解
配置功能解釋
Nginx 常用配置

配置檔案介紹

  • 配置檔案介紹

Nginx配置檔案主要分成如下四部分:

  • 全域性設定(main):影響其它所有部分的設定;
  • 主機設定(server):主要用於指定虛擬主機域名、IP和埠;
  • 上游伺服器設定(upstream):主要為反向代理、負載均衡相關配置;
  • 匹配特定URI設定(location):用於匹配網頁位置,,例如:根目錄 “/”。

Nginx配置檔案四個部分間的層級關係:

  • server 繼承 main,
  • location 繼承 server;
  • upstream 既不會繼承指令也不會被繼承。它有自己的特殊指令,不需要在其他地方的應用。
  • Server

接收請求的伺服器需要將不同的請求按規則轉發到不同的後端伺服器上,在 nginx中我們可以通過構建虛擬主機(server)的概念來將這些不同的服務配置隔離。

server {
    listen       80;
    server_name  www.sea.com;
    root         html;
    index        index.php index.html index.htm;
}

修改 linux 的 hosts 建立本地虛擬域名

    [root@centos7 /]# vim /etc/hosts
    
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    127.0.0.1   www.sea.com www.star.com

訪問測試

    [root@centos7 /]# curl www.sea.com

本系統是在 Windows 下的虛擬機器,所以也得修改 Windows 的 hosts 使在 Windows 下訪問目標時 IP 會指向虛擬機器

    192.168.108.128   www.sea.com
    192.168.108.128   www.star.com
  • Location

每個 url 請求都會對應的一個服務,nginx 進行處理轉發或者是本地的一個檔案路徑,或者是其他伺服器的一個服務路徑。而這個路徑的匹配是通過 location 來進行的。我們可以將 server 當做對應一個域名進行的配置,而 location 是在一個域名下對更精細的路徑進行配置。

  • location 匹配規則
    =     表示進行普通字元精確匹配
    ~     表示執行一個正則匹配,區分大小寫
    ~*    表示執行一個正則匹配,不區分大小寫
    ^~    表示普通字元匹配,如果該選項匹配,只匹配該選項,不匹配別的選項,一般用來匹配目錄

配置實戰

  • 配置一個本地專案

修改目標 Server 的 根目錄到專案目錄下,即:/usr/local/www/sea

Nginx本身不支援PHP等語言,但是它可以通過FastCGI來將請求扔給某些語言或框架處理(例如PHP、Perl)

server {
        listen       80;
        server_name  www.sea.com;
        root         /usr/local/www/sea;
        location / {
                index  index.html index.htm index.php;
            }
        location ~ .php(.*)$ {
                fastcgi_pass             127.0.0.1:9000;
                fastcgi_index            index.php;
                fastcgi_split_path_info  ^((?U).+.php)(/?.+)$;
                fastcgi_param            SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                fastcgi_param            PATH_INFO        $fastcgi_path_info;
                fastcgi_param            PATH_TRANSLATED  $document_root$fastcgi_path_info;
                include                  fastcgi_params;
            }
}

PHP-FPM 是 PHP 的一個 FastCGI 管理器,配置中將 .php 結尾的請求通過 FashCGI 交給 PHP-FPM 處理

以下是對 ThinkPHP 的 URL 重寫,隱藏應用的入口檔案 index.php,這是對低版本 Nginx 不支援 PATHINFO 的解決方法

        location / {
                index  index.html index.htm index.php;
                if (!-e $request_filename) 
                {
                   rewrite ^(.*)$ /index.php?s=/$1 last;
                   break;
                }
            }

當前 Nginx 已能支援 PATHINFO

  • 多站點配置——虛擬主機

伺服器上放置多個網站專案,它們共同使用 80 埠,根據 HTTP 協議報文表頭資訊的 Host 來區分不同的 Server

    server {
        listen 80;
        server_name www.sea.com;
        root   /usr/local/www/sea;
        location / {
            index  index.html index.htm;
        }

    }
    server {
        listen 80;
        server_name www.star.com;
        root   /usr/local/www/sea;
        location / {
            index  index.html index.htm;
        }

    }

域名解析

阿里雲域名解析不通

ping www.sea.com

# Ping 請求找不到主機 http://banjintaohua.online/。請檢查該名稱,然後重試。

# Windows
nslookup www.sea.com

# 伺服器:  UnKnown
# Address:  fe80::1

# DNS request timed out.
#     timeout was 2 seconds.
# DNS request timed out.
#     timeout was 2 seconds.
# *** 沒有 www.sea.com 可以使用的 internal type for both IPv4 and IPv6 Addresses (A+AAAA)記錄

# Linux
dig www.sea.com

# ; <<>> DiG 9.10.4-P2 <<>> www.sea.com
# ;; global options: +cmd
# ;; Got answer:
# ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32759
# ;; flags: qr rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
# ;; WARNING: recursion requested but not available

# ;; QUESTION SECTION:
# ;www.sea.com.    IN    A

# ;; ANSWER SECTION:
# www.sea.com. 128 IN    A    42.123.125.237

# ;; Query time: 159 msec
# ;; SERVER: 218.85.152.99#53(218.85.152.99)
# ;; WHEN: Tue Dec 11 13:31:56 CST 2018
# ;; MSG SIZE  rcvd: 61

# 重新整理DNS快取
# Windows
ipconfig/flushdns

# 重新整理DNS快取
# Centos7
systemctl restart nscd

提工單,原來是:解析線路的問題,我使用了[解析路線:谷歌],也就意味著只有谷歌源IP才可以解析到,更改為[解析路線:預設]就好了

相關知識點

代理

  • 正向代理

正向代理是代理客戶端,為客戶端收發請求,使真實客戶端對伺服器不可見。例如 VPN 翻牆

  • 反向代理

反向代理是代理伺服器端,為伺服器收發請求,使真實伺服器對客戶端不可見。例如 CDN、負載均衡

轉發到 www.sea.com 的 8080 埠

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

負載均衡

  • 負載均衡

負載均衡的意義在於能讓所有節點以最小的代價對外提供服務,這樣系統吞吐量最大、效能更高、使用者請求時間更小
負載均衡演算法有:雜湊法、輪詢法等
負載均衡可以用來實現服務的動靜分離等

雜湊法:每個請求按訪問 IP 的 hash 結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決 session 的問題

    upstream loadbalance {
        ip_hash;                 # 雜湊法
        server 192.168.0.1:8080; # 應用伺服器1
        server 192.168.0.2:8080; # 應用伺服器2
    }
    server {
        listen 80;
        location / {
            proxy_pass http://loadbalance;
        }
    }

———————————————————-DONE————————————————————

相關文章

LNMP環境搭建(一):Mysql
LNMP環境搭建(二):Nginx
LNMP環境搭建(三):PHP

相關文章