Nginx 安裝與部署配置以及Nginx和uWSGI開機自啓

下載

官方網站:https://nginx.org/en/download.htmlphp

 

Windows下安裝

安裝

下載後解壓(切記不能含有中文路徑!!),文件結構如圖(我解壓的路徑就有中文,記得拷貝放置於英文目錄下便可!):html

啓動

兩種方法:node

1) 直接雙擊該目錄下的"nginx.exe",便可啓動nginx服務器;linux

2) 命令行進入該文件夾,執行start nginx命令,也會直接啓動nginx服務器。nginx

驗證

開瀏覽器,輸入地址:http://localhost,訪問頁面,出現以下頁面表示訪問成功。web

Nginx Windows基本操做指令

啓動服務:start nginx
退出服務:nginx -s quit
強制關閉服務:nginx -s stop
重載服務:nginx -s reload  (重載服務配置文件,相似於重啓,服務不會停止)
驗證配置文件:nginx -t
使用配置文件:nginx -c "配置文件路徑"
使用幫助:nginx -h

Linux下安裝

申明:基於CentOS 7系統。算法

 Nginx依賴包

模塊依賴性Nginx須要依賴下面3個包vim

  1. ssl功能須要 openssl 庫 ( 點擊下載 )
  2. gzip模塊須要 zlib 庫 ( 點擊下載 )
  3. rewrite模塊須要 pcre 庫 ( 點擊下載 )

依賴包安裝順序依次爲:openssl、zlib、pcre, 最後安裝Nginx包。後端

安裝教程(源碼安裝)

 step 1:下載所需包

openssl-fips-2.0.2.tar.gz
zlib-1.2.7.tar.gz
pcre-8.21.tar.gz
nginx-1.12.2.tar.gz

step 2:安裝OpenSSL

[root@localhost wcw]# tar -zxvf openssl-fips-2.0.2.tar.gz 
[root@localhost wcw]# cd openssl-fips-2.0.2
[root@localhost openssl-fips-2.0.2]# ./config 
[root@localhost openssl-fips-2.0.2]# make
[root@localhost openssl-fips-2.0.2]# make install

step 3:安裝zlib

[root@localhost wcw]# tar -zxvf zlib-1.2.7.tar.gz
[root@localhost wcw]# cd zlib-1.2.7
[root@localhost zlib-1.2.7]# ./configure 
[root@localhost zlib-1.2.7]# make
[root@localhost zlib-1.2.7]# make install

step 4:安裝pcre

[root@localhost wcw]# tar -zxvf pcre-8.21.tar.gz
[root@localhost wcw]# cd pcre-8.21
[root@localhost pcre-8.21]# ./configure 
[root@localhost pcre-8.21]# make
[root@localhost pcre-8.21]# make install

step 5:安裝Nginx

[root@localhost wcw]# tar -zxvf nginx-1.12.2.tar.gz 
[root@localhost wcw]# cd nginx-1.12.2
[root@localhost nginx-1.12.2]# ./configure --prefix=/usr/install/nginx --with-pcre=../pcre-8.21 --with-zlib=../zlib-1.2.7 --with-openssl=../openssl-fips-2.0.2
[root@localhost nginx-1.12.2]# make
[root@localhost nginx-1.12.2]# make install

請注意:"--with-xxx="的值是解壓目錄,而不是安裝目錄!瀏覽器

Nginx Linux基本操做指令

啓動服務:nginx
退出服務:nginx -s quit
強制關閉服務:nginx -s stop
重載服務:nginx -s reload  (重載服務配置文件,相似於重啓,但服務不會停止)
驗證配置文件:nginx -t
使用配置文件:nginx -c "配置文件路徑"
使用幫助:nginx -h

