docker启动nginx及常见nginx配置
nginx
为方便在设置出错时快速恢复,使用docker方式来配置nginx,下文所有命令针对docker方式。
简单启动
sudo docker run --name nginx_3000 -p 3000:80 -d nginx
可以在3000端口访问nginx,如下图:
nginx相关目录
实际使用过程中,我们需要对nginx的转发规则等选项进行配置。docker版本的各个配置文件默认所在路径为:
- 网页root目录:/usr/share/nginx/html
- nginx配置文件:/etc/nginx/nginx.conf
- 日志文件目录:/var/log/nginx
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
其中各个配置项含义如下:
-d 后台运行
-p 端口映射 3000宿主机端口 80 docker监听端口
–name 指定容器名称
-v 目录映射 前者是宿主机路径 后者是docker容器路径 具体路径根据自己情况设定
html为网页内容
conf 为nginx配置
logs 为 日志
启动成功后,我们就可以在宿主机中修改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.comlocation /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全局块
}
- 1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
- 2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
- 3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
- 4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
- 5、location块:配置请求的路由,以及各种页面的处理情况。主要修改都集中在这一块。
举例子
########### 每个指令必须有分号结束。#################
#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; #设置网路连接序列化,防止惊群现象发生,默认为onmulti_accept on; #设置一个进程是否同时接受多个网络连接,默认为off#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventportworker_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; #拒绝的ipallow 172.18.5.54; #允许的ip } }
}
常用三个配置详细解析
location
location [=|~|~*|^~|@] /uri/ {...
}
- = : 表示精确匹配后面的url
- ~ : 表示正则匹配,但是区分大小写
- ~* : 正则匹配,不区分大小写
- ^~ : 表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
- @ : “@” 定义一个命名的 location,使用在内部定向时,例如 error_page
上述匹配规则的优先匹配顺序:
- = 前缀的指令严格匹配这个查询。如果找到,停止搜索;
- 所有剩下的常规字符串,最长的匹配。如果这个匹配使用 ^~ 前缀,搜索停止;
- 正则表达式,在配置文件中定义的顺序;
- 如果第 3 条规则产生匹配的话,结果被使用。否则,使用第 2 条规则的结果。
if
用法:if (条件判断) { 具体的rewrite规则 }
- 条件判断语句由Nginx内置变量、逻辑判断符号和目标字符串三部分组成。
- rewite规则见下方
rewrite
部分
常见逻辑判断符号:
- = 等于
- != 不等于
- ~ 匹配 区分大小写
- ~* 匹配 不区分大小写
- !~ 不匹配 区分大小写
- !~* 不匹配 不区分大小写
!表示相反的意思,为匹配符号,它右侧为正则表达式,区分大小写,而*为不区分大小写匹配。
目标字符串可以是正则表达式,通常不用加引号,但表达式中有特殊符号时,比如空格、花括号、分号等,需要用单引号引起来。
常见Nginx内置变量:
- 1.$remote_addr 与 $http_x_forwarded_for 用以记录客户端的ip地址;
- 2.$remote_user :用来记录客户端用户名称;
- 3.$time_local : 用来记录访问时间与时区;
- 4.$request : 用来记录请求的url与http协议;
- 5.$status : 用来记录请求状态;成功是200;
- 6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;
- 7.$http_referer :用来记录从那个页面链接访问过来的;
- 8.$http_user_agent :记录客户端浏览器的相关信息;
例子:
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
逻辑判断相同,如下
- ~ 为区分大小写匹配
- ~* 为不区分大小写匹配
- !和!*分别为区分大小写不匹配及不区分大小写不匹配
rewrite除正则匹配外,还支持对文件目录判断,有以下几种:
- -f和!-f用来判断是否存在文件
- -d和!-d用来判断是否存在目录
- -e和!-e用来判断是否存在文件或目录
- -x和!-x用来判断文件是否可执行
flag标记分为下面4仲:
- last :本条规则匹配完成后,继续向下匹配新的location URI规则
- break :本条规则匹配完成即终止,不再匹配后面的任何规则
- redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址
- 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的错误日志级别改为noticerewrite_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/rapidbuylocation ~ /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 文件夹中 的对应静态htmlif ($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;}}
}
参考链接:https://www.runoob.com/w3cnote/nginx-setup-intro.html
docker启动nginx及常见nginx配置相关推荐
- docker开放的端口_docker-5-解决宿主机没有开放81端口却可以直接访问docker启动的81端口nginx容器的问题...
我以为经过前面四篇博文的学习,自己对docker的了解最起码入门了,但是当我用docker启动一个81端口的nginx后(宿主机:容器/81:80),在宿主机的firwall防火墙没有添加81端口的情 ...
- docker上启动nginx,并配置修改nginx的配置文件 nginx、挂载文件、docker容器中文乱码
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务.因为其优秀的性能,使得其成为日常开发,线上运营必不可少的软件了.下面就通过 ...
- Linux docker 安装启动nginx命令 (映射配置,文件等)
PS:docker安装mysql https://blog.csdn.net/wu__peng/article/details/90905399 首先创建 /home/nginx文件夹,然后放一个ng ...
- docker启动nginx代理不上_Docker nginx 反向代理设置
文章目录 [隐藏] 缘起 方案一 方案二 延伸 缘起 最近在公司搭建了一个基于 Gogs 的代码管理系统,以及基于 Kanboard 的任务管理系统等几个内部系统.由于部署在同一台机器上,基于不同的端 ...
- docker启动nginx,并挂载目录及docker容器中文乱码
1.首先下载docker的nginx镜像 docker pull nginx 2.查看下载完成的镜像 docker images 3.运行一个nginx的镜像的实例 docker run --name ...
- docker启动nginx后挂了_Docker容器部署 Nginx服务
1.查找 Docker Hub 上的 nginx 镜像 [root@localhost ~]# docker search nginx 2.拉取官方的Nginx镜像 [root@localhost ~ ...
- docker启动nginx代理不上_用 docker-compose 启动 nginx, network 为 host, nginx 无法启动是怎么回事?...
我其实就是想用nginx 容器解决本地开发中前后端跨域的问题,现在的问题是,启动的nginx容器,识别不了本地localhost 或 127.0.0.1的服务,(至少我还没有找到解决办法)所以也无法代 ...
- Docker启动nginx容器--搭建网站
1.下载nginx镜像 docker pull nginx 2.启动nginx镜像 docker run -d --name nginx01 -p 80:80 -v /data/nginx/www:/ ...
- 【docker】docker启动nginx并实现反向代理
文章目录 1.拉取nginx镜像 2.启动nginx 3.创建文件夹 4.将nginx.conf 复制到/docker/nginx/conf/路径下 5.使用配置文件挂载的方式启动docker 5-1 ...
最新文章
- vb.net调用oracle存储过程,今天搞好了VB.NET调用Oracle存储过程返回游标的问题
- 网络视频会议整体解决方案
- 【读书笔记】iOS-设计简单的Frenzic式益智游戏
- Spring Data Pivotal Gemfire教程
- Spring Data MongoDB中的审核实体
- GPB | 陈润生/何顺民团队发布新版SmProt数据库,提供小蛋白丰富、可靠的系统性注释...
- C/C++轻松写可塞满硬盘的程序
- 胶囊网络与计算机视觉教程 @CVPR 2019
- 用c++库函数实现WCHAR写入文件
- 请教一个ghost恢复的问题
- php怎么实现弹幕,HTML如何利用canvas实现弹幕功能
- Django_基本配置保存
- java 小程序 学生成绩_自己搞的小程序,学生管理信息系统,大家来看看
- Flutter 开屏方案
- java jnlp_Java Web Start实践:动态生成JNLP
- 高度自律学习者的app
- 第4届华为编程大赛决赛试题解答(棋盘覆盖)
- python: 解决SyntaxError: encoding problem
- 博士生的你,择偶标准是什么?
- mount挂载失败出现Structure needs cleaning