Nginx 服务器配置和详解
Posted whylei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx 服务器配置和详解相关的知识,希望对你有一定的参考价值。
目录
nginx 服务器配置和详解
Nginx 扮演 web 开发的服务端入口控制的角色,相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率。这需要开发人员对其配置有一定程度的了解,主要用到的是负载均衡和反向代理这两项功能。
Nginx 模板配置
user www www;
worker_processes 2;
pid /var/run/nginx.pid;
#[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx.error_log info;
events {
worker_connections 2000;
# use [ kqueue | epoll | /dev/poll | select | poll ];
use kqueue;
}
http {
include conf/mime.types;
default_type application/octet-stream;
log_format main ‘$remote_addr - $remote_user [$time_local] ‘
‘"$request" $status $bytes_sent ‘
‘"$http_referer" "$http_user_agent" ‘
‘"$gzip_ratio"‘;
log_format download ‘$remote_addr - $remote_user [$time_local] ‘
‘"$request" $status $bytes_sent ‘
‘"$http_referer" "$http_user_agent" ‘
‘"$http_range" "$sent_http_content_range"‘;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
gzip on;
gzip_min_length 1100;
gzip_buffers 4 8k;
gzip_types text/plain;
output_buffers 1 32k;
postpone_output 1460;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
send_lowat 12000;
keepalive_timeout 75 20;
#lingering_time 30;
#lingering_timeout 10;
#reset_timedout_connection on;
server {
listen one.example.com;
server_name one.example.com www.one.example.com;
access_log /var/log/nginx.access_log main;
location / {
proxy_pass http://127.0.0.1/;
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;
client_max_body_size 10m;
client_body_buffer_size 128k;
client_body_temp_path /var/nginx/client_body_temp;
proxy_connect_timeout 70;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_send_lowat 12000;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_temp_path /var/nginx/proxy_temp;
charset koi8-r;
}
error_page 404 /404.html;
location = /404.html {
root /spool/www;
}
location /old_stuff/ {
rewrite ^/old_stuff/(.*)$ /new_stuff/$1 permanent;
}
location /download/ {
valid_referers none blocked server_names *.example.com;
if ($invalid_referer) {
#rewrite ^/ http://www.example.com/;
return 403;
}
#rewrite_log on;
# rewrite /download/*/mp3/*.any_ext to /download/*/mp3/*.mp3
rewrite ^/(download/.*)/mp3/(.*)..*$
/$1/mp3/$2.mp3 break;
root /spool/www;
#autoindex on;
access_log /var/log/nginx-download.access_log download;
}
location ~* .(jpg|jpeg|gif)$ {
root /spool/www;
access_log off;
expires 30d;
}
}
}
上述模板来自于 Nginx 官方示例
Nginx 模块说明
核心模块
控制整个 Nginx 的基本功能和程序配置
主模块
user www www;
worker_processes 2;
error_log /var/log/nginx-error.log info;
...
user user [group]
:定义运行 Nginx 的用户和其所在组,该项默认ser nobody nobody
可以使用默认配置。在 linux 系统上,一切皆文件,每个文件都有其访问权限,如果访问了权限外的文件,客户端会接受到服务端 403 错误。不设置group
则组名与用户名一致。worker_processes number | auto
:工作进程数,一般与 cpu 核心数保持一致,可以设置为 auto,Nginx 可以自动调整为最佳个数。error_log file [level]
:日志存放目录,level
日志输出等级pid file
:进程 id 存储位置worker_cpu_affinity
:工作进程与 cpu 绑定
worker_processes 4;
\1表示对应cpu核心工作
worker_cpu_affinity 0001 0010 0100 1000;
worker_rlimit_nofile number
:一个工作进程可打开的最大文件数,设置该值后worker_connections
不能超过该值,理论上这个值是最多打开文件数(ulimit -n
)与 Nginx 工作进程相除。
event 模块
events {
use kqueue;
worker_connections 2048;
}
...
use method
:事件模型,Linux 系统下设置有效,默认会找出最适合系统的事件模型,常用use epoll
worker_connections number
:设置最大并发连接数,该值不仅仅是与客户端连接。通过worker_connections
和worker_proceses
可以计算出max_clients = worker_processes * worker_connections
,作为反向代理,max_clients = worker_processes * worker_connections/4
。multi_accept on | off
:关闭时一个进程只接受一个连接,开启时尽可能接受连接,连接放进监听队列
http 模块
配置 http 服务相关
include
:定义文件扩展名,该文件包含类型映射表default_type
:默认解析类型limit_req_zone key zone=name:size rate=rate
:如limit_req_zone $binary_remote_addr zone=limit:10m rate=1r/s;
,10m 缓存,每秒仅允许统一 ip 访问一次 超出频率或者缓存超出则返回 503sendfile on | off
:开启后 Nginx 使用零拷贝的方式输出文件,一般设置为 on,对于磁盘 IO 重负债应用时可以设置 offtcp_nopush on | off
:激活 tcp_nopush 参数可以允许把 http response header 和文件的开始放在一个文件里发布或者发送一个满包的文件,传输大量数据有利,只有 sendfile 起效是才有作用tcp_nodelay on | off
:启用后会禁用 Nagle 算法,尽快发送数据,Nginx 只会针对 keep-alive 状态的起作用,该选项看似与tcp_nopush
矛盾,但同时启用产生的效果是先填满包在尽快发送keepalive_timeout
:连接超时时间
upstream 模块
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
#server 192.168.1.116 backup;
server unix:/tmp/backend3;
server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
}
server {
location / {
proxy_pass http://backend;
}
}
该模块主要完成负载均衡功能
server address [parameters]
weight
:代表权重,权重越高被分配的记录越大max_conns
:限制最大活动连接数,默认为 0,表示没有限制fail_timeout=time
:与服务器通信失败时长,默认 10 smax_fails
:设置在fail_timeout
内连接到主机的失败次数,超过该次数则认为该主机不可用
server 模块
server {
server_name ~^(www.)?(.+)$;
location / {
root /sites/$2;
}
}
listen
:可设置为只是监听 ip 地址,或者端口,也可以是两者都有,也可以是主机名称
listen 127.0.0.1:8000;
listen 127.0.0.1;
listen 8000;
listen *:8000;
listen localhost:8000;
server_name name ...
:主机名称,可以使用通配符,多个主机空格隔开
location 模块
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* .(gif|jpg|jpeg)$ {
[ configuration E ]
}
该模块完成对请求分类处理
=
开头表示精确匹配- 单个
/
表示通用匹配任何请求都能匹配到 ^~
表示匹配 url 路径~
表示区分大小写的正则匹配~*
表示不区分大小写的正则匹配!~
表示区分大小写的正则不匹配!~*
表示不区分大小写的正则不匹配proxy_pass URL
:代理服务器地址proxy_set_header field value
:代理请求头设置,Nginx 可以重新定义或附加请求表头
//主机名称
proxy_set_header Host $host;
//真实请求 ip,如果不存在该字段,则该$proxy_add_x_forwarded_for变量等于该$remote_addr变量。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
以上是关于Nginx 服务器配置和详解的主要内容,如果未能解决你的问题,请参考以下文章