这里会对nginx常见用法做一下基本介绍,其他请参考 nginx文档
。
概述
ngnix
是一个服务器,可以用来做
- http服务器
- http反向代理服务器
- mail代理服务器
- tcp/udp代理服务器
基本用法
这里假定已经 下载
完。
nginx有主进程和一些工作进程,主进程负责读取和计算配置以及维护工作进程,工作进程处理真正的请求,配置文件默认为 /etc/nginx/nginx.conf
启动、停止和重启
相关操作要使用以下语法
nginx -s signal 复制代码
其中signal可取
- stop 强制立刻停止
- quit 停止但是要等当前的请求处理完
- reload 重启
- reopen 重新打开日志记录,可用于旧日志文件移走后,重新生成日志文件
配置文件的结构
nginx包含很多模块,我们可以使用配置文件中的指令进行控制。
一个简单的指令包含空格分开的name和参数,最后加一个分号。
一个块指令(block directive)和一个简单指令类似,但是结尾的不是分号而是一个花括号,如果在花括号中有其他指令,则被称为一个上下文(context),比如 events, http, server, and location。任何上下文之外的地方被认为是主上下文(main context),其中events and http指令在主上下文,server 在http上下文,location在server上下文。
井号后的内容被认为是注释。
静态资源服务
web服务器可以用来提供静态资源访问,可以根据请求来访问不同路径, 比如在http上下文添加以下配置
server { location / { root /data/www; } location /images/ { root /data; } } 复制代码
location块指令的参数进行匹配,如果一个请求能匹配到多个路径则以最长的为准。
比如请求 /
就会匹配第一个,去 /data/www/
获取资源,请求 /images/
就会匹配第二个,到 /data/images/
中获取资源。
代理服务器
代理服务器是一个服务器,当收到请求,会把请求发到被代理的服务器,然后将获取的请求发送给客户端。
我们这里做一个简单的代理服务器,接收80端口的请求,其中图片使用本地目录,其他请求发送到8080端口。
在配置文件中使用两个server块指令,第一个监听80端口,对于图片我们使用正则检查相关后缀,正则前面要使用 ~
。
server { location / { proxy_pass http://localhost:8080; } location ~ \.(gif|jpg|png)$ { root /data/images; } } 复制代码
另一个监听8080端口,在这里server上下文中包含root字段,当location上下文中没有root参数时会默认使用这个。
server { listen 8080; root /data/up1; location / { } } 复制代码
nginx怎么处理一个请求
基于name的虚拟服务器
我们可以配置三个监听80端口的虚拟服务器
server { listen 80; server_name example.org www.example.org; ... } server { listen 80; server_name example.net www.example.net; ... } server { listen 80; server_name example.com www.example.com; ... } 复制代码
这个配置会对请求header中的host字段进行路由,如果没有匹配到,就会路由到默认服务器,默认服务器是第一个,也可以通过参数default_server指定
server { listen 80 default_server; server_name example.net www.example.net; ... } 复制代码
如果不允许没有host字段的请求访问,则可以采用以下配置关闭连接,其中空字符的name可以对其进行匹配
server { listen 80; server_name ""; return 444; } 复制代码
这里的server_name可以使用以下形式表示
*.example.org mail.*
使用http负载均衡
跨多个应用实例的负载均衡通常用于优化资源利用、最大化吞吐量、减少延迟和容错。
我们可以使用nginx作为一个有效的负载均衡器来将流量分配到多个应用服务器,来提高性能、稳定性和可靠性。
nginx负载均衡的方法有三种
- round-robin 将请求轮流分配
- least-connected 将请求分配给最小序号的活跃连接
- 基于client的ip对应的hash值进行分配,这样可以保证同一个请求被同一个服务器处理
最简单的配置这样的
http { upstream myapp1 { server srv1.example.com; server srv2.example.com; server srv3.example.com; } server { listen 80; location / { proxy_pass http://myapp1; } } } 复制代码
默认round-robin,如果要使用least-connected或ip_hash则在服务器组中添加指令
upstream myapp1 { least_conn;#或ip_hash server srv1.example.com; server srv2.example.com; server srv3.example.com; } 复制代码
配置https
需要添加ssl参数(http2参数可以开启http2),和指定相关证书和私钥
server { listen 443 ssl http2; server_name www.example.com; ssl_certificate www.example.com.crt; ssl_certificate_key www.example.com.key; ... } 复制代码
为了将http请求转发给https所以,要把80端口的数据转发到https
server { listen 80; rewrite ^(.*)$ https://$host$1 } 复制代码
添加header
可以在 http, server, location上下文使用 add_header
添加响应header,语法
add_header name value [always]; 复制代码
比如
location / { add_header Cache-Control 0; } 复制代码
完结