此時能夠爲Nginx添加環境變量,以便操做服務。(>>如何添加Linux環境變量?

檢測是否安裝成功:

[root@localhost wcw]# nginx -t

出現以下提示,表示安裝成功。

或者,在瀏覽器地址輸入"127.0.0.1"回車出現以下頁面,則表示安裝成功。

 

Nginx配置文件說明

在項目使用中,使用最多的三個核心功能是靜態服務器、反向代理和負載均衡。

這三個不一樣的功能的使用,都跟Nginx的配置密切相關,Nginx服務器的配置信息主要集中在"nginx.conf"這個配置文件中,而且全部的可配置選項大體分爲如下幾個部分.

main                                # 全局配置

events {                            # 工做模式配置

}

http {                              # http設置
    ....

    server {                        # 服務器主機配置(虛擬主機、反向代理等)
        ....
        location {                  # 路由配置(虛擬目錄等)
            ....
        }

        location path {
            ....
        }

        location otherpath {
            ....
        }
    }

    server {
        ....

        location {
            ....
        }
    }

    upstream name {                  # 負載均衡配置
        ....
    }
}

main模塊

  • user    用來指定nginx worker進程運行用戶以及用戶組,默認nobody帳號運行
  • worker_processes    指定nginx要開啓的子進程數量,運行過程當中監控每一個進程消耗內存(通常幾M~幾十M不等)根據實際狀況進行調整,一般數量是CPU內核數量的整數倍
  • error_log    定義錯誤日誌文件的位置及輸出級別【debug / info / notice / warn / error / crit】
  • pid    用來指定進程id的存儲文件的位置
  • worker_rlimit_nofile    用於指定一個進程能夠打開最多文件數量的描述
  • ...

event模塊

  • worker_connections    指定最大能夠同時接收的鏈接數量,這裏必定要注意,最大鏈接數量是和worker processes共同決定的。
  • multi_accept    配置指定nginx在收到一個新鏈接通知後儘量多的接受更多的鏈接
  • use epoll    配置指定了線程輪詢的方法,若是是linux2.6+,使用epoll,若是是BSD如Mac請使用Kqueue
  • ...

http模塊

做爲web服務器,http模塊是nginx最核心的一個模塊,配置項也是比較多的,項目中會設置到不少的實際業務場景,須要根據硬件信息進行適當的配置。

1)基礎配置

sendfile on:配置on讓sendfile發揮做用,將文件的回寫過程交給數據緩衝去去完成,而不是放在應用中完成,這樣的話在性能提高有有好處
tcp_nopush on:讓nginx在一個數據包中發送全部的頭文件,而不是一個一個單獨發
tcp_nodelay on:讓nginx不要緩存數據,而是一段一段發送,若是數據的傳輸有實時性的要求的話能夠配置它,發送完一小段數據就馬上能獲得返回值,可是不要濫用哦

keepalive_timeout 10:給客戶端分配鏈接超時時間,服務器會在這個時間事後關閉鏈接。通常設置時間較短,可讓nginx工做持續性更好
client_header_timeout 10:設置請求頭的超時時間
client_body_timeout 10:設置請求體的超時時間
send_timeout 10:指定客戶端響應超時時間,若是客戶端兩次操做間隔超過這個時間,服務器就會關閉這個連接

limit_conn_zone $binary_remote_addr zone=addr:5m :設置用於保存各類key的共享內存的參數,
limit_conn addr 100: 給定的key設置最大鏈接數

server_tokens:雖然不會讓nginx執行速度更快,可是能夠在錯誤頁面關閉nginx版本提示,對於網站安全性的提高有好處哦
include /etc/nginx/mime.types:指定在當前文件中包含另外一個文件的指令
default_type application/octet-stream:指定默認處理的文件類型能夠是二進制
type_hash_max_size 2048:混淆數據,影響三列衝突率,值越大消耗內存越多,散列key衝突率會下降,檢索速度更快;值越小key,佔用內存較少,衝突率越高,檢索速度變慢

2)日誌配置

access_log logs/access.log:設置存儲訪問記錄的日誌
error_log logs/error.log:設置存儲記錄錯誤發生的日誌

3)SSL證書配置

ssl_protocols:指令用於啓動特定的加密協議,nginx在1.1.13和1.0.12版本後默認是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,TLSv1.1與TLSv1.2要確保OpenSSL >= 1.0.1 ,SSLv3 如今還有不少地方在用但有很多被攻擊的漏洞。
ssl prefer server ciphers:設置協商加密算法時,優先使用咱們服務端的加密套件,而不是客戶端瀏覽器的加密套件

4)壓縮配置

gzip 是告訴nginx採用gzip壓縮的形式發送數據。這將會減小咱們發送的數據量。
gzip_disable 爲指定的客戶端禁用gzip功能。咱們設置成IE6或者更低版本以使咱們的方案可以普遍兼容。
gzip_static 告訴nginx在壓縮資源以前,先查找是否有預先gzip處理過的資源。這要求你預先壓縮你的文件(在這個例子中被註釋掉了),從而容許你使用最高壓縮比,這樣nginx就不用再壓縮這些文件了(想要更詳盡的gzip_static的信息,請點擊這裏)。
gzip_proxied 容許或者禁止壓縮基於請求和響應的響應流。咱們設置爲any,意味着將會壓縮全部的請求。
gzip_min_length 設置對數據啓用壓縮的最少字節數。若是一個請求小於1000字節,咱們最好不要壓縮它,由於壓縮這些小的數據會下降處理此請求的全部進程的速度。
gzip_comp_level 設置數據的壓縮等級。這個等級能夠是1-9之間的任意數值,9是最慢可是壓縮比最大的。咱們設置爲4,這是一個比較折中的設置。
gzip_type 設置須要壓縮的數據格式。上面例子中已經有一些了,你也能夠再添加更多的格式。

