Nginx 配置详解

公司新版的管理系统使用前后端分离,所以前后端要分别配置 nginx 。所以认真学习了一下nginx 的配置,nginx 的配置文件保存在在 conf 目录下

image.png

1. 各个配置文件说明

1.1 fastcgi.conf,fastcgi 相关参数的配置文件

对比下 fastcgi.conf 与 fastcgi_params 文件,可以看出只有以下差异:
即 fastcgi.conf 只比 fastcgi_params 多了一行“ fastcgi_param SCRIPT_FILENAME documentrootdocument_root fastcgi_script_name;”
原本只有fastcgi_params文件,fastcgi.conf 是 Nginx 0.8.30 (released: 15th of December 2009)才引入的。主要为是解决以下问题: 参考

原本 Nginx 只有 fastcgi_params ,后来发现很多人在定义 SCRIPT_FILENAME 时使用了硬编码的方式。例如,fastcgi_param SCRIPT_FILENAME /var/www/foofastcgiscriptname。于是为了规范用法便引入了fastcgi.conf。不过这样的话就产生一个疑问:为什么一定要引入一个新的配置文件,而不是修改旧的配置文件?这是因为fastcgiparam指令是数组型的,和普通指令相同的是:内层替换外层;和普通指令不同的是:当在同级多次使用的时候,是新增而不是替换。换句话说,如果在同级定义两次SCRIPTFILENAME,那么它们都会被发送到后端,这可能会导致一些潜在的问题,为了避免此类情况,便引入了一个新的配置文件因此不再建议大家使用以下方式(搜了一下,网上大量的文章,并且nginx.conf的默认配置也是使用这种方式):fastcgiparamSCRIPTFILENAMEfastcgi_script_name 。于是为了规范用法便引入了 fastcgi.conf。 不过这样的话就产生一个疑问:为什么一定要引入一个新的配置文件,而不是修改旧的配置文件?这是因为 fastcgi_param 指令是数组型的,和普通指令相同的是:内层替换外层;和普通指令不同的是:当在同级多次使用的时候,是新增而不是替换。换句话说,如果在同级定义两次 SCRIPT_FILENAME,那么它们都会被发送到后端,这可能会导致一些潜在的问题,为了避免此类情况,便引入了一个新的配置文件因此不再建议大家使用以下方式(搜了一下,网上大量的文章,并且 nginx.conf 的默认配置也是使用这种方式): fastcgi_param SCRIPT_FILENAME document_root$fastcgi_script_name;
include fastcgi_params;

1.2 fastcgi_params,fastcgi 相关参数的配置文件

nginx 配置 Fastcgi 解析时会调用 fastcgi_params 配置文件来传递服务器变量,这样 CGI 中可以获取到这些变量的值

image.png

1.3 koi-utf、koi-win、win-utf

这三个文件都是与编码转换映射文件,用于在输出内容到客户端时,将一种编码转换到另一种编码。

koi-win: charset_map  koi8-r < -- > windows-1251
koi-utf: charset_map  koi8-r < -- > utf-8
win-utf: charset_map  windows-1251 < -- > utf-8
复制代码

koi8-r 是斯拉夫文字8位元编码,供俄语及保加利亚语使用。在Unicode未流行之前,KOI8-R 是最为广泛使用的俄语编码,使用率甚至起ISO/IEC 8859-5还高。这3个文件存在是因为作者是俄国人的原因

1.4 mime.types

文件扩展名与文件类型映射表,nginx 根据映射关系,设置 http 请求响应头的 Content-Type 值。当在映射表找不到时,使用 nginx.conf 中 default-type 指定的默认值。
例如,默认配置中的指定的 default-type 为 application/octet-stream 。
include mime.types;
default_type application/octet-stream;
默认下面截一段 mime.types 定义的文件扩展名与文件类型映射关系

image.png

1.6 uwsgi_params 和 scgi_params

与 fastcgi_params 一样,传递服务器变量,只有前缀不一样,以 uwsgi_param 或 scgi_param 开始而非 fastcgi_param。

2. nginx.conf 配置文件

配置文件结构

# 全局块
...              
# events块
events {         
   ...
}
# http块
http      
{
    # http全局块
    ...   
    # 虚拟主机server块
    server        
    { 
        # server全局块
        ...       
        # location块
        location [PATTERN]   
        {
            ...
        }
    }
    # http全局块
    ...     
}
复制代码

1、全局块:配置影响 nginx 全局的指令。一般有运行 nginx 服务器的用户组,nginx 进程 pid 存放路径,日志存放路径,配置文件引入,允许生成 worker process 数等。

2、events 块:配置影响 nginx 服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。

3、http 块:可以嵌套多个 server ,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type 定义,日志自定义,是否使用 sendfile 传输文件,连接超时时间,单连接请求数等。

4、server 块:配置虚拟主机的相关参数,一个 http 中可以有多个 server。

