docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > docker启动nginx及常见nginx配置

docker启动nginx及常见nginx配置方式

作者:凉晓风

这篇文章主要介绍了docker启动nginx及常见nginx配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

nginx

为方便在设置出错时快速恢复,使用docker方式来配置nginx,下文所有命令针对docker方式。

简单启动

sudo docker run --name nginx_3000 -p 3000:80 -d nginx

可以在3000端口访问nginx,如下图:

nginx相关目录

实际使用过程中,我们需要对nginx的转发规则等选项进行配置。docker版本的各个配置文件默认所在路径为:

nginx主要命令

nginx stop #快速关机
nginx quit  #优雅的关机
nginx reload  #重新加载配置文件
nginx reopen #重新打开日志文件
nginx -t #检查配置,同时也是输出配置文件所在位置
nginx -s reload  #修改配置后重载

挂载文件启动

docker启动nginx后每次修改配置文件都得执行

docker exec nginx_3000 /bin/bash

进入容器的shell后进行操作,比较繁琐,而且用vi编辑器修改内容多时不太方便,所以可以将网页文件及配置文件从宿主机中挂载到nginx中,这样可以方便在在宿主机中利用vscode进行修改。

首先先在宿主机中某一位置建立网页、日志和配置目录

mkdir html
mkdir logs
mkdir conf

拷贝容器中nginx默认配置到宿主机刚才新建的conf目录中

docker cp nginx_3000:/etc/nginx/nginx.conf ./conf/

删掉刚才建立的nginx容器,重新建立带目录映射的容器,

docker run -d -p 80:80 --name nginx_zf -v ~/docker_file/nginx/html:/usr/share/nginx/html -v ~/docker_file/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v ~/docker_file/nginx/logs:/var/log/nginx nginx

其中各个配置项含义如下:

启动成功后,我们就可以在宿主机中修改nginx的配置文件了,一般修改完成后,可以restart容器来生效配置,或者进入nginx容器,执行重载配置。

默认nginx配置文件内容/etc/nginx/nginx.conf如下:

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
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;
}

