nginx配置文件详解

246 阅读3分钟
  1. 虚拟主机

概念:host  主机头

网站访问过程: 域名 --> DNS解析  --> 服务器IP --> web server(Nginx) --> 域名:端口  --> nginx.conf  --> 虚拟主机 --> port --> server_name

配置文件结构:

nginx.conf 

#user  nobody;
worker_processes  auto;
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    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        on;
    #tcp_nopush     on;


    #keepalive_timeout  0;
    keepalive_timeout  65;
    #gzip  on;


    server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;




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


    #server {
    # ......
    #}


    #server {
    # ......
    #}


    include vhosts/*.conf;
}

虚拟主机就是每一个  server { } 配置段

配置示例:

mkdir  /usr/local/nginx/conf/vhosts
vi /usr/local/nginx/conf/vhosts/123.conf  #内容如下


    server {
        listen       8080;
        server_name  www.123.com;
        error_log    /usr/local/nginx/logs/123_com crit;
        access_log   /usr/local/nginx/logs/123_com/access.log main;
        location / {
            root   /tmp/123.com;
            index  index.html index.htm;
        }
   }

 

默认虚拟主机

任何域名解析过来,都会访问到那个虚拟主机里,就是默认虚拟主机,相同端口的第一个虚拟主机为默认虚拟主机,还可以手动配置  default_server

listen  80  default_server;

安全考虑,默认虚拟主机禁止访问,增加配置

deny all;

 日志配置

错误日志  error_log

配置参数格式:error_log /path/to/log level;


Nginx错误日志级别
常见的错误日志级别有debug | info | notice | warn | error | crit | alert | emerg
级别越高记录的信息越少,如果不定义,默认级别为error.


它可以配置在main、http、server、location段里。


如果在配置文件中定义了两个error_log,在同一个配置段里的话会产生冲突,所以同一个段里只允许配置一个error_log。
但是,在不同的配置段中出现是没问题的。


Nginx错误日志示例
error_log  /var/log/nginx/error.log crit;


如果要想彻底关闭error_log,需要这样配置
error_log /dev/null;

访问日志 access_log

示例1 获取用户真实IP

    log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]'
    '$host "$request_uri" $status'
    '"$http_referer" "$http_user_agent"';

示例2

    log_format main '$remote_addr [$time_local] '
    '$host "$request_uri" $status "$request"'
    '"$http_referer" "$http_user_agent" "$request_time"';

  若不配置log_format或者不在access_log配置中指定log_format,则默认格式为:

    '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent";
变量说明
$remote_addr客户端(用户)IP地址
$status请求状态码,如200,404,301,302等
$request请求方式(GET或者POST等)+URL(包含requestmethod,request_method,host,$request_uri)
$http_user_agent用户浏览器标识
$http_host请求的url地址(目标url地址)的host
$host等同于$http_host
$http_referer来源页面,即从哪个页面转到本页,如果直接在浏览器输入网址来访问,则referer为空
$uri请求中的当前URI(不带请求参数,参数位于args),不同于浏览器传递的args),不同于浏览器传递的request_uri的值,它可以通过内部重定向,或者使用index指令进行修改。
$document_uri等同于$uri
$request_uriuri多了参数,即uri多了参数,即uri+$args
$http_x_forwarded_for如果使用了代理,这个参数会记录代理服务器的ip和客户端的ip

日志切割

  在/etc/logrotate.d/下创建nginx文件,内容为:

vim nginx


/usr/local/nginx/logs/*log {
    daily
    rotate 30
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        /bin/kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid 2>/dev/null) 2>/dev/null
    endscript
}

执行命令查看配置的日志切割文件是否正常

logrotate -f /etc/logrotate.d/nginx

说明:

  1. nginx日志在/data/logs/目录下面,日志名字以log结尾

2) daily表示每天切割

3) rotate 30表示日志保留30天

4) missingok表示忽略错误

5) notifempty表示如果日志为空,不切割

6) compress表示压缩

7) sharedscripts和endscript中间可以引用系统的命令

8) postrotate表示当切割之后要执行的命令

 

SSL配置

如果你自己有域名,去申请一个免费的ssl证书 freessl.cn

配置:

    listen 443 ssl;    
    ssl_certificate server.crt;
    ssl_certificate_key server.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ALL:!DH:!EXPORT:!RC4:+HIGH:+MEDIUM:!eNULL;
    ssl_prefer_server_ciphers on;




 443端口为ssl监听端口。
 ssl on表示打开ssl支持。
 ssl_certificate指定crt文件所在路径,如果写相对路径,必须把该文件和nginx.conf文件放到一个目录下。
 ssl_certificate_key指定key文件所在路径。
 ssl_protocols指定SSL协议。
 ssl_ciphers配置ssl加密算法,多个算法用:分隔,ALL表示全部算法,!表示不启用该算法,+表示将该算法排到最后面去。
 ssl_prefer_server_ciphers 如果不指定默认为off,当为on时,在使用SSLv3和TLS协议时,服务器加密算法将优于客户端加密算法。

反向代理

  1. PC访问web服务,并不知道访问的是代理服务器,PC以为代理服务器就是web服务器。
  2. 代理服务器将web服务器页面缓存到本地,当PC访问时直接反馈给PC页面
场景1:
域名没有备案,可以把域名解析到香港一台云主机上,在香港云主机做个代理,而网站数据是在大陆的服务器上

示例1:
server
{
    listen 80;
    server_name 123.com;
    
    location /
    {
        proxy_pass http://123.23.13.11/;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}


记录真实用户IP信息
log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]'
                           '$host "$request_uri" $status'
                           '"$http_referer" "$http_user_agent"';
access_log  /var/log/nginx/access.log  combined_realip;

负载均衡

upstream www {
        server 172.37.150.109:80 weight=50 max_fails=3 fail_timeout=30s;
        server 172.37.150.101:80 weight=100;
        server 172.37.150.110:80 down;
        server 172.37.150.112:80 backup;
}
server
{
    listen 80;
    server_name www.123.com; ###域名
    location / {
        proxy_pass http://www/; ###上面upstream定义的www模块
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

说明:down,表示当前的server不参与负载均衡;
weight:权重,数值越高权重越高,访问的连接越多
backup:为预留的机器,当其他的server(非backup)出现故障或者忙的时候,才会请求backup机器;
max_fails:允许请求失败的次数,默认为1。当失败次数达到该值,就认为该机器down掉了。 失败的指标是由proxy_next_upstream模块定义,其中404状态码不认为是失败。
fail_timeount:定义失败的超时时间,也就是说在该时间段内达到max_fails,才算真正的失败。默认是10秒。