5)文件緩存配置

open_file_cache 打開緩存的同時也指定了緩存最大數目,以及緩存的時間。咱們能夠設置一個相對高的最大時間,這樣咱們能夠在它們不活動超過20秒後清除掉。
open_file_cache_valid 在open_file_cache中指定檢測正確信息的間隔時間。
open_file_cache_min_uses 定義了open_file_cache中指令參數不活動時間期間裏最小的文件數。
open_file_cache_errors 指定了當搜索一個文件時是否緩存錯誤信息,也包括再次給配置中添加文件。咱們也包括了服務器模塊,這些是在不一樣文件中定義的。若是你的服務器模塊不在這些位置,你就得修改這一行來指定正確的位置。

sever模塊

srever模塊配置是http模塊中的一個子模塊,用來定義一個虛擬訪問主機,也就是一個虛擬服務器的配置信息。

server {
    listen         80;
    server_name    localhost  192.168.1.100;
    charset        utf-8;
    access_log     logs/access.log;
    error_log      logs/error.log;
    ......
}
  • server:一個虛擬主機的配置,一個http中能夠配置多個server
  • server_name:用來指定ip地址或者域名,多個配置之間用空格分隔
  • charset:用於設置www/路徑中配置的網頁的默認編碼格式
  • access_log:用於指定該虛擬主機服務器中的訪問記錄日誌存放路徑
  • error_log:用於指定該虛擬主機服務器中訪問錯誤日誌的存放路徑

 location模塊

location模塊是Nginx配置中出現最多的一個配置,主要用於配置路由訪問信息。

在路由訪問信息配置中關聯到反向代理、負載均衡等等各項功能,因此location模塊也是一個很是重要的配置模塊。

1)基本配置

location / {
    root    /nginx/www;
    index    index.php index.html index.htm;
}
  • location /:表示匹配訪問根目錄
  • root:用於指定訪問根目錄時,訪問虛擬主機的web目錄
  • index:在不指定訪問具體資源時,默認展現的資源文件列表

2)反向代理配置

經過反向代理代理服務器訪問模式,經過proxy_set配置讓客戶端訪問透明化。

location / {
    proxy_pass http://localhost:8888;
    proxy_set_header X-real-ip $remote_addr;
    proxy_set_header Host $http_host;
}

3)uwsgi配置

location / {
    include uwsgi_params;
    uwsgi_pass localhost:8888;
}

負載均衡模塊(upstream)

upstream模塊主要負責負載均衡的配置,經過默認的輪詢調度方式來分發請求到後端服務器。簡單的配置方式以下。

upstream name {
    ip_hash;
    server 192.168.1.100:8000 weight=9;
    server 192.168.1.100:8001 down;
    server 192.168.1.100:8002 max_fails=3;
    server 192.168.1.100:8003 fail_timeout=20s;
    server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
}
  • ip_hash:指定請求調度算法,默認是weight權重輪詢調度,能夠指定
  • server host:port:分發服務器的列表配置
  • -- down:表示該主機暫停服務
  • -- max_fails:表示失敗最大次數,超過失敗最大次數暫停服務
  • -- fail_timeout:表示若是請求受理失敗,暫停指定的時間以後從新發起請求

Nginx主要配置

靜態Http服務器配置

首先,Nginx是一個HTTP服務器,能夠將服務器上的靜態文件(如HTML、圖片)經過HTTP協議展示給客戶端。
配置:

server {
    listen 80;   # 端口
    server_name localhost  192.168.1.100;   # 域名   
    location / {             # 表明這是項目根目錄
        root /usr/share/nginx/www;   # 虛擬目錄
    }
}

反向代理服務器配置

什麼是反向代理?
客戶端原本能夠直接經過HTTP協議訪問某網站應用服務器,若是網站管理員在中間加上一個Nginx,客戶端請求Nginx,Nginx請求應用服務器,而後將結果返回給客戶端,此時Nginx就是反向代理服務器。

反向代理配置:

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

既然服務器能夠直接HTTP訪問,爲何要在中間加上一個反向代理,不是畫蛇添足嗎?反向代理有什麼做用?繼續往下看,下面的負載均衡、虛擬主機,都基於反向代理實現,固然反向代理的功能也不只僅是這些。

負載均衡配置

當網站訪問量很是大,也攤上事兒了。由於網站愈來愈慢,一臺服務器已經不夠用了。因而將相同的應用部署在多臺服務器上,將大量用戶的請求分配給多臺機器處理。同時帶來的好處是,其中一臺服務器萬一掛了,只要還有其餘服務器正常運行,就不會影響用戶使用。Nginx能夠經過反向代理來實現負載均衡。

負載均衡配置:

