【最全】Nginx安裝與優化
阿新 • • 發佈:2019-02-08
Nginx安裝
一、 安裝依賴包
1. Ubuntu平臺
安裝gcc g++的依賴庫
apt-get install build-essential
apt-get install libtool
安裝 pcre依賴庫
cd /usr/local/src 注:在src目錄下操作
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.41.tar.gz 注:下載安裝包
tar -zxvf pcre-8.41 .tar.gz 注:解壓檔案
cd pcre-8.41 注:進入檔案目錄
./configure
make
make install
安裝 zlib依賴庫
apt-get install zlib1g-dev
安裝 ssl依賴庫
apt-get install openssl
apt-get install libssl-dev
2. Centos平臺
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
再按照Ubuntu方法安裝pcre依賴庫
二、 安裝Nginx
- 下載安裝包
cd /usr/local/src/
wget http://nginx.org/download/nginx-1.12.1.tar.gz 注:下載Nginx,最新版本自行官網檢視
tar zxvf nginx-1.12.1.tar.gz 注:解壓安裝包
cd nginx-1.12.1 注:進入安裝目錄
- 編譯安裝
注:安裝在/usr/local/nginx,注意修改pcre目錄。
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.41
make
make install
三、 Nginx配置
- 建立 Nginx 執行使用的使用者 nginx
/usr/sbin/groupadd nginx
/usr/sbin/useradd -g nginx nginx
- 修改配置檔案
備份原配置檔案
cd /usr/local/nginx/conf/
mv nginx.conf nginx.conf.bak
配置nginx.conf ,將/usr/local/nginx/conf/nginx.conf改為以下內容
vi /usr/local/nginx/conf/nginx.conf
user nginx nginx; #配置使用者或者組
worker_processes auto;
pid /usr/local/nginx/nginx.pid;
worker_rlimit_nofile 65535; #與ulimit -n 的值保持一致
events
{
multi_accept on; #設定一個程序是否同時接受多個網路連線,預設為off
use epoll; #高效能網路I/O模型,不用管
worker_connections 65535; #單個程序最大連線數(最大連線數=連線數*程序數),與ulimit -n 的值一致即可
}
http{
server_tokens off; #關閉在錯誤頁面中的nginx版本數字
sendfile on; #進行下載等應用磁碟IO重負載應用,可設定為 off
#autoindex on; #目錄列表訪問,下載伺服器設定,預設不設定
error_log /usr/local/nginx/logs/error.log crit; #記錄嚴重的錯誤,注意修改路徑
log_format access escape=json '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
access_log /usr/local/nginx/logs/access.log access; #記錄訪問日誌,上面為日誌訪問格式
keepalive_timeout 1800; #長連線超時時間,掃碼設定為1800
keepalive_requests 500; #每個長連線最大請求數
limit_conn_zone $binary_remote_addr zone=TotalConnLimitZone:10m ;#設定IP限速
limit_req_zone $binary_remote_addr zone=ConnLimitZone:10m rate=50r/s; #每個 IP 地址每秒最大處理 50 個請求
include mime.types; #呼叫樣式
#include blocksip.conf; #配置禁用訪問ip,預設進行關閉,需要自行配置
default_type application/octet-stream;
server_names_hash_bucket_size 128; #伺服器名字的hash表大小
client_header_buffer_size 32k; #客戶端請求頭部的緩衝區大小,預設這樣就行
large_client_header_buffers 4 64k; #客戶請求頭緩衝大小,預設就行
client_max_body_size 100m; #設定通過nginx上傳檔案的大小,需要上傳檔案的注意這個引數
gzip on; #採用資料壓縮
gzip_min_length 1k; #最小壓縮檔案大小
gzip_buffers 4 16k; #壓縮緩衝區
gzip_http_version 1.0; #壓縮版本
gzip_comp_level 4; #壓縮等級
gzip_types text/plain application/x-javascript text/css application/xml; #壓縮型別
gzip_vary on;
##快取cache引數配置
proxy_connect_timeout 5; #與後端程式連線超時時間,單位為秒
proxy_read_timeout 60; #讀取後端程式超時時間,掃碼業務設定為1800,注意
proxy_send_timeout 5; #向後端傳送超時時間
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
#快取到nginx的本地目錄
proxy_temp_path /usr/local/nginx/html/nginx_temp; #設定快取臨時目錄
proxy_cache_path /usr/local/nginx/html/nginx_temp/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=10g;
#設定快取資料夾;keys_zone快取空間名; inactive檔案1天內沒有被訪問就刪除,max_size快取佔用最大空間為10G
upstream backend
{
server 192.168.18.19:8080; #設定代理地址
server 192.168.18.19:8089; #設定代理地址
keepalive 16; #啟動後端長連線
}
server {
listen 9000; #監聽埠
server_name hbsm.xinli.com.cn; #監聽地址,域名可以有多個,用空格隔開
root html; #根目錄
index index.php index.htm index.html; #預設頁
#動態請求代理給相應伺服器
location / {
#include agent_deny.conf; #遮蔽爬蟲攻擊,需要外部配置,預設關閉,配置好外部配置開啟
limit_req zone=ConnLimitZone burst=100 nodelay; #設定限速200個排隊
limit_conn TotalConnLimitZone 100; #限制每個IP只能發起100個併發連線
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_redirect off;
proxy_http_version 1.1; #設定Http協議版本
proxy_pass http://backend; #轉向定義服務列表
}
#快取相應的檔案(靜態檔案)
location ~ \.(gif|jpg|png|htm|html|css|js|flv|ico|swf)(.*) {
#include agent_deny.conf; #遮蔽爬蟲攻擊,需要外部配置,預設關閉,配置好外部配置開啟
proxy_pass http://backend; #如果沒有快取則通過proxy_pass轉向請求
#proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie; #強制快取,部分應用會不讓靜態頁面快取,此方法可以強制快取靜態頁,預設關閉
proxy_redirect off;
proxy_set_header Host $host;
proxy_cache cache_one; #設定快取共享記憶體區塊,也就是keys_zone名稱
proxy_cache_valid 200 302 1h; #對不同的HTTP狀態碼設定不同的快取時間,h小時,d天數
proxy_cache_valid 301 1d;
proxy_cache_valid any 1m;
expires 7d; #設定使用者本地快取檔案失期時間
}
}
}
附件配置
- 遮蔽帶有某關鍵詞的url訪問(在server下面加入)
#遮蔽帶有關鍵詞/getCCHelpDownloadInfo的url
location ~ /getCCHelpDownloadInfo {
return 403;
access_log off; #此類訊息不加入日誌
}
- 防止爬蟲
vi /usr/local/nginx/conf/agent_deny.conf
#禁止URL帶有“&url=”的關鍵詞訪問
if ($request ~* (&url=|qq.com|kugou.com)) {
return 403;
access_log off; #此類訊息不加入日誌
}
#禁止Scrapy等工具的抓取,注意是否遮蔽了監控
if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) {
return 403;
access_log off; #此類訊息不加入日誌
}
#禁止指定UA及UA為空的訪問
if ($http_user_agent ~ "COOCAREHTTPULPADAGENT|WinHttp|WebZIP|FetchURL|node-superagent|java/|FeedDemon|Jullo|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|Java|Feedly|Apache-HttpAsyncClient|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|BOT/0.1|YandexBot|FlightDeckReports|Linguee Bot|^$" ) {
return 403;
access_log off; #此類訊息不加入日誌
}
#禁止非GET|HEAD|POST方式的抓取
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 403;
access_log off; #此類訊息不加入日誌
}
#修改設定cookies,多層判斷示例,nginx不支援巢狀判斷
if ($request ~ &version=6.0&) {
set $iftm Y;
}
if ($http_user_agent !~* (Android/6.0/)) {
set $iftm "${iftm}Y";
}
if ($iftm = YY) {
#return 201 'into responseToauth00';
#add_header Set-Cookie 'Key=system';
#access_log off; #此類訊息不加入日誌
}
然後在nginx.conf的location中加入
include agent_deny.conf;
配置輪詢方式
- 輪詢(預設)
每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。 - weight
指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。
例如:
upstream backend {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}
- ip_hash
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。
例如:
upstream backend {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}
- fair(第三方)
按後端伺服器的響應時間來分配請求,響應時間短的優先分配。
upstream backend {
server server1.linuxany.com;
server server2.linuxany.com;
fair;
}
- url_hash(第三方)
按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,後端伺服器為快取時比較有效。例:在upstream中加入hash語句,server語句中不能寫入weight等其他的引數,hash_method是使用的hash演算法
upstream backend {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
檢查配置的正確性
/usr/local/nginx/sbin/nginx -t
設定nginx目錄使用者
cd /usr/local/
chown -R nginx:nginx nginx/
chmod -R 755 nginx/
設定nginx黑名單
vi /usr/local/nginx/conf/blocksip.conf
deny 47.88.226.12;
allow all;
四、 啟動Nginx
/usr/local/nginx/sbin/nginx
ps -ef |grep nginx 注:檢視是否啟動
Nginx 其他命令
/usr/local/nginx/sbin/nginx -s reload # 重新載入配置檔案
/usr/local/nginx/sbin/nginx -s reopen # 重啟 Nginx
/usr/local/nginx/sbin/nginx -s stop # 停止 Nginx
加入服務
vi /etc/init.d/nginx # 編輯指令碼
指令碼內容
#!/bin/bash
#nx Startup script for the Nginx HTTP Server
# it is v.0.0.2 version.
# chkconfig: - 85 15
# description: Nginx is a high-performance web and proxy server.
# It has a lot of features, but it's not for everyone.
# processname: nginx
# pidfile: /var/run/nginx.pid
# config: /usr/local/nginx/conf/nginx.conf
nginxd=/usr/local/nginx/sbin/nginx
nginx_config=/usr/local/nginx/conf/nginx.conf
nginx_pid=/var/run/nginx.pid
RETVAL=0
prog="nginx"
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -x $nginxd ] || exit 0
# Start nginx daemons functions.
start() {
if [ -e $nginx_pid ];then
echo "nginx already running...."
exit 1
fi
echo -n $"Starting $prog: "
daemon $nginxd -c ${nginx_config}
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch /var/lock/subsys/nginx
return $RETVAL
}
# Stop nginx daemons functions.
stop() {
echo -n $"Stopping $prog: "
killproc $nginxd
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /var/run/nginx.pid
}
# reload nginx service functions.
reload() {
echo -n $"Reloading $prog: "
#kill -HUP `cat ${nginx_pid}`
killproc $nginxd -HUP
RETVAL=$?
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
reload)
reload
;;
restart)
stop
start
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $prog {start|stop|restart|reload|status|help}"
exit 1
esac
exit $RETVAL
chmod a+x /etc/init.d/nginx #賦予指令碼執行許可權
ubuntu加入系統服務
update-rc.d nginx defaults
centos加入系統服務
chkconfig --add nginx
chkconfig nginx on
service nginx start #啟動nginx
service nginx stop #停止nginx
service nginx restart #停止nginx
五、 測試Nginx
瀏覽器訪問伺服器ip+埠檢視是否能訪問網頁,重新整理看是否能切換到不同網頁。
六、 Nginx狀態碼說明
200 正常
304 已經快取,不用去伺服器取
499 使用者主動斷開,常見使用者獲取二維碼後關閉了客戶端
504 nginx把連線主動斷開了,檢視設定的超時時間