Nginx配置文件

安装时的配置文件
#user  nobody;
#nginx进程,一般数值为cpu核数
worker_processes  1;
#错误日志存放目录
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#进程pid存放位置
#pid        logs/nginx.pid;

#工作模式及连接数上限
events {
    #单个后台worker process进程的最大并发链接数
    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"';
    #nginx访问日志
    #access_log  logs/access.log  main;
    #开启高效传输模式   
    sendfile        on;
    #激活tcp_nopush参数可以允许把httpresponse header和文件的开始放在一个文件里发布, 积极的作用是减少网络报文段的数量
    #tcp_nopush     on;
    #连接超时时间,单位是秒
    #keepalive_timeout  0;
    keepalive_timeout  65;
    #开启gzip压缩功能
    #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;
        }
        #错误页面
        #error_page  404              /404.html;
        # 将服务器错误页面重定向到静态页面/50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }        

       
        #代理PHP脚本到Apache上监听127.0.0.1:80
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

   
        #将PHP脚本传递到正在监听127.0.0.1:9000的FastCGI服务器
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        #如果Apache的文档根目录与nginx的根目录一致,则拒绝访问.htaccess文件
        #location ~ /\.ht {
        #    deny  all;
        #}
    }



    #另一个虚拟主机,混合使用IP、名称和基于端口的配置
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;
    #    服务的证书
    #    ssl_certificate      cert.pem;
    #    服务端key
    #    ssl_certificate_key  cert.key;
    #    会话缓存
    #    ssl_session_cache    shared:SSL:1m;
    #    会话超时时间
    #    ssl_session_timeout  5m;
    #    #加密算法
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    启动加密算法
    #    ssl_prefer_server_ciphers  on;

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

使用中的配置文件(所有ip,域名,路径皆为虚构)
#user  nobody;
worker_processes  2;
error_log  logs/error.log;
pid  logs/nginx.pid;

#最大文件打开数(连接),可设置为系统优化后的ulimit -HSn的结果
worker_rlimit_nofile 360000;

events {
    #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
    use epoll;
    #单个后台worker process进程的最大并发链接数
    worker_connections 100000;
    #是否串行处理连接
    multi_accept off;
}

