首頁  >  文章  >  運維  >  Nginx伺服器搭建與基本設定實例分析

Nginx伺服器搭建與基本設定實例分析

王林
王林轉載
2023-05-23 11:22:061562瀏覽

nginx(engine x) 是一個高效能的 http 伺服器和反向代理伺服器,這款軟體開發的目的是為了解決 c10k 問題。

nginx 的架構利用了許多現代作業系統的特性,以實現一個高效能的 http 伺服器。例如在linux 系統上,nginx 使用了epoll,sendfile,file aio,directio 等機制,使得nginx 不僅性能高效,而且資源佔用率非常低,官方宣稱nginx 維持10000 個非活動的http keep-alive 連接僅需要2.5 m 記憶體。
Nginx伺服器搭建與基本設定實例分析
nginx會按需同時運行多個進程:一個主進程(master)和幾個工作進程(worker),配置了快取時還會有快取載入器進程(cache loader)和快取管理器進程(cache manager)等。所有進程均是僅包含一個線程,並主要透過「共享記憶體」的機制實現進程間通訊。主程序以 root 使用者身分執行,而worker、cache loader 和 cache manager 均應以非特權使用者身分執行。

1. 安裝 nginx
在 centos6 版本的 epel 來源中,已經加入了 nginx 的 rpm 套件,不過此 rpm 套件版本較低。如果需要更新版本,可以使用官方製作的 rpm 包,或使用原始碼包編譯安裝。

也可以使用一些二次開發功能增強的 nginx 版本,例如淘寶的 tengine 和 openresty 都是不錯的選擇。

1.1 常用編譯參數

--prefix=path:指定nginx 的安裝目錄
--conf-path=path:指定nginx.conf 設定文件路徑
--user=name:nginx 工作進程的使用者
--with-pcre:開啟pcre 正規表示式的支援
--with-http_ssl_module:啟動ssl 的支援
--with -http_stub_status_module:用於監控nginx 的狀態
--with-http-realip_module:允許改變客戶端請求頭中客戶端ip 位址
--with-file-aio:啟用file aio
-- add-module=path:新增第三方外部模組
這裡提供一個完整的編譯方案:

--prefix=/usr/local/nginx \
--conf-path=/etc /nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/tmp/nginx/client_body \
--http-proxy-temp-path=/var/tmp/nginx/proxy \
--http-fastcgi-temp-path=/var/tmp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
--pid-path= /var/run/nginx.pid \
--lock-path=/var/lock/nginx \
--user=nginx \
--group=nginx \
--with- file-aio \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_sub_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-pcre
1.2 nginx 的啟動和關閉

#啟動nginx:

# nginx -c /etc/nginx/nginx.conf


關閉nginx

# nginx -s stop


重讀設定檔

# nginx -s reload
# pkill -hup nginx


重新開啟日誌檔案

# nginx -s reopen
# pkill -usr1 nginx


也可以下載nginx rpm 套件中的/etc/init.d/nginx 文件,修改路徑後即可使用:

# service nginx {start|stop|status|restart|reload|configtest|}


2. nginx.conf 設定檔

nginx 設定檔主要分成四部分:main(全域設定)、http( http 的通用設定)、server(虛擬主機設定)、location(符合url 路徑)。還有一些其他的配置段,如 event,upstream 等。

2.1 一般設定

user nginx
#指定執行nginx workre 進程的使用者和群組

worker_rlimit_nofile
#指定所有worker 進程能夠開啟的最大檔案數

worker_cpu_affinity
設定worker 流程​​的cpu 黏性,以避免進程在cpu 間切換帶來的效能消耗。如worker_cpu_affinity 0001 0010 0100 1000;(四核心)

worker_processes 4
worker 工作流程的數,這個值可以設定為與cpu 數量相同,如果開啟了ssl 和gzip,那麼可以適當增加此數值

worker_connections 1000
單一worker 程式能接受的最大並發連線數,放在event 區段中

