Nginx学习笔记
Nginx学习笔记
一、一些概念
1、正向代理以及反向代理
是什么
在资源的访问过程中通过代理服务器,正向代理服务器接收客户端的请求并将其发给服务器,此时代理服务器是一个客户端;反向代理接收客户端的请求并将其发给服务器,此时代理服务器是一个服务端
为什么
正向代理可以突破IP的访问限制、提高访问速度等;而反向代理一大作用是可以实现负载均衡
负载均衡:反向代理服务器将请求平均分配到自己代理的服务器上,避免某些服务器负载过重(*而且这样的话多台服务器就可以共用一个对外的IP了)
2、Nginx
Nginx 是高性能的 HTTP 和反向代理的web服务器,可以作为静态页面的web服务器,结合CGI协议的动态语言可以实现动态页面
二、Nginx常用命令
前提:进入nginx生成的sbin目录下
1 | ./nginx -v#启动nginx |
三、Nginx的配置文件
关于位置
linux用apt安装的nginx core的配置文件在*/etc/nginx.conf*
在这个nginx.conf的http块(见下文)里面有这样两句
1 | include /etc/nginx/conf.d/*.conf; |
第一句可以从conf.d里导入所有后缀名为.conf的文件,感觉新增加server之类的字段应该弄一个文件放里面?(那sites-enabled里应该放什么?)
include大概就是直接把文件内容扔到自身所在的配置文件里面(自己写配置文件的时候应该也可以这样优化结构)
配置文件的组成
Part1 全局块
主要设置一些影响nginx服务器整体运行的配置指令
Part2 events块
主要影响nginx服务器与用户的网络连接(配置连接属性be like),对服务器的性能影响较大
Part3 http块
大多数功能的定义和第三方模块的配置
–http全局块
–server块
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
全局server块主要负责指定虚拟主机监听配置、名称、IP配置等
Location块主要负责对传入的地址进行处理(某种意义上是个定制化的router?)
一个简单的 server块示例
1 | server{ |
上面的server块添加到htttp块之后,就可以通过访问81端口获取页面了
在server块里面进行代理设置
1 | server{ |
这样,用户在访问localhost:81的时候就可以跳转到baidu.com了
但是,如果想要把localhost换成其他的地址的话,似乎要配置一下本机的域名解析之类的东西
还有,proxy_pass不能缺少通信协议的前缀
代理的逻辑:
1 | proxy_pass没有上下文的时候: |
location通过匹配你的uri是否含有某个特定路径(通过正则表达式或者直接严格匹配)来决定要设置哪一个代理,所以,在请求服务的时候应当像直接向服务器发起请求一样写地址(或者说,nginx并不会处理请求,而是将host改变之后将uri原封不动传给服务器)
1.proxy_pass的目标地址,默认不带/,表示只代理域名,url和参数部分不会变(把请求的path拼接到proxy_pass目标域名之后作为代理的URL)
2.如果在目标地址后增加/,则表示把path中location匹配成功的部分剪切掉之后再拼接到proxy_pass目标地址
location的正则匹配(仅支持proxy_server没有上下文的时候)
该指令用于匹配 URL。
语法如下:1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配
2、:用于表示 uri 包含正则表达式,区分大小写。*:用于表示 uri 包含正则表达式,不区分大小写。
3、
4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字 符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
location的一些参数的作用
1 | root |
四、nginx docker的使用
docker中的一些目录地址以及挂载方法
1 | /usr/share/nginx/html #容器根目录 |
可以将宿主机的目录挂载到容器里面
1 | $ docker run --name mynginx2 \ |
可以将内容以及配置文件复制到配置目录里面
1 | FROM nginx |
还可以通过一个helper container实现在docker里面修改文件
第一步:创建nginx镜像并运行
1 | #dockerfile |
第二步:创建容器
1 | docker build -t mynginx_image2 . |
第三步:创建一个helper container
1 | docker run --name mynginx4 -p 80:80 -d mynginx_image2 |
第四步:运行helper container
1 | docker run -i -t --volumes-from mynginx4 --name mynginx4_files debian /bin/bash |
然后就可以进入debian的终端了
后面要再次使用的话
1 | docker start mynginx4_files |
使用docker控制nginx
nginx本身没有shell access,要重新加载docker里面的nginx的话,需要用docker kill命令给容器传输一个HUP信号
1 | docker kill -s HUP container-name |
如果要重启nginx的话,直接重启容器就好
1 | docker restart container-name |