Nginx 安裝與部署配置以及Nginx和uWSGI開機自啟
轉載出處: https://www.cnblogs.com/wcwnina/p/8728430.html
下載
官方網站:https://nginx.org/en/download.html
Windows下安裝
安裝
下載後解壓(切記不能含有中文路徑!!),檔案結構如圖(我解壓的路徑就有中文,記得拷貝放置於英文目錄下即可!):
啟動
兩種方法:
1) 直接雙擊該目錄下的"nginx.exe",即可啟動nginx伺服器;
2) 命令列進入該資料夾,執行start nginx命令,也會直接啟動nginx伺服器。
啟動時,會有個黑視窗一閃而過!
驗證
開瀏覽器,輸入地址:http://localhost,訪問頁面,出現如下頁面表示訪問成功。
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個包
依賴包安裝順序依次為: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 && 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 && 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 && 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 && 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.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配置還可以過濾有人惡意將某些域名指向你的主機伺服器。
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 esacView Code
儲存指令碼檔案後對所有使用者追加可執行許可權:
chmod a+x /etc/init.d/nginx
先將nginx服務加入chkconfig管理列表:
chkconfig --add /etc/init.d/nginx
設定終端模式開機啟動:
chkconfig nginx on