注意文件中又引入了 /etc/nginx/conf.d/*.conf文件,如下:

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

为简化操作,可以直接修改宿主机中的 nginx.conf文件,不导入其他文件,现在以一个url转发为例修改宿主机的配置文件如下:

worker_processes  1;

error_log  /var/log/nginx/error.log warn;
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;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;
        autoindex on;# 消除403报错
        location / {

            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }

				# 访问 localhost:端口号/test 转发到 www.baidu.com
        location /test {
            proxy_pass http://www.baidu.com;
        }

    }
}

如果启动后报403 可以在location上加上 autoindex on; 配置

配置文件解析

主要结构

...              #全局块

events {         #events块
   ...
}

http      #http块
{
    ...   #http全局块
    server        #server块
    { 
        ...       #server全局块
        location [PATTERN]   #location块
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局块
}

举例子:

########### 每个指令必须有分号结束。#################
#user administrator administrators;  #配置用户或者组,默认为nobody nobody。
#worker_processes 2;  #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址
error_log log/error.log debug;  #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
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
    #access_log off; #取消服务日志    
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
    access_log log/access.log myFormat;  #combined为日志格式的默认值
    sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。

    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #热备
    }
    error_page 404 https://www.baidu.com; #错误页
    server {
        keepalive_requests 120; #单连接请求上限次数。
        listen       4545;   #监听端口
        server_name  127.0.0.1;   #监听地址       
        location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
           #root path;  #根目录
           #index vv.txt;  #设置默认页
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 172.18.5.54; #允许的ip           
        } 
    }
}

常用三个配置详细解析

location

location [=|~|~*|^~|@] /uri/ {
  ...
} 

上述匹配规则的优先匹配顺序:

if

用法:if (条件判断) { 具体的rewrite规则 }

常见逻辑判断符号:

  1. = 等于
  2. != 不等于
  3. ~ 匹配 区分大小写
  4. ~* 匹配 不区分大小写
  5. !~ 不匹配 区分大小写
  6. !~* 不匹配 不区分大小写

!表示相反的意思,为匹配符号,它右侧为正则表达式,区分大小写,而*为不区分大小写匹配。

目标字符串可以是正则表达式,通常不用加引号,但表达式中有特殊符号时,比如空格、花括号、分号等,需要用单引号引起来。

常见Nginx内置变量:

例子:

if ($http_user_agent ~ MSIE) //user_agent带有MSIE字符的请求,直接返回403状态码  ,MSIE ->IE浏览器
{
    return 403;
}

if ($request_method = POST)  //当请求的方法为POST时,直接返回405状态码
{
    return 405; //在该示例中并未用到rewrite规则,if中支持用return指令,直接返回状态码
}

if(!-f $request_filename)  //当请求的文件不存在,将会执行下面的rewrite规则,-f判断是否为文件,!-f判断这个文件是否存在
{
    rewrite 语句; #重要
}

rewrite

用法: rewrite [正则] [替换] 标志位

rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尾是flag标志位

正则表达式匹配,与if逻辑判断相同,如下:

  1. ~ 为区分大小写匹配
  2. ~* 为不区分大小写匹配
  3. !和!*分别为区分大小写不匹配及不区分大小写不匹配

rewrite除正则匹配外,还支持对文件目录判断,有以下几种:

  1. -f和!-f用来判断是否存在文件
  2. -d和!-d用来判断是否存在目录
  3. -e和!-e用来判断是否存在文件或目录
  4. -x和!-x用来判断文件是否可执行

flag标记分为下面4种:

  1. last :本条规则匹配完成后,继续向下匹配新的location URI规则
  2. break :本条规则匹配完成即终止,不再匹配后面的任何规则
  3. redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址
  4. permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

使用last和break实现URI重写,浏览器地址栏不变。而且两者有细微差别,使用alias指令必须用last标记;使用proxy_pass指令时,需要使用break标记。

Last标记在本条rewrite规则执行完毕后,会对其所在server{…}标签重新发起请求,而break标记则在本条规则匹配完成后,终止匹配。

常用配置

反向代理后端api

worker_processes  auto;

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

events {
    worker_connections  10240;
}

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;
		
		#后端多实例集群,可根据权重分配请求
		upstream apiaddr{
         server 192.168.31.101:8080 weight=5; #weight 为权重
         server 192.168.31.102:8080 weight=3;
    }
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;
        autoindex on;# 消除403报错
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
            try_files $uri /index.html;#加上该配置项,使能在react项目中手动在浏览器url栏手动输入url。
        }

				# 反向代理配置
        location /api/{
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://apiaddr/; #多实例 利用upstream来转发
            #proxy_pass http://192.168.31.101:8080/; #单实例直接指定后端api地址
            
            #根据是否有跨域需求修改
            add_header Access-Control-Allow-Origin *;
            add_header Access-Control-Allow-Headers X-Requested-With;
            add_header Access-Control-Allow-Methods GET,POST,DELETE,OPTIONS;
            
            #也可以单独 附加请求头,根据需要修改
            #proxy_set_header  your-custome-header    "myHeader";
            #proxy_set_header X-NginX-Proxy true;
        }
    }
}

react 项目配置服务于爬虫的页面TDK

user  nginx;
worker_processes  auto;

#error_log  /var/log/nginx/error.log warn;
#修改 日志输出等级 配合下方 rewrite_log on; 可以在errlog中查看rewrite转发日志,方便调试
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;

    server {
        listen       80;#HTTP 的端口
        server_name  localhost; #域名
 
        charset utf-8;
 
        #access_log  logs/host.access.log  main;

        #此处是开启rewrite日志,并且需要把nginx的错误日志级别改为notice
        rewrite_log on;         
        
        # 前端页面
        location / { 
            root   /usr/share/nginx/html;
            index  index.html;
            try_files $uri /index.html;#加上了这个,就可以在url后面直接加路由上配置path了。
        }

        # 多个预先生成的 供爬取的 html页面
        # 1.商城首页 /front/shoppingIndex
        # 2.帮助中心 /front/help 
        # 3.商品列表 /front/goodsList
        # 4.直接采购 /front/directbuy
        # 5.优质供应商 /front/highQualitySupplier
        # 6.快速采购 /front/rapidbuy

        location ~ /front/(shoppingIndex|help|goodsList|directbuy|highQualitySupplier|rapidbuy)/?$ { #?表示0个或者1个/

            root   /usr/share/nginx/html;
            index  index.html;
             try_files $uri /index.html;#加上了这个,就可以在url后面直接加路由上配置path了。
            #设置一个 判断是否为爬虫的 变量 
            set $isspider no; #默认不是爬虫
  
            #爬虫判断(谷歌、百度、360、微软)
            if ($http_user_agent ~* .*(Googlebot|Baiduspider|360Spider|bingbot).*){
                set $isspider yes; #是爬虫
            }

            #如果是爬虫的话 则重写到 front 文件夹中 的对应静态html
            if ($isspider = yes) {
                rewrite ^(.*)$ $1.html break;
                #permanent; 
                #rewrite ^(.*)$ /prerender/index3.html break;
            }
        }

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文