upstream myapp {
   ip_hash;  # 固定訪客 server
192.168.0.111:8080 weight=9;   # 應用服務器1 server 192.168.0.112:8080 weight=1;   # 應用服務器2 }

虛擬主機配置

有的網站訪問量大,須要負載均衡。然而並非全部網站都如此出色,有的網站,因爲訪問量過小,須要節省成本,將多個網站部署在同一臺服務器上。
例如將www.aaa.comwww.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配置還能夠過濾有人惡意將某些域名指向你的主機服務器。

Nginx開機啓動(方法1,適用CentOS7,systemctl管理服務)

CentOS7系統服務腳本目錄

用戶(user):用戶登陸後才能運行的程序,存在用戶(user)。

/usr/lib/systemd/user

系統(system):如須要開機沒有登錄狀況下就能運行的程序,存在系統服務(system)裏。

/usr/lib/systemd/system

編寫service腳本

服務文件名以.service結尾:

vim /usr/lib/systemd/system/nginx.service

編寫腳本內容(固定格式):

[Unit]
Description=nginx
After=network.target
   
[Service]
Type=forking
PIDFile=/usr/install/nginx/logs/nginx.pid ExecStart=/usr/install/nginx/sbin/nginx ExecReload=/usr/install/nginx/sbin/nginx -s reload ExecStop=/usr/install/nginx/sbin/nginx -s stop PrivateTmp=true [Install] WantedBy=multi-user.target

以上路徑必須均爲絕對路徑!!而ExecStart、ExecReload、ExecStop的值也能夠是"/etc/init.d"下的自定義的sh腳本文件的絕對路徑,我就是採用這種方式來實現 uWSGI 開機啓動的:

/etc/init.d目錄下新建uWSGI服務啓動腳本文件"uwsgi-start.sh"#!/bin/sh
/pyvenv/bin/uwsgi --ini /pyvenv/src/eduonline/uwsgi.ini;
/etc/init.d目錄下新建uWSGI服務重啓腳本文件"uwsgi-restart.sh"#!/bin/sh
/pyvenv/bin/uwsgi --restart /pyvenv/src/eduonline/uwsgi.pid;
/etc/init.d目錄下新建uWSGI服務中止腳本文件"uwsgi-stop.sh"#!/bin/sh
/pyvenv/bin/uwsgi --stop /pyvenv/src/eduonline/uwsgi.pid;

注意:sh腳本中一樣採用絕對路徑!!保存後,賦予可讀可執行權限。而後編寫service腳本文件。

設置開機啓動(強大的CentOS服務管理工具systemctl

systemctl enable nginx.service      #".service"可省略

# 附其餘命令:
systemctl start nginx.service # 啓動
systemctl restart nginx.service # 重啓,服務會停止一下子
systemctl reload nginx.service    # 重載服務配置文件,相似於重啓,但服務不會停止
systemctl stop nginx.service # 中止
systemctl disable nginx.service # 關閉開機啓動

若是提示"Failed to execute operation: Access denied",輸入"systemctl daemon-reexec"可解決。

Nginx開機啓動(方法2,適用CentOS7如下)

首先,在Linux系統的"/etc/init.d/"目錄下建立nginx腳本文件,使用以下命令:

touch nginx       # 建立
vim nginx         # 編輯

在腳本中添加以下命令:

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15
# description:  NGINX is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/nginx.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/sbin/nginx"    # 修改可執行文件路徑
prog=$(basename $nginx)

NGINX_CONF_FILE="/etc/nginx/nginx.conf"    # 修改配置文件路徑

[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

lockfile=/var/lock/subsys/nginx

make_dirs() {
   # make required directories
   user=`$nginx -V 2>&1 | grep "configure arguments:.*--user=" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
   if [ -n "$user" ]; then
      if [ -z "`grep $user /etc/passwd`" ]; then
         useradd -M -s /bin/nologin $user
      fi
      options=`$nginx -V 2>&1 | grep 'configure arguments:'`
      for opt in $options; do
          if [ `echo $opt | grep '.*-temp-path'` ]; then
              value=`echo $opt | cut -d "=" -f 2`
              if [ ! -d "$value" ]; then
                  # echo "creating" $value
                  mkdir -p $value && chown -R $user $value
              fi
          fi
       done
    fi
}

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    make_dirs
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest || return $?
    stop
    sleep 1
    start
}

reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    RETVAL=$?
    echo
}

force_reload() {
    restart
}

configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac
View Code

保存腳本文件後對全部用戶追加可執行權限:

chmod a+x /etc/init.d/nginx

 先將nginx服務加入chkconfig管理列表:

chkconfig --add /etc/init.d/nginx

設置終端模式開機啓動:

chkconfig nginx on

 

   至此。轉載請註明出處。

 

相關文章
相關標籤/搜索