Nginx的基本配置--示例
配置文件语法
nginx是模块化的系统,整个系统是分成一个个模块的。每个模块负责不同的功能。如果不用某个模块的话,也可以去掉,可以让nginx更加轻量化。
要用的模块已经被编译进nginx了,成为nginx的一部分了,那要怎么用这些模块呢?那就得通过配置文件,这跟传统的linux服务差不多,都是通过配置文件来改变功能。nginx的模块是通过一个叫指令(directive)的东西来用的。整个配置文件都是由指令来控制的。nginx也有自己内置的指令,比如events, http, server, 和 location等,下面会进行详细解释。
如果是包管理方式安装的,配置文件默认在/etc/nginx/nginx.conf
;如果是源码安装的,配置文件则在configure
的时候指定的--conf-path
下。
nginx的配置文件分为两类。一类是主配置文件,用来设定nginx的基本和通用配置。域名的配置文件放在指定的目录下,避免主配置文件逻辑过于复杂,也方便对域名的配置文件进行管理。
配置文件变量详解
变量 | 解释 |
---|---|
$remote_addr | 获取客户端ip |
$binary_remote_addr | 客户端ip(二进制) |
$remote_port | 客户端port,如:50472 |
$remote_user | 已经经过Auth Basic Module验证的用户名 |
$host | 请求主机头字段,否则为服务器名称,如:blog.xiaosige.com |
$request | 用户请求信息,如:GET ?a=1&b=2 HTTP/1.1 |
$request_filename | 当前请求的文件的路径名,由root或alias和URI request组合而成,如:/2013/81.html |
$status | 请求的响应状态码,如:200 |
$body_bytes_sent | 响应时送出的body字节数数量。即使连接中断,这个数据也是精确的,如:40 |
$content_length | 等于请求行的“Content_Length”的值 |
$content_type | 等于请求行的“Content_Type”的值 |
$http_referer | 引用地址 |
$http_user_agent | 客户端agent信息,如:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36 |
$args | 与$query_string相同 等于当中URL的参数(GET),如a=1&b=2 |
$document_uri | 与uri相同 这个变量指当前的请求URI,不包括任何参数(见args) 如:/2013/81.html |
$document_root | 针对当前请求的根路径设置值 |
$hostname | 如:centos53.localdomain |
$http_cookie | 客户端cookie信息 |
$cookie_COOKIE | cookie COOKIE变量的值 |
$is_args | 如果有$args参数,这个变量等于”?”,否则等于”",空值,如? |
$limit_rate | 这个变量可以限制连接速率,0表示不限速 |
$query_string | 与$args相同 等于当中URL的参数(GET),如a=1&b=2 |
$request_body | 记录POST过来的数据信息 |
$request_body_file | 客户端请求主体信息的临时文件名 |
$request_method | 客户端请求的动作,通常为GET或POST,如:GET |
$request_uri | 包含请求参数的原始URI,不包含主机名,如:/2013/81.html?a=1&b=2 |
$scheme | HTTP方法(如http,https),如:http |
$uri | 这个变量指当前的请求URI,不包括任何参数(见$args) 如:/2013/81.html |
$request_completion | 如果请求结束,设置为OK. 当请求未结束或如果该请求不是请求链串的最后一个时,为空(Empty),如:OK |
$server_protocol | 请求使用的协议,通常是HTTP/1.0或HTTP/1.1,如:HTTP/1.1 |
$server_addr | 服务器IP地址,在完成一次系统调用后可以确定这个值 |
$server_name | 服务器名称,如:blog.xiaosige.com |
$server_port | 请求到达服务器的端口号,如:80 |
主配置文件总览
#定义运行nginx的用户
user nobody;
#启动进程,通常设置成和cpu的数量相等
worker_processes 1;
#全局错误日志及PID文件
#日志的级别debug info notice warn error crit alert emerg 递增-->
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
#工作模式及连接数上限
events {
#epoll是多路复用IO(I/O Multiplexing)中的一种方式,
#仅用于linux2.6以上内核,可以大大提高nginx的性能
use epoll;
#单个后台worker process进程的最大并发链接数
worker_connections 1024;
# 并发总数是 worker_processes 和 worker_connections 的乘积
# 即 max_clients = worker_processes * worker_connections
# 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4 为什么
# 为什么上面反向代理要除以4,应该说是一个经验值
# 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000
# worker_connections 值的设置跟物理内存大小有关
# 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数
# 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右
# 我们来看看360M内存的VPS可以打开的文件句柄数是多少:
# $ cat /proc/sys/fs/file-max
# 输出 34336
# 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内
# 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置
# 使得并发总数小于操作系统可以打开的最大文件数目
# 其实质也就是根据主机的物理CPU和内存进行配置
# 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。
# ulimit -SHn 65535
}
#负责HTTP服务器相关属性的配置
http {
#设定mime类型,类型由mime.type文件定义
include mime.types;
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"';
access_log logs/access.log main;
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
#以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
#tcp_nopush on;
#连接超时时间
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
#包含/etc/nginx/sites-enabled下的所有以.conf结尾的配置文件
include /etc/nginx/sites-enabled/*.conf;
#包含/etc/nginx/conf.d下的所有配置文件
include /etc/nginx/conf.d/*;
#开启gzip压缩
gzip on;
gzip_disable "MSIE [1-6].";
#设定请求缓冲
client_header_buffer_size 128k;
large_client_header_buffers 4 128k;
#负载均衡模块 weight(权重)模式 默认模式
upstream project1{
#按权重将请求代理至指定服务的指定端口,weight数值越大接受的请求越多
server www.do90.cn:82 weight=2;
server www.do90.com:83 weight=1;
server blog.do90.cn:84 weight=5;
}
#负载均衡模块 ip_hash模式
upstream project2{
#按照ip的hash结果分配服务器,该ip会固定访问同一个后端服务器,可以解决动态网页存在的session共享问题
ip_hash;
server www.do90.cn:port1 ;
# 当前服务暂时不参加负载均衡
server www.do90.com:port1 down;
# 作为预留备份机器,当其它机器都忙或者故障的时候才会启用
server blog.do90.cn:port1 backup;
# 可定义最大失败次数和失败时间
server www.do90.cn:port1 max_fails=3 fail_timeout=20s;
}
#负载均衡模块 fair模式 需要安装upstream_fair模块
upstream project3{
fair;
server www.do90.cn:8080;
server www.do90.com:8082;
}
#负载均衡模块 url_hash模式 需要安装url_hash模块
upstream project4{
server 10.0.0.10:7777;
server 10.0.0.11:8888;
hash $request_uri;
hash_method crc32;
}
#设定虚拟主机配置
server {
#侦听80端口
listen 80;
#定义使用 www.do90.cn访问
server_name www.do90.cn;
#定义服务器的默认网站根目录位置
root html;
#设定本虚拟主机的访问日志
access_log logs/nginx.access.log main;
#默认请求
location / {
#定义首页索引文件的名称
index index.php index.html index.htm;
}
# 定义错误提示页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
#静态文件,nginx自己处理
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
#过期30天,静态文件不怎么更新,过期可以设大一点,
#如果频繁更新,则可以设置得小一点。
expires 30d;
}
#PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
#禁止访问 .htxxx 文件
location ~ /.ht {
deny all;
}
}
}
域名配置文件
在主配置文件中会有include参数,include /etc/nginx/sites-enabled/*.conf;这个文件夹中的所有以.conf结尾的,都会被nginx作为配置文件。下方有几个例子。
正常html访问
server { listen 80; server_name example.com; index index.html; root /var/www; access_log /var/log/nginx/jdnn_access.log combined; error_log /var/log/nginx/jdnn_error.log warn; }
配置php请求转发
server { listen 80; server_name m.example.com; root /var/www/; index index.html index.php; if (!-e $request_filename) { rewrite ^/(.*) /index.php/$1 last; } location ~ ^(.+\.php)(.*)$ { fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_script_name; } access_log /var/log/nginx/admin_access.log combined; error_log /var/log/nginx/admin_error.log warn; listen 443 ssl http2; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/pkgame.net/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; }
配置python后端请求转发
server { listen 80; server_name www.example.com; location / { root html; index index.html index.htm; include uwsgi_params;#加载uWSGI配置参数 uwsgi_pass 127.0.0.1:3031;#请求转发至”127.0.0.1:3031″端口上,即uWSGI服务器 } access_log /var/log/nginx/www_access.log combined; error_log /var/log/nginx/www_error.log warn; }