http {
    #文件扩展名与类型映射表
    include    mime.types;
    #默认文件类型
    default_type  application/octet-stream;
    #设定请求缓存 
    #户端请求的最大可接受体大小,由行表示
    client_max_body_size 50m;
    #服务器名字的hash表大小
    server_names_hash_bucket_size 256;
    #客户机的请求头设置大小,对于绝大多数请求,1K的缓冲区大小就足够了
    client_header_buffer_size 256k;
    #用来指定客户端请求中较大的消息头的缓存最大数量和大小
    large_client_header_buffers 4 256k;
    
    #用于配置转发至tomcat后;tomcat获取客户端正式ip
    #允许重新定义和添加一些将被传输到代理服务器的请求头行。作为值,可以使用文本、变量及其组合。
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Real-Port $remote_port;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
    #解决js跨域的问题
    #增加头标
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Headers X-Requested-With;
    add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
    
    #指定客户机请求体缓冲区大小。
    client_body_buffer_size 256k;
    #客户机的请求头设置读取超时。
    client_header_timeout 3m;
    #客户机的请求体设置读取超时。
    client_body_timeout 3m;
    #客户端分配响应超时时间。
    send_timeout 3m;
    #访问日志存放路径
    access_log   no;
    #客户端连接保持活动的超时时间,在超过这个时间之后服务器会关闭该链接。
    keepalive_timeout  0;
    #修改或隐藏Nginx的版本号
    server_tokens off;
    #虚拟主机配置
    server {
    #listen指令指定所包含的服务器接受的地址和端口。可以只指定地址、端口或服务器名作为地址      
    listen       80;
    #e用来指定ip地址或者域名,多个域名之间用空格分开
    server_name  localhost;
    #对 "/gzh" 启用反向代理
    location /gzh
    {
        #根据表达式来更改URI,或者修改字符串。注意重写表达式只对相对路径有效。
        #此处是将/gzh以前的地址替换成http://weixin.qq.com/q/xxx
        rewrite ^ http://weixin.qq.com/q/xxx;
    }
    
    location /test {
        default_type text/html;
        return 200 "207_80";
    }
    
    location / {
        default_type text/html;
        #根据规则的执行情况,返回一个状态值给客户端。
        return 200 "207_80";
    }
    location /status                                                                                       
    {                                                                                                
        #这个模块能够获取Nginx自上次启动以来的工作状态,此模块非核心模块,需要在编译的时候手动添加编译参数                                               
        stub_status on;        
        #日志                                                                            
        access_log /usr/local/nginx/logs/status.log;                                                                                     
    }      
    location /lua{
        default_type text/html;
        content_by_lua_file /usr/local/op/code/test.lua;
    }
    location /comm{
        default_type text/html;
        if ( $request_uri ~* /comm/gzhqr ) {
            content_by_lua_file /usr/local/op/code/redisget.lua;
        }
        proxy_pass http://192.168.1.209;
    }
    
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}
    
server
{
    listen 192.168.88.100:8081;
    server_name www.cs.cc;
    default_type 'text/html';
    charset utf-8;
    # 日志级别
    error_log  logs/error.log info;    
    location /test {
        default_type text/html;
        return 200 "207_8081";
    }
    location /luac
    {
        default_type text/html;
        #lua_code_cache off;
        #$request_uri就是完整url中刨去最前面$host剩下的部分,比如http://www.baidu.com/pan/beta/test1?fid=3的就是/pan/beta/test1?fid=3
        #~* /devc/gzhqr表示含有/devc/gzhqr为true
        if ( $request_uri ~* /devc/test ) {
            content_by_lua_file /usr/local/op/lualib/tcode/test1.lua;
        }
    }
    location / {
        root   html;
        index  index8081.html index8081.htm;
    }
}


server {
    listen    8085;
    listen    443 ssl;
    #填写绑定证书的域名
    server_name www.cs.cc;
    #为服务器启用HTTPS。
    #ssl on;
    ssl_certificate /usr/local/op/nginx/conf/1_www.cs.cc_bundle.crt;
    ssl_certificate_key /usr/local/op/nginx/conf/2_www.cs.cc.key;
    ssl_session_timeout 5m;
    #指令启用所指示的协议。
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    #描述了允许的密码。密码以OpenSSL支持的格式分配
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    #要求协议SSLv3和TLSv1服务器密码优先于客户机的密码。
    ssl_prefer_server_ciphers on;
    charset utf-8;
    resolver 114.114.114.114;
    #日志级别
    error_log  logs/error.log info;    
    
    #网页
    location ~/social_security_homepage.html {
        rewrite ^(.*)$ /socialstop.html break;
    }
    #网络资源路径
    location /h5/huo/images/
    {
        proxy_pass  http://192.168.1.209:3000/images/;
    }
    #地址
    location /h5/
    {
        proxy_pass http://192.168.1.209:3000/;
    }
    
    #本地路径
    location /upload/file/
    {
        root /opt/nci/NCI_DOWN/;
    }
    if ($request_uri ~* /wxapp/sign/)
    {
        rewrite ^/(.*) http://weixin.qq.com/r/xxx? permanent;
    }
    
    #老管理平台图片的重写
    if ($request_uri ~* /download/downLoad.do\?loadFile=/ITCT_Mng/image)
    {   
        rewrite ^/(.*) https://www.cs.cc/upload/file$argloadFile? permanent;
    }
    
    
    
    #管理平台的资源转发
    if ($request_uri ~* ^(/PRO_GLPT/))
    {
        rewrite ^/PRO_GLPT/(.*)$ /glpt/$1 last;
        #没有匹配上返回403 状态码为444(此状态码是非标准的),那么直接关闭此TCP连接
        #return code
        #return code text  因为要带响应内容,因此code不能是具有跳转功能的30x
        #return code URL    此时URI可以为URI做内部跳转,也可以是具有“http://”或者“https://”等协议的绝对URL,直接返回客户端,而code是30x(301, 302, 303, 307,308)
        #return URL 此时code默认为302,而URL必须是带“http://”等协议的绝对URL
        return 403;
    }
    
    location /glpt/
    {
        proxy_pass http://192.168.1.209:8088/PRO_GLPT/;
        proxy_redirect http:// https://;
        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_set_header X-Forwarded-Proto  $scheme;
        proxy_next_upstream error timeout invalid_header;
    }
    if ($request_uri ~* ^(/REDIS/))
    {
        rewrite ^/REDIS/(.*)$ /redis/$1 last;
    }
    
    location /gitblit
    {
        proxy_pass http://192.168.1.209:10101/;
        proxy_redirect http:// https://;
        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_set_header X-Forwarded-Proto  $scheme;
        proxy_next_upstream error timeout invalid_header;
    }
    
    
    location /luac
    {
        default_type text/html;
        #lua_code_cache off;
        if ( $request_uri ~* /devc/gzhqr ) {
            content_by_lua_file /usr/local/op/lualib/tcode/gzh_info.lua;
            #过期时间30天
            expires 30d;
        }
    }
    
    location /comm
    {
        default_type text/html;
        #设置变量
        set $lable 0;
        if ($request_uri ~* /main.*/homeinfo) {
            set $lable 1;
            content_by_lua_file /usr/local/op/lualib/tcode/busi/main/main.lua;
        }
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Real-Port $remote_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://192.168.1.207:8089/TKB_COMMON;
    }
    #维护中的页面
    location =/stoptaking.html
    { 
        #expires -1;
        add_header    Cache-Control no-store ;
        index stoptaking.html;
    }
}
  • 关于最大并发数

并发总数是worker_processesworker_connections 的乘积,即

max_clients = worker_processes * worker_connections

在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4 为什么,为什么上面反向代理要除以4,应该说是一个经验值,根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:2 * 100000= 200000,worker_connections 值的设置跟物理内存大小有关,因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数,而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右,我们来看看4G内存的VPS可以打开的文件句柄数是多少:,

$ cat /proc/sys/fs/file-max
结果是373519

输出 373519,200000 < 373519,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内,所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置,使得并发总数小于操作系统可以打开的最大文件数目,其实质也就是根据主机的物理CPU和内存进行配置,当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。

  • 重定向问题
 rewrite regex replacement  [flag];
 rewrite 正则表达式 替换URL 参数

如果rewrite同一个上下文中有多个这样的正则,匹配会依照rewrite指令出现的顺序先后依次进行下去,匹配到一个之后并不会终止,而是继续往下匹配,直到返回最后一个匹配上的为止。如果想要中止继续往下匹配,可以使用第三个参数flag。
列如:

^/PRO_GLPT/(.*)$ /glpt/$1 last
regex:^/PRO_GLPT/(.*)$
replacement /glpt/$1
flag:last
last匹配到之后直接处理,不在匹配上下文中的rewrite,接着用新的URI马上搜寻新的location
break立即停止执行所有当前上下文的rewrite模块指令,break不会搜寻新的location,直接用这个新的URI来处理请求,这样能避免重复rewite。

在server上下文中使用last,而在location上下文中使用break。

如果replacement中包含请求参数,那么默认情况下旧URI中的请求参数也会拼接在replacement后面作为新的URI,如果不想这么做,可以在replacement的最后面加上?。

  • multi_accept

当一个新连接到达时,如果激活了accept_mutex,那么多个Worker将以串行方式来处理,其中有一个Worker会被唤醒,其他的Worker继续保持休眠状态;如果没有激活accept_mutex,那么所有的Worker都会被唤醒,不过只有一个Worker能获取新连接,其它的Worker会重新进入休眠状态,这就是惊群问题。

  • listen格式
sten 127.0.0.1:8000;          
listen 127.0.0.1;             
listen 8000;                  
listen *:8000;                
listen localhost:8000;        
  • stub_status状态解释
对后端发起的活动连接数                                                                                       
Active connections: 105                                                                           
server accepts handled requests                                                                   
#nginx 总共处理了 48509358 个连接, 成功创建 48509358 次握手 (证明中间没有失败的), 总共处理了 50104491 个请求 (平均每次握手处理了 1.03个数据请求)
48509358 48509358 50104491                                                                        
#Reading:nginx 读取到客户端的Header信息数                                                                    
#Writing:nginx 返回给客户端的Header信息数                                                                    
#Waiting:开启 keep-alive 的情况下,这个值等于active - (reading + writing)意思就是Nginx说已经处理完正在等候下一次请求指令的驻留连接       
Reading: 0 Writing: 1 Waiting: 103                                                             

参考

nginx配置文件nginx.conf超详细讲解
nginx学习随笔
Nginx的accept_mutex配置
Nginx文档
一篇文章说透Nginx的rewrite模块

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容