error_log logs/error.log info
錯誤日誌的存放路徑和記錄層級

use epoll
使用epoll 事件模型,放在event 區段中

2.2 http 伺服器

server {}:
定義一個虛擬主機

listen 80;
定義監聽的位址和端口,預設監聽在本機所有位址上

##server_name name [...];

定義虛擬主機名,可以使用多個名稱,也可以使用正規表示式或通配符。

sendfile on

開啟 sendfile 呼叫來快速的回應客戶端

keepalive_timeout 65

長連線逾時時間,單位是秒。

send_timeout

指定回應客戶端的逾時時間

client_max_body_size 10m

允許客戶端請求的實體最大大小

#root path

設定請求url 所對應資源所在檔案系統上的根目錄

location [ = | ~ | ~* | ^~ ] uri { ... }
设置一个 uri 匹配路径
=:精确匹配
~:正则表达式匹配,区分字符大小写
~*:正则表达式匹配,不区分字符大小写
^~:uri 的前半部分匹配,且不实用正则表达式
优先级:
= > location 完整路径 > ^~ > ~ > ~* > location 起始路径 > location /

allow 和 deny
基于 ip 访问控制,如:

仅允许 192.168.0.0/24 网段客户端访问

allow 192.168.0.0/24;
deny all;
stub_status on
开启状态显式,仅能用于 location 中:
开启状态显式页面

location /status {
stub_status on;
allow 172.16.0.0/16;
deny all;
}


rewrite
url 重写,可以使用多种标记
例如:

rewrite ^/images/(.*\.jpg)$ /imgs/$1 break;
可用的 flag:
- last:重写完成后,继续匹配其他 rewrite 规则
- break:重写完成后不再继续匹配
- redirect:返回 302 重定向(临时重定向),客户端对重定向的 url 发起新的请求
- permanent:返回 301 重定向(永久重定向),客户端对重定向的 url 发起新的请求

一个 server 配置示例:

