NGINX基础配置

文件路径

nginx的配置文默认件路径为/etc/nginx/nginx.conf(linux系统)或安装目录下的conf/nginx.conf

配置语法

配置解析

全局配置

# 设置nginx服务的系统使用的用户
user nginx;
# 工作进程数,一般与CPU相等
worker_processes  auto;

# 关闭错误日志
# error_log off;
# 错误日志路径
error_log  /var/log/nginx/error.log notice;
# 存放nginx服务master进程pid文件
pid        /var/run/nginx.pid;

events {
    # 每个worker进程支持最大连接数
    worker_connections  1024;
}

http配置

http {
    # 包含nginx可以解析的文件配置
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    # 关闭访问日志
    # access_log off;

    # 日志格式
    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  /var/log/nginx/access.log  main;

    # 是否调用sendfile函数提高文件传输效率
    sendfile        on;
    # 数据包不会马上传送出去等到数据包最大时一次性的传输出去这样有助于解决网络堵塞
    #tcp_nopush     on;

    # 小数据包是否立即发送出去
    tcp_nodelay         on;

    keepalive_timeout  65;

    # 是否启用压缩
    #gzip  on;

    # 从其他文件加载虚拟配置
    include /etc/nginx/conf.d/*.conf;
}

虚拟主机

一个虚拟主机,需配置域名和端口,也只处理对应主机域名的http请求,内可包含多个location块

# http配置
server {
    # 监听端口
    listen 80;
    # 绑定域名
    server_name example1.com example2.com;
    # 静态资源根目录
    root /www/;
}

# https配置
server {
    listen 443 ssl;
    server_name secure.example.com;

    # 证书文件
    ssl_certificate /etc/nginx/cert/server.crt;
    # 私钥文件
    ssl_certificate_key /etc/nginx/cert/server.key;

    # 优化 SSL 配置(可选)
    # 一个用于控制 SSL/TLS 会话缓存有效期的指令
    # 决定了客户端可以复用之前 SSL 握手建立的会话的时间长度,从而减少后续连接的握手开销,提升性能
    # 单位可以是 s(秒)、m(分钟)、h(小时)、d(天)
    ssl_session_timeout 5m;
    # 加密套件
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    # 支持的协议版本
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    # 用于控制 SSL/TLS 握手过程中密码套件(Cipher Suites)优先级的指令
    # 决定了服务器和客户端在协商加密算法时,是优先使用服务器支持的密码套件(服务器优先模式),还是客户端支持的密码套件(客户端优先模式)
    ssl_prefer_server_ciphers on;
}

# 强制 HTTP 跳转 HTTPS
server {
    listen 80;
    server_name secure.example.com;
    return 301 https://$host$request_uri;
}

location配置

配置对应具体的路径请求 - 匹配符号 - =:表示完全匹配,不存在正则表示,如 location = /uri {…} - ~:表示匹配时,大小写敏感,如 location ~ /uri {…} - ~:表示匹配时,大小写不敏感,即忽略大小写问题,如 location ~ /uri {…},这时 /uri,/Uri, /URI 都可以匹配上 - ^~:表示匹配时,只需开头部分匹配上即可,如 location ^~ /uri/ {…} ,这时只要以 /uri/ 开头的地址都会匹配上 - @:表示nginx内部的重定向,不直接处理用户的请求,如 location @error {…} , 这时可以到另一个location内部,重定向到 @error 路径,如 location ~ /test {error_page 404 @error}

# http静态文件服务配置
location / {
    root    /www/;
    index   index.html;
}

location ^~ /static/ {
    # 使用alias时 路径必须以/结尾 表明这是一个文件夹
    alias /wwww/;
    index index.html;
}

# 代理websocket
location /ws/ {
    # 后端服务器地址
    proxy_pass http://backend;

    # 启用 WebSocket 支持
    # 启用 HTTP/1.1 协议支持 Upgrade 机制
    proxy_http_version 1.1;
    # 传递客户端的 Upgrade 请求头通常为 websocket
    proxy_set_header Upgrade $http_upgrade;
    # 指示服务器升级连接类型
    proxy_set_header Connection "Upgrade";

    # 配置超时参数
    # 后端服务器响应超时时间),避免长连接因长时间无数据被关闭
    proxy_read_timeout 86400;
    # 客户端发送数据超时时间
    proxy_send_timeout 86400;

    # 传递客户端真实 IP
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

upstream配置

定义一组后端服务器(上游服务器),实现负载均衡和高可用性

upstream backend {
    ip_hash;
    server 192.168.0.1;
    server 192.168.0.2:8080;
    server 192.168.0.3 max_fails=5 fail_timeout=30s;
    server 192.168.0.4 down;
}

完整配置

user nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    # tcp_nopush     on;

    keepalive_timeout  65;

    # gzip  on;

    # include /etc/nginx/conf.d/*.conf;

    upstream backend {
        ip_hash;
        server 192.168.0.1;
        server 192.168.0.2:8080;
        server 192.168.0.3 max_fails=5 fail_timeout=30s;
        server 192.168.0.4 down;
    }

    server {
        listen 443 ssl;
        server_name secure.example.com;

        ssl_certificate /etc/nginx/cert/server.crt;
        ssl_certificate_key /etc/nginx/cert/server.key;

        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;

        location / {
            alias /www/;
            index index.html index.htm;
        }

        location /backend/ {
            proxy_pass https://backend/;
        }
    }

    server {
        listen 80;
        server_name secure.example.com;
        return 301 https://$host$request_uri;
    }
}