nginx配置

nginx配置

nginx常用编译参数

对于nginx,如果使用源码安装,在进行./configure编译的时候,需要为其指定一些参数。

  • –prefix=PATH : 指定nginx的安装目录。默认 /usr/local/nginx

  • –conf-path=PATH : 设置nginx.conf配置文件的路径。nginx允许使用不同的配置文件启动,通过命令行中的-c选项。默认为prefix/conf/nginx.conf

  • –user=name: 设置nginx工作进程的用户。安装完成后,可以随时在nginx.conf配置文件更改user指令。默认的用户名是nobody。–group=name类似

  • –with-pcre : 设置PCRE库的源码路径,如果已通过yum方式安装,使用–with-pcre自动找到库文件。使用–with-pcre=PATH时,需要从PCRE网站下载pcre库的源码(版本4.4 – 8.30)并解压,剩下的就交给Nginx的./configure和make来完成。perl正则表达式使用在location指令和 ngx_http_rewrite_module模块中。

  • –with-zlib=PATH : 指定 zlib(版本1.1.3 – 1.2.5)的源码解压目录。在默认就启用的网络传输压缩模块ngx_http_gzip_module时需要使用zlib 。

  • –with-http_ssl_module : 使用https协议模块。默认情况下,该模块没有被构建。前提是openssl与openssl-devel已安装

  • –with-http_stub_status_module : 用来监控 Nginx 的当前状态

  • –with-http_realip_module : 通过这个模块允许我们改变客户端请求头中客户端IP地址值(例如X-Real-IP 或 X-Forwarded-For),意义在于能够使得后台服务器记录原始客户端的IP地址

  • –add-module=PATH : 添加第三方外部模块,如nginx-sticky-module-ng或缓存模块。每次添加新的模块都要重新编译(Tengine可以在新加入module时无需重新编译)

    config基本配置概览

Nginx的配置文件默认在Nginx程序安装目录的conf目录下,其中核心文件为nginx.conf,当然你也可以自己写配置文件,然后在nginx.conf中引用。

nginx.conf配置具体信息如下:

#定义Nginx运行的用户和用户组
user www www;
#nginx进程数,建议设置为等于CPU总核心数。
worker_processes 8;
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;
#进程文件
pid /var/run/nginx.pid;
#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
worker_rlimit_nofile 65535;
#工作模式与连接数上限
events
{
    #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
    use epoll;
    #单个进程最大连接数(最大连接数=连接数*进程数)
    worker_connections 65535;
}

#设定http服务器
http
{
    include mime.types; #文件扩展名与文件类型映射表
    default_type application/octet-stream; #默认文件类型
    #charset utf-8; #默认编码
    server_names_hash_bucket_size 128; #服务器名字的hash表大小
    client_header_buffer_size 32k; #上传文件大小限制
    large_client_header_buffers 4 64k; #设定请求缓
    client_max_body_size 8m; #设定请求缓
    sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
    autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
    tcp_nopush on; #防止网络阻塞
    tcp_nodelay on; #防止网络阻塞
    keepalive_timeout 120; #长连接超时时间,单位是秒

    #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;

    #gzip模块设置
    gzip on; #开启gzip压缩输出
    gzip_min_length 1k; #最小压缩文件大小
    gzip_buffers 4 16k; #压缩缓冲区
    gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
    gzip_comp_level 2; #压缩等级
    gzip_types text/plain application/x-javascript text/css application/xml;
    #压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
    gzip_vary on;
    #limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用

    upstream blog.ha97.com {
    #upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
    server 192.168.80.121:80 weight=3;
    server 192.168.80.122:80 weight=2;
    server 192.168.80.123:80 weight=3;
    }

    #虚拟主机的配置
    server
    {
        #监听端口
        listen 80;
        #域名可以有多个,用空格隔开
        server_name www.ha97.com ha97.com;
        index index.html index.htm index.php;
        root /data/www/ha97;
        location ~ .*.(php|php5)?$
        {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi.conf;
        }
        #图片缓存时间设置
        location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires 10d;
        }
        #JS和CSS缓存时间设置
        location ~ .*.(js|css)?$
        {
            expires 1h;
        }
        #日志格式设定
        log_format access '$remote_addr - $remote_user [$time_local] "$request" '
        '$status $body_bytes_sent "$http_referer" '
        '"$http_user_agent" $http_x_forwarded_for';
        #定义本虚拟主机的访问日志
        access_log /var/log/nginx/ha97access.log access;

        #对 "/" 启用反向代理
        location / {
            proxy_pass http://127.0.0.1:88;
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
            #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            #以下是一些反向代理的配置,可选。
            proxy_set_header Host $host;
            client_max_body_size 10m; #允许客户端请求的最大单文件字节数
            client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
            proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
            proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
            proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置
            proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k;
            #设定缓存文件夹大小,大于这个值,将从upstream服务器传
        }

        #设定查看Nginx状态的地址
        location /NginxStatus {
            stub_status on;
            access_log on;
            auth_basic "NginxStatus";
            auth_basic_user_file conf/htpasswd;
            #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
        }

        #本地动静分离反向代理配置
        #所有jsp的页面均交由tomcat或resin处理
        location ~ .(jsp|jspx|do)?$ {
            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;
        }
        #所有静态文件由nginx直接读取不经过tomcat或resin
        location ~ .*.    (htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
        { expires 15d; }
        location ~ .*.(js|css)?$
        { expires 1h; }
        }
}

nginx常用配置说明

nginx日志文件配置

关于日志文件的配置主要有两个属性log_format、access_log、error_log。

log_format