server {
 listen  80;
 server_name www.example.com;
 root /web/htdocs;

 location / {
  index index.html index.htm;
 }

 location /status {
  stub_status on;
  allow 10.0.0.0/8;
  deny all;
  access_log off;
}

2.3 ssl 的配置

启用一个 ssl 虚拟主机

server {
  listen 443;
  server_name example.com;

  root /apps/www;
  index index.html index.htm;

  ssl on;
  ssl_certificate /etc/nginx/ssl/nginx.crt;
  ssl_certificate_key /etc/nginx/ssl/nginx.key;

#  ssl_protocols sslv3 tlsv1 tlsv1.1 tlsv1.2;
#  ssl_ciphers all:!adh:!export56:rc4+rsa:+high:+medium:+low:+sslv2:+exp;
#  ssl_prefer_server_ciphers on;

}

其中 ssl_certificate 表示 ca 文件,ssl_certificate_key 表示密钥文件。

如果想把 http 请求强制转到 https,可以这样:

server {
listen  80;
server_name example.me;

return 301 https://$server_name$request_uri;
}


2.4 nginx 做负载均衡反向代理

nginx 做反向代理时,后端主机有多台,可以使用 upstream 定义一个后端主机池,在反向代理时直接使用主机池的名字。在 upstream 中可以定义负载均衡调度算法,权重,健康状态检测等参数。

例如:

upstream backend {
 server 172.16.0.1:80 weight=1 max-fails=3 fail_timeout=10;
 server 172.16.0.2:80 weight=1max-fails=3 fail_timeout=10;;
}


默认请求下,使用 round-robin 调度算法,并有健康状态检查和恢复主机的能力。

ningx 还可以使用这些算法:

ip_hash:基于源地址哈希,主要目的是会话保持
least_conn:基于最少活动连接进行调度
sticky:基于 cookie 进行会话绑定,nginx 会在客户端第一次访问时插入路由信息到 cookie 中,或者选择 cookie 中的某个字段的值作为键,以后每次请求将基于此信息进行调度
基于 cookie 的会话绑定共有 cookie,route 和 learn 三种。

例如,基于 cookie name 的调度:

upstream backend {
 server backend1.example.com;
 server backend2.example.com;

 sticky cookie srv_id expires=1h domain=.example.com path=/;
}


使用此主机组进行反向代理:

location / {
 proxy_pass http://backend;
 proxy_set_header host $host;
 proxy_set_haeder x-forwared-for $proxy_add_x_forwarded_for;
}


proxy_pass url 指定代理的后端主机,可以指定 "http" 或 "https" 协议,域名可以是 ip 地址,也可以是 upstream 池名字

如果代理指定的是一个 uri 地址,如 http://127.0.0.1/remote,那么将直接被代理至指定 uri,无论请求的 uri 是什么
如果代理指定的一个主机而没有 uri,如 http://127.0.0.1,客户端请求的uri将被传递至指定域名
如果 location 中使用模式匹配 url,那么 url 也会被传递至代理 url 的末端
如果 location 中使用了 uri 重写,那么 proxy_pass 会使用重写后的结果进行处理
proxy_set_header header value 对转发的报文首部进行修改

2.5 反向代理时的缓存相关设定

proxy_cache_path path [levels=levels] keys_zone=name:size

定义磁盘缓存路径,nignx 的缓存是以键值方式存放的,keys_zone 用于指定键存放的内存空间名字和大小,对应的值则存放在 path 指定的路径中。levels 可以指定缓存存放路径的级数和名称字符数。此设置只能在 http 段中定义。

如:

proxy_cache_path /var/cache/nginx/proxy levels=1:2 keys_zone=one:10m;


proxy_cache_valid [code ...] time 指定不同响应码的内容的缓存时间

如:

proxy_cache_valid 200 302 10m;
proxy_cache_valid 404  1m;
proxy_cache_valid any  1m;


proxy_cache_method method 定义哪些方法的请求结果可以被缓存,如:

proxy_cache_method get;
proxy_cache_method head;


proxy_cache name 指定使用预先定义的缓存空间用于缓存

2.6 fastcgi 代理的设置

使用 fastcgi 时,设置代理的方法同 porxy_pass 类似,同时还可以使用 fastcgi 缓存,设置的方法也和 proxy_cache 类似。

location ~ \.php$ {
 root   /web/htdocs;
 fastcgi_pass 127.0.0.1:9000;
 fastcgi_index index.php;
 fastcgi_param script_filename $document_root$fastcgi_script_name;
 include  fastcgi_params;
}


3. 一些常用内置变量

$arg_name:請求uri 中的name 參數至
$args:請求uri 的所有參數,和$query_string 相同
$uri:目前請求的uri,不含參數
$request_uri:請求的uri,帶完整參數
$host:http 請求封包中host 首部,如果沒有host 首部,則以處理此請求的虛擬主機的主機名稱替代
$hostname:nginx 服務運行在主機的主機名稱
$remote_addr:客戶端ip
$remote_port:客戶端port
$remote_user:使用使用者認證時客戶端使用者輸入的使用者名稱
$request_filename:使用者請求中的uri 經過本地root或alias 轉換後映射的本機的檔案路徑
$request_method:請求方法
$server_addr:伺服器位址
$server_name:伺服器名稱
$server_port:伺服器連接埠
$server_protocol:伺服器向客戶端發送回應時的協議,如http/1.1,http/1.0
$scheme:在請求中使用的scheme,如https://www.magedu.com/ 中的https
$http_name:匹配請求封包中的指定header,如$http_host 符合要求封包中的host 首部
$sent_http_name:符合回應封包中指定的header,例如$sent_content_type 符合回應封包中的content-type 首部
$status:回應狀態

以上是Nginx伺服器搭建與基本設定實例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除