5、location 块:配置请求的路由,以及各种页面的处理情况。

以下是本人的本地开发的 nginx.conf 文件

user   Jane;  #配置用户或者组,nginx的worker进程用哪个用户和组进行登录,默认为nobody nobody
worker_processes  1; #允许生成的进程数,默认为1

#error_log  logs/error.log; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg

#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid; #指定nginx进程运行文件存放地址,进程作为系统的守护进程运行,就需要在某个文件中保存进程的ID号


events {
    #accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
    #multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大连接数,默认为512
}


http {
    include       mime.types;  #文件扩展名与文件类型映射表
    default_type  application/octet-stream; #默认文件类型,默认为text/plain
    #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;  #combined为日志格式的默认值

    sendfile        on;  #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    #tcp_nopush     on;  #是否启用AIO机制,默认是OFF,在Linux 2.6.22内核及后续版本才支持。

    #keepalive_timeout  0;
    keepalive_timeout  65; #一次长连接允许发起的最大请求数量,用户与服务器建立连接后,通过此连接可以发起的最多多少次请求,该参数可以定义在http{}段中,也可以定义在server{}段中、location{}段中

    #gzip  on;  #gzip实现压缩的时候使用缓冲的大小,第一个参数是缓存空间个数,第二个是缓存大小。默认情况下


    include conf.d/*;  #表示包含当前路径下目录中的所有文件

    gzip on; #开启或关闭 gzip on off, gzip实现压缩的时候使用缓冲的大小,第一个参数是缓存空间个数,第二个是缓存大小
    gzip_disable "msie6"; #不适用 gzip IE6
    gzip_min_length 1k; #gzip 压缩最小文件大小,超出进行压缩
    gzip_buffers 4 16k; #buffer 不用修改
    #gzip_http_version 1.1; #gzip 支持的 http 协议
    gzip_comp_level 8; #压缩级别:1-10,数字越大压缩得越好,时间也越长
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; #压缩文件
}
复制代码

3. 虚拟主机配置

    server {
        listen       8089 default_server;  # 监听端口
        listen       [::]:8089 default_server;  # ipv6
        server_name  localhost; # 服务域名

        root         /Users/luomeizhen/develop/AOS/www/aos_server/public;  # 默认网站根目录(www目录)

        location / {
            index index.php index.html index.htm;
	    if (!-e $request_filename) {
   		rewrite  ^(.*)$  /index.php?s=/$1  last;
   	    }
        }

        error_page 404 /404.html;  #重定向页面
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;  #重定向页面
            location = /50x.html {
        }

        # PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI协议默认配置.
        # Fastcgi服务器和程序(PHP,Python)沟通的协议.
        location ~ \.php$ {
            # 设置监听端口
            fastcgi_pass   127.0.0.1:9000;
            # 设置nginx的默认首页文件(上面已经设置过了,可以删除)
            fastcgi_index  index.php;
            # 设置脚本文件请求的路径
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            # 引入fastcgi的配置文件
            include        fastcgi_params;
        }
    }
    
# https 配置
server {  
    listen 192.168.1.11:443;  #ssl端口  
    server_name  test.com;  
    #为一个server{......}开启ssl支持  
    ssl on;  
    #指定PEM格式的证书文件   
    ssl_certificate      /etc/nginx/test.pem;   
    #指定PEM格式的私钥文件  
    ssl_certificate_key  /etc/nginx/test.key;  
}  


复制代码

4.location 配置

# uri 匹配
location = / {
    # 完全匹配  =
    # 大小写敏感 ~
    # 忽略大小写 ~*
}
location ^~ /images/ {
    # 前半部分匹配 ^~
    # 可以使用正则,如:
    # location ~* \.(gif|jpg|png)$ { }
}
location / {
    # 如果以上都未匹配,会进入这里
}

# 1. 根目录
location / {
    root /home/barret/test/;
}
# 2. 别名
location /blog {
    alias /home/barret/www/blog/;
}
# 3. try_files
try_files $uri $uri.html $uri/index.html @other;
location @other {
    # 尝试寻找匹配 uri 的文件,失败了就会转到上游处理
    proxy_pass  http://localhost:9000;
}
location / {
    # 尝试寻找匹配 uri 的文件,没找到直接返回 502
    try_files $uri $uri.html =502;
}
# 4. 反向代理
location / {
    proxy_pass_header Server; 
    proxy_set_header Host $http_host;  #所请求的目的主机名
    proxy_set_header X-Real-IP $remote_addr;   #把真实客户端IP写入到请求头X-Real-IP
    proxy_set_header X-Scheme $scheme;  
    proxy_pass http//ggzy;  # 代理的ip地址和端口号
}

复制代码

本文参考原文: www.cnblogs.com/mikeluwen/p…
juejin.cn/post/684490…

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享