nginx 详细配置教程

nginx 配置和优化

  • 配置文件

    /usr/local/nginx/conf/nginx.conf

  • 配置说明:

    配置用户和用户组:
    使用的用户和用户组(如果没有指定则是 nobody, nobody):

    user www www;
    

    如果没有 www 用户和用户组, 则使用下面的命令添加:

    user add www // 添加www用户
    group add www // 添加 www 的用户组
    

    worker-processes 指定工作进程数:

    worker-processes 8;
    

    ps: 一般为 cpu 核数的两倍

    指定错误日志存放的路径:

    1
    2
    3
    4
    5
    6
    error_log /usr/local/nginx/logs/error.log debug
    error_log /usr/local/nginx/logs/error.log info
    error_log /usr/local/nginx/logs/error.log notice
    error_log /usr/local/nginx/logs/error.log warn
    error_log /usr/local/nginx/logs/error.log error
    error_log /usr/local/nginx/logs/error.log crit

    ps: nginx 的错误类型有: debug, info, notice, warn, error, crit .

    pid 指定 pid 文件的存放路径(存放 nginx 的主进程 id)

    pid /usr/local/nginx/logs/nginx.pid;
    
    1
    2
    3
    4
    events {
    // 允许的连接数
    worker_connections 1024;
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    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 压缩
    gzip on;

    server {
    listen 80;
    server_name localhost hostname; # 配置服务器域名
    # 设置字符集, 如果多个网站使用不同的 charset, 请不要在这里设置, 让各个程序的 meta 里面设置.
    #charset koi8-r;

    #access_log logs/host.access.log main;

    location / {
    root html; # 访问目录
    index index.html index.php index.htm;
    }

    #error_page 404 /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    # proxy_pass http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #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;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    # deny all;
    #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #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;
    # 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;
    # }
    #}
    }

    如上配置可以看出, 一个 nginx 的主体配置是这样子的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    http {
    server {
    listen 80;
    server_name domain;
    access_log logs/default.access.log combined ; #combined 记录日志的格式
    location / {
    index index.html index.php index.htm;
    root html; // 项目路径
    }
    }
    }

    日志格式:

    配置:

    1
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
    1. $remote_addr 记录用户的 ip 地址
    2. $remote_user 远程客户端的名称
    3. $time_local 记录访问的时间和时区
    4. $request 记录请求的 url
    5. $status 记录请求的状态 200, 400 等
    6. $body_bytes_sent 用户记录发送给客户端文本主体的大小
    7. $http_referer 用于记录是从哪个页面跳转过来的
    8. $http_user_agent 用于记录浏览器的相关信息
    9. $http_x_forwarded_for 记录用户的 ip 地址

    使用 access_log 指定日志文件存放的路径:

    使用 log_format 设置了日志的格式后, 需要使用 access_log 指定日志文件的路径, access_log 的格式如下:
    access_log path [format [buffer=size| off ]]

    1. path access_log 的地址
    2. format 配置的 log_format 的日志格式名称
    3. buffer 设置缓存区域的地址大小, buffer=32k

    如果不想配置 access_log , 则指定 access_log off;

    nginxde 压缩输出配置
    gzip 是一种用所技术, 经过 gzip 的压缩页面大小可以缩小都原来的30%一下, 甚至更小.

    1
    2
    3
    4
    5
    启用:
    http {
    gzip on;
    }
    // gzip 介绍见后面的教程

    nginx配置自动列目录

    1
    2
    3
    4
    5
    location / {
    autoindex on;
    # autoindex_exact_size [on | of] # 列出文件的大小
    # autoindex_localtime [on|off] # 以本地时间显示反面时间的功能(GMT 时间)
    }

    nginx 浏览器本地缓存
    浏览器缓存可以设置expires指令来设置 header头设置实现.
    expires 指令语法:

    expires [time|epoch|max|off]
    默认值: expires off
    作用域: http, server,location

    配置:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    // 设置gif|jpg|jpeg|png|bmp|swf文件的缓存时间为30天
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
    expires 30d; // 设置缓存时间为30天
    }
    // 设置 css 和 js 文件的缓存时间为1小时
    location ~ .*\.(css|js)
    {
    expires 1h;
    }

    一个比较全的配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    #user nobody; #指定使用的用户
    worker_processes 1; #开启的进程数,一般设置 1-5
    #error_log logs/error.log;
    #error_log logs/error.log notice;
    #error_log logs/error.log info; #定义错误日志,以及记录的日志等级

    #pid
    logs/nginx.pid; #定义 pid 文件位置

    events {
    # use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];
    #use epoll; #使用 epoll(linux2.6 的高性能方式)
    # Nginx 支持如下处理连接的方法(I/O 复用方法),这些方法可以通过 use 指令指定。
    #select - 标准方法。 如果当前平台没有更有效的方法,它是编译时默认的方法。你可以使用配置参 数 –with-select_module 和 –without-select_module 来启用或禁用这个模块。
    #poll - 标准方法。 如果当前平台没有更有效的方法,它是编译时默认的方法。你可以使用配置参数 –with-poll_module 和 –without-poll_module 来启用或禁用这个模块。
    #kqueue - 高效的方法,使用于 FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X. 使用双 处理器的 MacOS X 系统使用 kqueue 可能会造成内核崩溃。
    #epoll - 高效的方法,使用于 Linux 内核 2.6 版本及以后的系统。在某些发行版本中,如 SuSE 8.2, 有让 2.4 版本的内核支持 epoll 的补丁。
    #rtsig - 可执行的实时信号,使用于 Linux 内核版本 2.2.19 以后的系统。可是从 Linux 内核版本 2.6.6-mm2 开始,这个参数就不再使用了.
    #/dev/poll - 高效的方法,使用于 Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+.
    #eventport - 高效的方法,使用于 Solaris 10. 为了防止出现内核崩溃的问题, 有必要安装 这个 安 全补丁。 worker_connections 1024;
    #worker_connections 51200; #每个进程最大连接数(最大连接=连接数 x 进程数)

    }

    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; #打开 gzip 压缩

    #fastcgi_connect_timeout 300;
    #fastcgi_send_timeout 300;
    #fastcgi_read_timeout 300;
    #fastcgi_buffer_size 128k;
    #fastcgi_buffers 4 256k;
    #fastcgi_busy_buffers_size 256k;
    #fastcgi_temp_file_write_size 256k;
    #fastcgi_temp_path /dev/shm;

    #fastcgi 连接超时时间和缓存

    server {
    listen 80;
    server_name localhost; #主机名
    #charset koi8-r; #默认字符编码 
    charset gb2312
    #access_log logs/host.access.log main;

    location / {

    #pass 路径匹配 能够匹配路径中带“/”的 不过需要注意的是如果之后也有相关“/”匹配项并且 使用比此处更精确匹配符,则以之后表达式优先
    root html;
    index index.html index.htm;
    }

    #error_page 404 /404.html;
    # redirect server error pages to the static page /50x.html
    error_page 500 502 503 504 /50x.html;

    location = /50x.html {
    #精确的匹配,并且不再向下匹配
    root html;
    }

    #location ~ \.php$ {
    #正则表达式匹配 一旦匹配则不再向下匹配
    # proxy_pass http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

    #location ~ \.php$ {
    # root html;
    # fastcgi_pass 127.0.0.1:9000;
    #指定 fastcgi 的地址端口
    # fastcgi_index index.php;
    # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
    # include fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one

    #location ~ /\.ht {
    # deny all; #不允许访问以.ht 开头的文件
    #}

    }

    # another virtual host using mix of IP-, name-, and port-based configuration

    #

    #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;
    # server_name localhost;
    # ssl on;
    # ssl_certificate cert.pem;
    # ssl_certificate_key cert.key;
    # ssl_session_timeout 5m;
    # ssl_protocols SSLv2 SSLv3 TLSv1;

    # ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    # ssl_prefer_server_ciphers on;

    #以上为 ssl 配置

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

    }