log_format为日志格式,其语法为:

copylog_format name format {format ... }

其中,name表示日志名字,format表示定义的格式样式。

log_format有一个默认的、无需配置的combined日志格式:

copylog_format combined '$remote_addr-$remote_user [$time_local]'
"$request"$status $body_bytes_sent
 "$http_referer" "$http_user_agent"

在日志格式中的变量主要有:

参数 说明 示例
$remote_addr 反向代理服务器的IP地址 127.0.0.1
$remote_user 远程客户端用户名称
$time_local 访问时间与时区 18/Jul/2012:17:00:01 +0800
$request 请求URL与HTTP协议 GET /article-10000.html HTTP/1.1
$status 请求状态,例如成功时状态为200,页面找不到时状态为404 200
$body_bytes_sent 发送客户端的文件主体内容大小 1000
$upstream_status upstream状态 200
$http_referer 访问来源 https://www.baidu.com/
$http_user_agent 客户浏览器的相关信息 Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C;
$ssl_protocol SSL协议版本 TLSv1
$ssl_cipher 交换数据中的算法 RC4-SHA
$upstream_addr 后台upstream的地址,即真正提供服务的主机地址 10.10.10.100:80
$request_time 整个请求的总时间 0.205
$upstream_response_time 请求过程中,upstream响应时间 0.002
$http_host 请求地址,即浏览器中你输入的地址(IP或域名) www.baidu.com 192.168.1.1

access_log

access_log主要用于记录nginx访问日志。其语法如下:

copyaccess_log path [foramt {buffer-size | off}

关闭日志方法:access_log off。

使用默认combined格式记录日志:access_log path。

使用自定义格式记录日志,首先定义一个log_format,如log_format customformat ‘具体配置’。

access_log path customformat buffer=32k。

结尾的buffer代表缓冲区大小。

error_log

与access_log不同的是,error_log主要记录nginx运行过程中的错误日志。其语法如下

copyerror_log <FILE> <LEVEL>

其中参数含义如下:

  • FILE:代表日志文件存放目录。
  • LEVEL:错误日志级别。

常见的错误日志级别有:debug | info | notice | warn | error | crit | alert | emerg ,级别越高记录的错误信息越少。对于我们而言,一般用到的为warn,error,crit。

nginx压缩输出

nginx压缩输出使用的技术为gzip(GNU-ZIP)压缩技术。经过gzip压缩后的页面大小可以变为原来的30%以下,压缩页面后可以降低用户在浏览页面时下载资源的时间,但gzip有个明显的去诶按,就是需要服务端与客户端同步支持gzip,即服务器压缩,浏览器解压。目前IE、Chrome等主流浏览器均具备解压gzip的功能。

nginx中的gzip指令如下:

开启或关闭gzip

copygzip on|off

设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流

copygzip_buffers number size

设置gzip压缩比例

copygzip_comp_level 1..9

设置允许压缩的页面最小字节数,当页面超过该数值时才进行压缩,其默认为0,即所有页面都进行压缩

copygzip_min_length length

nginx作为静态服务器

nginx其根本上是一个HTTP服务器,可以将服务器撒花姑娘的静态资源文件(如HTML、JS、Image)通过HTTP协议展现给客户端。

copyserver {
    listen 80; # 端口号
    location / {
        root /usr/share/nginx/html; # 静态文件路径
    }
}

nginx负载均衡与反向代理

负载均衡

负载均衡就是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种负载分担技术,将外部送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。

常见的复杂均衡主要有:

  • 用户手动选择:通过用户手动选择线路。
  • DNS轮询:为域名添加多个解析记录。
  • 四/七层负载均衡设备:硬件实现负载均衡,如F5。软件实现为LVS。
  • Nginx负载均衡

反向代理

反向代理是指以代理服务器来接受Internet上的连接请求,然后将请求发给内部网路上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

具体实现

在nginx中,通过Upstream可以设置一组在proxy_pass和fastcgi_pass指令中使用的代理服务器,默认的负载均衡方式为轮询,Upstream模块中的Server指令用于指定后端服务器的名称和参数,服务器的名称可以是一个域名、一个IP地址、端口号或UNIX Socket。

而在server{}虚拟主机内,可以通过proxy_pass和fastcgi_pass指令设置进行反向代理的服务器集群。

proxy_set_header指令用于在向反向代理的后端Web服务器发起请求时添加指定的Header头信息。

当后端Web服务器上有多个基于域名的虚拟主机时,要通过添加Header头信息Host,用于指定请求的域名,这样后端Web服务器才能识别该方向代理访问请求由哪一个虚拟主机来处理。

在使用方向代理后,连接通过代理服务器链接到目标服务器后,如果在目标服务器中存在获取用户真实IP的代码(比如,Java、PHP等后台语言)就会失效,这时服务器获取的是代理服务器的IP。如果要获取真实IP,需要在nginx反向代理配置里添加Header头信息:X-Forwarded-For,让目标服务器能够获取用户的真实IP。

具体配置如下:

copyupstream baidu.com {
    # weight 设置权重
      server 127.0.0.1:8881 weight=3;
      server 127.0.0.1:8882;
      server 127.0.0.1:8888;
}
server{ 
    listen 80; 
    server_name baidu.com; 
    location / { 
        proxy_pass         http://baidu.com; 
        proxy_set_header   Host             $host; 
        #获取真实IP设置
        proxy_set_header   X-Real-IP        $remote_addr; 
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for; 
    } 
}

转自编程常青树 https://jiangliuhong.gitee.io/server-nginx-peizhi/


   转载规则


《nginx配置》 xyj 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录