1 Nginx簡介
Nginx是一個輕量級的高性能HTTP反向代理服務(wù)器,同時它也是一個通用類型的代理服務(wù)器,支持絕大部分協(xié)議,如TCP、UDP、SMTP、HTTPS等。
用Nginx代理后,客戶端的請求由其進行分發(fā)到服務(wù)器處理,服務(wù)器處理完后再返回Nginx,由Nginx結(jié)果返回給客戶端。
2 linux中Nginx安裝
服務(wù)器創(chuàng)建Nginx目錄并進入:
[root@localhost]# mkdir /soft && mkdir /soft/nginx/
[root@localhost]# cd /soft/nginx/
?下載Nginx安裝包
可以服務(wù)器遠程工具上傳已經(jīng)下載好的壓縮包,也用wget命令服務(wù)器在線下載壓縮包:
[root@localhost]# wget https://nginx.org/download/nginx-1.21.6.tar.gz
wget命令的可通過yum命令安裝;
?命令解壓Nginx壓縮包:
[root@localhost]# tar -xvzf nginx-1.21.6.tar.gz
?下載并安裝Nginx所需的依賴庫和包:
[root@localhost]# yum install --downloadonly --downloaddir=/soft/nginx/ gcc-c++
[root@localhost]# yum install --downloadonly --downloaddir=/soft/nginx/ pcre pcre-devel4
[root@localhost]# yum install --downloadonly --downloaddir=/soft/nginx/ zlib zlib-devel
[root@localhost]# yum install --downloadonly --downloaddir=/soft/nginx/ openssl openssl-devel
完成后ls查看,所有需要依賴都在里面:
然后用rpm命令依次構(gòu)建每個依賴包;或用以下下指令一鍵安裝全部依賴包:
[root@localhost]# rpm -ivh --nodeps *.rpm
?cd到nginx目錄,執(zhí)行Nginx配置腳本,提前配置好環(huán)境便于后面安裝,默認位于/usr/local/nginx/目錄:
[root@localhost]# cd nginx-1.21.6
[root@localhost]# ./configure --prefix=/soft/nginx/
?執(zhí)行命令編譯并安裝Nginx:
[root@localhost]# make && make install
?回到/soft/nginx/目錄,用ls可看到安裝nginx后生成的文件。
?修改安裝后conf目錄下的nginx.conf:
[root@localhost]# vi conf/nginx.conf
修改端口號:listen 80;
修改IP地址:server_name 你當前機器的本地IP(線上配置域名);
?制定Nginx配置文件并啟動:
[root@localhost]# sbin/nginx -c conf/nginx.conf
[root@localhost]# ps aux | grep nginx
?放開80端口,刷新服務(wù)器防火墻:
[root@localhost]# firewall-cmd --zone=public --add-port=80/tcp --permanent
[root@localhost]# firewall-cmd --reload
[root@localhost]# firewall-cmd --zone=public --list-ports
?瀏覽器輸入Nginx配的IP或域名訪問,如果你看到了Nginx歡迎界面,那么恭喜你安裝成功。
3 Nginx配置詳解及優(yōu)化
1、Nginx用戶及組。
user nginx nginx ;
2、工作進程數(shù)量,按實際生產(chǎn)機器調(diào)整,通常等于CPU數(shù)量或者2倍于CPU。
worker_processes 8;
3、錯誤日志存放路徑配置。
error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info;
4、pid的存放路徑。
pid logs/nginx.pid;
5、指定進程可以打開的數(shù)目。
worker_rlimit_nofile 204800;
6、每個進程的最大連接數(shù),實際生產(chǎn)中按照機器配置調(diào)整,原則上sh設(shè)置大一點,但不超過CPU100%。
理論上單臺nginx允許的最大連接數(shù)為:worker_processes*worker_connections
worker_connections 204800;
7、keepalive超時時間。
keepalive_timeout 60;
8、客戶端請求頭部的緩沖區(qū)大小。該參數(shù)根據(jù)實際業(yè)務(wù)需要來設(shè)置(例如分頁)。
client_header_buffer_size 4k;
9、打開的文件指定緩存,默認不啟用;
max為緩存數(shù)量(建議和打開文件數(shù)量一樣);
inactive為文件多久沒有請求刪除該文件緩存。
open_file_cache max=65535 inactive=60s;
10、緩存有效信息檢測時間。
open_file_cache_valid 80s;
11、open_file_cache命令中的inactive參數(shù)時間內(nèi),設(shè)置文件的最少使用次數(shù),超過設(shè)置的該數(shù)字,文件描述符會在緩存中一直打開。
open_file_cache_min_uses 1;
12、設(shè)置http服務(wù)器,利用它的反向代理功能提供負載均衡支持
http
{
include mime.types;
}
mime類型設(shè)置,以及類型由mime.type文件定義
default_type Application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format log404 '$status [$time_local] $remote_addr $host$request_uri $sent_http_location';
日志格式設(shè)置
$remote_addr與$http_x_forwarded_for用以記錄客戶端的ip地址;
$remote_user:用來記錄客戶端用戶名稱;
$time_local: 用來記錄訪問時間與時區(qū);
$request: 用來記錄請求的url與http協(xié)議;
$status: 用來記錄請求狀態(tài);成功是200,
$body_bytes_sent :記錄發(fā)送給客戶端文件主體內(nèi)容大??;
$http_referer:用來記錄從那個頁面鏈接訪問過來的;
$http_user_agent:記錄客戶瀏覽器的相關(guān)信息;
log_format命令設(shè)置log格式后,需用access_log命令設(shè)置log存放路徑;
access_log logs/host.access.log main;
access_log logs/host.access.404.log log404;
13、
server_names_hash_max_size 和server_names_hash_bucket_size用來控制服務(wù)器名字hash表的保存
server_names_hash_bucket_size 128;
hash bucket size=hash表大小,且是一路處理器緩存大小的倍數(shù)。
如果hash bucket size等于一路處理器緩存的大小,那么在查找鍵的時候,最壞的情況下在內(nèi)存中查找的次數(shù)為2。
14、如果要增大13點中兩個參數(shù)的提示,首先要增大client_header_buffer_size參數(shù)值
client_header_buffer_size 4k;
15、客戶端請求頭部的緩沖區(qū)大小。分頁大小可以用命令getconf PAGESIZE取得。
large_client_header_buffers 8 128k;
nginx默認會用client_header_buffer_size這個buffer來讀header值,當header過大,則用
large_client_header_buffers來讀header值。
16、設(shè)置通過nginx上傳文件的大小
open_file_cache max=102400 inactive=20s;
17、sendfile指令指定 nginx 是否調(diào)用sendfile 函數(shù)(zero copy 方式)來輸出文件,對于普通應用,必須設(shè)為on。如果用來進行下載等應用磁盤IO重負載應用,可設(shè)置為off,以平衡磁盤與網(wǎng)絡(luò)IO處理速度,降低系統(tǒng)uptime。
sendfile on;
18、允許或禁止socket的TCP_CORK的選項,只有使用了sendfile時才用
tcp_nopush on;
19、后端服務(wù)器連接的超時時間
proxy_connect_timeout 90;
20、后端服務(wù)器處理請求的時間
proxy_read_timeout 180;
21、后端服務(wù)器數(shù)據(jù)響應時間
proxy_send_timeout 180;
22、設(shè)置從被代理服務(wù)器讀取的第一部分應答的緩沖區(qū)大小
proxy_buffer_size 256k;
23、設(shè)置用于讀取應答的緩沖區(qū)數(shù)目和大小,默認情況也為分頁大小。
proxy_buffers 4 256k;
24、設(shè)置在寫入proxy_temp_path時數(shù)據(jù)的大小,預防一個工作進程在傳遞文件時阻塞太長
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
25、proxy_temp_path和proxy_cache_path指定的路徑必須在同一分區(qū)
proxy_temp_path /data0/proxy_temp_dir;
26、設(shè)置內(nèi)存緩存空間大小為300MB,如果內(nèi)容2天未被訪問則自動清除緩存,硬盤緩存空間大小為30GB。
proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:300m inactive=2d max_size=30g;
27、keepalive超時時間。
keepalive_timeout 120;
28、nginx的upstream配置
a、輪詢(默認)
全部請求都按時間順序分配到后端服務(wù)器。
b、weight(權(quán)重)
很好理解,就是指定輪詢概率,權(quán)重大小和訪問概率成正比,用于后端服務(wù)器性能不均的情況。
例如:
upstream bakend {
server 192.168.110.230 weight=10;
server 192.168.110.235 weight=5;
}
//此時的設(shè)置測192.168.110.230的訪問概率是192.168.110.235的兩倍
c、ip_hash
所有請求都按訪問ip的hash結(jié)果分配,如此以來每個用戶可以訪問固定的后端服務(wù)器。
可以用來解決session共享的問題,但當前環(huán)境下大多用redis等解決session共享了。
例如:
upstream bakend {
ip_hash;
server 192.168.110.230:88;
server 192.168.110.235:80;
}
d、fair
fair是第三方提供的不是nginx官方提供的,即按后端服務(wù)器的響應時間來分配請求,響應時間短的優(yōu)先分配。
例如:
upstream backend {
server server1;
server server2;
fair;
}
e、url_hash
url_hash也是第三方提供的不是nginx官方提供的,即按訪問url的hash結(jié)果來分配請求,使每個url定向到同一個后端服務(wù)器,后端服務(wù)器為緩存時比較有效。
例如:
upstream backend {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
29、nginx請求限流
限制哪些惡意攻擊請求網(wǎng)站的請求。
#限制用戶連接數(shù)來預防DOS攻擊
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
#限制同一客戶端ip最大并發(fā)連接數(shù)
limit_conn perip 2;
#限制同一server最大并發(fā)連接數(shù)
limit_conn perserver 20;
#限制下載速度,根據(jù)自身服務(wù)器帶寬配置
limit_rate 300k;
30、nginx負載均衡
upstream ygoapi{
server ip:port fail_timeout=5 max_fails=3;
server ip:port fail_timeout=5 max_fails=3;
ip_hash; #負載均衡策略
}
31、nginx中htpps配置
server {
listen 443;
server_name 域名;
ssl on;
root /xxx/xxx/html; // 前臺文件存放文件夾,一般使用 Nginx 初始化的文件夾,當然也可以自己修改
index index.html;// 上面配置的文件夾里面的index.html
ssl_certificate /路徑/證書名稱.pem;
ssl_certificate_key /路徑/證書名稱.key;
ssl_session_timeout 5m;
# SSL協(xié)議配置
ssl_protocols SSLv2 SSLv3 TLSv1.2; #表示使用TLS類型協(xié)議
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; #表示使用加密套件的類型
ssl_prefer_server_ciphers on;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
}
}
server {
listen 80;
server_name your-domain.com;// 你的域名
rewrite ^(.*)$ https://$host:443$1 permanent;// 把http的域名請求轉(zhuǎn)成https且轉(zhuǎn)發(fā)到443端口
}
32、nginx全局配置
worker_processes 1;
pid /var/run/nginx.pid;
events {
worker_connections 2048;
multi_accept on;
use epoll;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"url":"$uri",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"agent":"$http_user_agent",'
'"status":"$status"}';
sendfile on;
tcp_nopush on;
tcp_nodelay on;
server_names_hash_bucket_size 128;
server_names_hash_max_size 512;
keepalive_timeout 65;
client_header_timeout 15s;
client_body_timeout 15s;
send_timeout 60s;
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
limit_conn perip 2;
limit_conn perserver 20;
limit_rate 300k;
proxy_cache_path /data/nginx-cache levels=1:2 keys_zone=nginx-cache:20m max_size=50g inactive=168h;
client_body_buffer_size 512k;
client_header_buffer_size 4k;
client_max_body_size 512k;
large_client_header_buffers 2 8k;
proxy_connect_timeout 5s;
proxy_send_timeout 120s;
proxy_read_timeout 120s;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_next_upstream http_502 http_504 http_404 error timeout invalid_header;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 4;
gzip_types text/plain text/css application/json application/x-JAVAscript text/xml application/xml application/xml+rss text/JavaScript;
gzip_vary on;
gzip_disable "MSIE [1-6].";
include /etc/nginx/conf.d/*.conf;
}
33、nginx內(nèi)核參數(shù)配置
#如果想把timewait降下了就要把tcp_max_tw_buckets值減小,默認是180000
net.ipv4.tcp_max_tw_buckets = 5000
#開啟重用功能,允許將TIME-WAIT狀態(tài)的sockets重新用于新的TCP連接
net.ipv4.tcp_tw_reuse = 1
#系統(tǒng)中最多有多少個TCP套接字不被關(guān)聯(lián)到任何一個用戶文件句柄上。如果超過這個數(shù)字,孤兒連接將即刻被復位并打印出警告信息。這個限制僅僅是為了防止簡單的DoS攻擊
net.ipv4.tcp_max_orphans = 262144
#當keepalive起用的時候,TCP發(fā)送keepalive消息的頻度。缺省是2小時。我們可以調(diào)短時間跨度
net.ipv4.tcp_keepalive_time = 30
34、server配置
#隱藏版本信息
server_tokens off;
server {
listen 80;
server_name www.ygoclub.com;
charset utf-8;
#重定向HTTP請求到HTTPS
return 301 https://$server_name$request_uri;
}