Nginx 下的虚拟主机配置

1
2
3
4
5
// 配置一个具有域名的虚拟主机,
server {
listen 80;
server_name www.example.com
}
1
2
3
4
// 配置一个没有域名的虚拟主机
server {
listen 80 default;
}
1
2
3
4
5
6
// 配置一个IP 的虚拟主机
server {
listen 10.0.0.88:80;
root 88.com;
index index.html;
}

安全的连接 https

Nginx 的 https 配置方法: 首先生成一对证书。 你需要使用到 openssl 命令,所以请确认系统已经安装过此包 RHEL5 中在/etc/pki/tls/certs 目录有个脚本可以帮助我们简化证书生成的过程,所以 我们首先切换到此目录

[root@example ~]# cd /etc/pki/tls/certs

[root@example certs]# cd /etc/pki/tls/certs

[root@example certs]# make server.key

生成私钥

[root@example certs]# openssl rsa -in server.key -out server.key
// 去除密码以便使用时不询问密码
[root@example certs]# make server.csr
//生成证书颁发机构,用于颂发公钥
[root@example certs]# openssl x509 -in server.csr -req -signkey server.key -days 365 -out server.crt

颁发公钥,不过由于我们并不是去 CA 证书中心申请的公钥,所以在使用的时候,客户 端浏览器会跳出未受信任的警告。如果你 money 够多,请去 CA 申请。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
listen 443;
server_name www.example.com;
ssl on;
ssl_certificate /etc/pki/tls/certs/server.crt;
ssl_certificate_key /etc/pki/tls/certs/server.key;

#以上两句在指定证书所存放的路径
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;

#指出允许的密码,密码指定为 OpenSSL 支持的格式
ssl_prefer_server_ciphers on;

#依赖 SSLv3 和 TLSv1 协议的服务器密码将优先于客户端密码

...
}
坚持原创技术分享,您的支持将鼓励我继续创作!
//