文章目录
- 一、nginx是什么?
- 1、正向代理
- 2、反向代理
- 3、负载均衡
- 4、动静分离
- 二、nginx安装
- 三、常用命令
- 四、配置文件
- 五、实战配置
- 1、upstream 定义上游服务器(后台提供服务的服务器)
- 2、 proxy_pass 配置代理服务器
- 3、配置负载均衡
- 4、配置跨域 CORS
- 总结
正文内容
一、nginx是什么?
Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。性能是 Nginx 最重要的考量,其占用内存少、并发能力强、能支持高达 5w 个并发连接数,最重要的是, Nginx 是免费的并可以商业化,配置使用也比较简单。
1、正向代理
正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
正向代理是为我们服务的,即为客户端服务的,客户端可以根据正向代理访问到它本身无法访问到的服务器资源。
正向代理对我们是透明的,对服务端是非透明的,即服务端并不知道自己收到的是来自代理的访问还是来自真实客户端的访问。
2、反向代理
反向代理是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
反向代理是为服务端服务的,反向代理可以帮助服务器接收来自客户端的请求,帮助服务器做请求转发,负载均衡等。
反向代理对服务端是透明的,对我们是非透明的,即我们并不知道自己访问的是代理服务器,而服务器知道反向代理在为他服务。
反向代理的优势:
- 隐藏真实服务器;
- 负载均衡便于横向扩充后端动态服务;
- 动静分离,提升系统健壮性;
3、负载均衡
Nginx 实现负载均衡的策略:
- 轮询策略:默认情况下采用的策略,将所有客户端请求轮询分配给服务端。这种策略是可以正常工作的,但是如果其中某一台服务器压力太大,出现延迟,会影响所有分配在这台服务器下的用户。
- 最小连接数策略:将请求优先分配给压力较小的服务器,它可以平衡每个队列的长度,并避免向压力大的服务器添加更多的请求。
- 最快响应时间策略:优先分配给响应时间最短的服务器。
- 客户端 ip 绑定策略:来自同一个 ip 的请求永远只分配一台服务器,有效解决了动态网页存在的 session 共享问题
4、动静分离
动静分离是指在 web 服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提示整个服务的访问性和可维护性。
一般来说,都需要将动态资源和静态资源分开,由于 Nginx 的高并发和静态资源缓存等特性,经常将静态资源部署在 Nginx 上。如果请求的是静态资源,直接到静态资源目录获取资源,如果是动态资源的请求,则利用反向代理的原理,把请求转发给对应后台应用去处理,从而实现动静分离。
使用前后端分离后,可以很大程度提升静态资源的访问速度,即使动态服务不可用,静态资源的访问也不会受到影响。
二、nginx安装
下载地址: http://nginx.org/download/nginx-1.4.2.tar.gz
1、安装准备: nginx依赖于pcre库,要先安装pcre
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
2、安装
cd /usr/local/src/
wget http://nginx.org/download/nginx-1.4.2.tar.gz
tar zxvf nginx-1.4.2.tar.gz
cd nginx-1.4.2
./configure --prefix=/usr/local/nginx
make && make install
3、启动
cd /usr/local/nginx, 看到如下4个目录
…conf 配置文件 里面的server参数很重要 如:listen端口、server_name
… html 网页文件
…logs 日志文件
…sbin 主要二进制程序
[root@localhost nginx]# ./sbin/nginx
*如出现问题:
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
…
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
不能绑定80端口,80端口已经被占用
(有时是自己装了apache,nginx等,还有更多情况是操作系统自带了apache并作为服务启动)
解决: 把占用80端口的软件或服务关闭即可
如图 使用pkill -9 http 关闭
三、常用命令
一、systemctl
systemctl enable nginx 开机自动启动
systemctl disable nginx 关闭开机自动重启
systemctl start nginx 启动nginx
systemctl stop nginx 停止nginx
systemctl restart nginx 重启nginx
systemctl status nginx 查看状态
二、nginx
nginx -s reload # 向主进程发送信号,重新加载配置文件,热重启
nginx -s reopen # 重启 Nginx
nginx -s stop # 快速关闭
nginx -s quit # 等待工作进程处理完成后关闭
nginx -T # 查看当前 Nginx 最终的配置
nginx -t # 检查配置是否有问题
nginx重新加载配置文件
/usr/local/nginx/sbin/nginx -t 测试配置文件修改是否正常
/usr/local/nginx/sbin/nginx -s reload 重新加载
四、配置文件
#main段配置信息
user nginx; # 运行用户,默认即是nginx,可以不进行设置
worker_processes auto; # Nginx 进程数,一般设置为和 CPU 核数一样
error_log /var/log/nginx/error.log warn; # Nginx 的错误日志存放目录
pid /var/run/nginx.pid; # Nginx 服务启动时的 pid 存放位置
#events段配置信息
events {
use epoll; # 使用epoll的I/O模型(如果你不知道Nginx该使用哪种轮询方法,会自动选择一个最适合你操作系统的)
worker_connections 1024; # 每个进程允许最大并发数
}
#http段配置信息
#配置使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置
http {
# 设置日志模式
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; # Nginx访问日志存放位置
sendfile on; # 开启高效传输模式
tcp_nopush on; # 减少网络报文段的数量
tcp_nodelay on;
keepalive_timeout 65; # 保持连接的时间,也叫超时时间,单位秒
types_hash_max_size 2048;
include /etc/nginx/mime.types; # 文件扩展名与类型映射表
default_type application/octet-stream; # 默认文件类型
include /etc/nginx/conf.d/*.conf; # 加载子配置项
# server段配置信息
server {
listen 80; # 配置监听的端口
server_name localhost; # 配置的域名
# location段配置信息
location / {
root /usr/share/nginx/html; # 网站根目录
index index.html index.htm; # 默认首页文件
deny 10.5.102.197; # 禁止访问的ip地址,可以为all
allow 10.5.102.198;# 允许访问的ip地址,可以为all
}
error_page 500 502 503 504 /50x.html; # 默认50x对应的访问页面
error_page 400 404 error.html; # 同上
}
}
- main 全局配置,对全局生效;
events 配置影响 Nginx 服务器与用户的网络连接; - http 配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置;
server 配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块;
location 用于配置匹配的 uri ;
upstream 配置后端服务器具体地址,负载均衡配置不可或缺的部分;
1、server_name 指令
server_name 指令 指定虚拟主机域名
域名匹配的四种写法:
精确匹配: server_name www.nginx.com ;
左侧通配: server_name *.nginx.com ;
右侧统配: server_name www.nginx.* ;
正则匹配: server_name ~^www\.nginx\.*$ ;
匹配优先级:精确匹配 > 左侧通配符匹配 > 右侧通配符匹配 > 正则表达式匹配
2、location 指令
server {
listen 80;
server_name www.nginx-test.com;
# 只有当访问 www.nginx-test.com/match_all/ 时才会匹配到/usr/share/nginx/html/match_all/index.html
location = /match_all/ {
root /usr/share/nginx/html
index index.html
}
# 当访问 www.nginx-test.com/1.jpg 等路径时会去 /usr/share/nginx/images/1.jpg 找对应的资源
location ~ \.(jpeg|jpg|png|svg)$ {
root /usr/share/nginx/images;
}
# 当访问 www.nginx-test.com/bbs/ 时会匹配上 /usr/share/nginx/html/bbs/index.html
location ^~ /bbs/ {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
location 中的反斜线
location /test {
...
}
不带 / 当访问 www.nginx-test.com/test 时,
Nginx 先找是否有 test 目录,如果有则找 test 目录下的 index.html ;
如果没有 test 目录, nginx 则会找是否有 test 文件
location /test/ {
...
}
带 / 当访问 www.nginx-test.com/test 时, Nginx 先找是否有 test 目录,
如果有则找 test 目录下的 index.html ,
如果没有它也不会去找是否存在 test 文件
- post 请求数据过大 nginx设置:
client_body_buffer_size 128k;
client_max_body_size 16m;
五、实战配置
在配置反向代理和负载均衡等等功能之前,有两个核心模块是我们必须要掌握的,这两个模块应该说是 Nginx 应用配置中的核心,它们分别是: upstream 、proxy_pass
1、upstream 定义上游服务器(后台提供服务的服务器)
示例:
upstream back_end_server{
server 10.5.102.197:8081
}
在 upstream 内可使用的指令:
server 定义上游服务器地址;
zone 定义共享内存,用于跨 worker 子进程;
keepalive 对上游服务启用长连接;
keepalive_requests 一个长连接最多请求 HTTP 的个数;
keepalive_timeout 空闲情形下,一个长连接的超时时长;
hash 哈希负载均衡算法;
ip_hash 依据 IP 进行哈希计算的负载均衡算法;
least_conn 最少连接数负载均衡算法;
least_time 最短响应时间负载均衡算法;
random 随机负载均衡算法;
2、 proxy_pass 配置代理服务器
proxy_pass http://127.0.0.1:8081
proxy_pass http://127.0.0.1:8081/proxy
URL 参数原则
- URL 必须以 http 或 https 开头;
- URL 中可以携带变量;
- URL 中是否带 URI ,会直接影响发往上游请求的 URL ;
接下来让我们来看看两种常见的 URL 用法:
proxy_pass http://10.5.102.197:8081
proxy_pass http://10.5.102.197:8081/
这两种用法的区别就是带 / 和不带 / ,在配置代理时它们的区别可大了:
不带 / 意味着 Nginx 不会修改用户 URL ,而是直接透传给上游的应用服务器;
带 / 意味着 Nginx 会修改用户 URL ,修改方法是将 location 后的 URL 从用户 URL 中删除;
不带 / 的用法:
proxy_pass http://10.5.102.197:8081
location /bbs/{
proxy_pass http://127.0.0.1:8080;
}
用户请求 URL : /bbs/abc/test.html
请求到达 Nginx 的 URL : /bbs/abc/test.html
请求到达上游应用服务器的 URL : /bbs/abc/test.html
带 / 的用法:
location /bbs/{
proxy_pass http://127.0.0.1:8080/;
}
用户请求 URL : /bbs/abc/test.html
请求到达 Nginx 的 URL : /bbs/abc/test.html
请求到达上游应用服务器的 URL : /abc/test.html
并没有拼接上 /bbs
3、配置负载均衡
配置负载均衡主要是要使用 upstream 指令
配置域名的话要设置hosts
vim /etc/hosts 进入配置文件
4、配置跨域 CORS
例如:
前端 server 的域名为: vote.cc.com
后端服务的域名为: vote.server.com
vote.cc.com 对 vote.server.com 发起请求一定会出现跨域(浏览器同源策略)。
将 server_name 设置为 vote.cc.com 然后设置相应的 location 以拦截前端需要跨域的请求,最后将请求代理回 vote.server.com
server {
listen 80;
server_name vote.cc.com;
location / {
proxy_pass vote.server.com;
}
}
总结
以上就是今天要讲的内容,本文介绍了nginx是啥以及使用