nginx
是一个高性能的HTTP 和反向代理服务器,特点是占有内存少,并发能力强
用途:
- 可以作为静态页面的 web 服务器
- 正向代理(通过nginx代理 访问外部资源,比如fanqiang)
- 反向代理 (隐藏真实服务器地址,通过nginx反向访问实际服务器)
- 负载均衡 (相同请求分发到多台服务器)
- 动静分离 (把动态资源和静态资源分开部署)
配置:
配置文件内容
- 全局块:配置服务器整体运行的指令 例:worker_processes 1;#处理并发数配置
- events块:影响服务器与用户的网络连接 例:worker_connections 1024; #支持的最大连接数为1024
- http块
-
http全局块:http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等
-
server块:这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了
节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块读取其它server块配置文件
include vhost/*.conf;
1、全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
2、location 块
一个 server 块可以配置多个 location 块。
这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称
(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓
存和应答控制等功能,还有许多第三方模块的配置也在这里进行
应用
反向代理
- 方式1 效果:访问8080端口 跳转到8088服务
server {
listen 8080;
server_name localhost;
client_max_body_size 1024M;
location / {
proxy_pass <http://localhost:8088;
index index.html index.htm;
}
}
注:localhost可替换成实际ip
2. 方式2 效果:根据访问的路径跳转到不同端口的服务中
- 访问http://127.10.0.1:8081/test1/ 跳转到http://127.10.0.1:8088
- 访问http://127.10.0.1:8081/test2/ 跳转到http://127.10.0.1:8082
server {
listen 8081;
server_name localhost;
client_max_body_size 1024M;
location ~ /test1/ {
proxy_pass http://localhost:8088;
}
location ~ /test2/ {
proxy_pass http://localhost:8082;
}
}
- = :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配
成功,就停止继续向下搜索并立即处理该请求。 - ~:用于表示 uri 包含正则表达式,并且区分大小写。
- ~*:用于表示 uri 包含正则表达式,并且不区分大小写。
- ^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
注意:如果 uri 包含正则表达式,则必须要有~ 或者 ~ 标识。*
负载均衡
效果:访问nginx 8083代理地址 随机访问到两台主机8088地址
在http全局块中
http {
upstream myserver{
server 192.168.6.40:8088 weight=10;
server 192.168.6.162:8088 weight=10;
}
server {
listen 8083;
server_name localhost;
client_max_body_size 1024M;
location / {
proxy_pass http://myserver>;
}
}
分配策略
-
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。 -
weight
weight 代表权,重默认为 1,权重越高被分配的客户端越多
指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。 例如:upstream myserver{
server 192.168.6.40:8088 weight=10;
server 192.168.6.162:8088 weight=10;
} -
ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。 例如:
upstream myserver{
ip_hash
server 192.168.6.40:8088;
server 192.168.6.162:8088;
}
- fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream myserver{
server 192.168.6.40:8088;
server 192.168.6.162:8088;
fair;
}
动静分离
将动态请求和静态请求分开,nginx处理静态页面,tomcat处理动态页面 通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使
浏览器缓存过期时间,减少与服务器之前的请求和流量
server {
listen 8080;
server_name localhost;
client_max_body_size 1024M;
location / {
root D:\htmlTest;
index index.html index.htm;
}
location /api/ {
proxy\_pass http://localhost:8088;
}
}
- 代理websocket服务
server {
listen 80;
server_name localhost;
client_max_body_size 1024M;
location / {
#root html;
proxy_pass http://localhost:8088; #websocket地址
#index index.html index.htm;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; #方式
proxy_set_header Connection "upgrade"; #方式
proxy_read_timeout 3600s;
}
}
高可用集群
Keepalived+Nginx 主从模式
Keepalived+Nginx 双主模式
nginx的日志文件
-
/var/log/nginx
try_files $uri $uri/ /index.html;
nginx解决跨域请求
同源指 域名、协议、端口均相同
前后端分离项目,无论是否部署在同一台机器上,都应尽量使前后端项目暴露于同一域下【协议+主机+端口都相同】,方法就是在部署前端得Nginx上,使用同一个域来反向代理后端项目
- 好处
- 彻底、一劳永逸解决跨域
- 共享域名
- 利用反向代理隐藏后端地址
- 集中管理
- 配置方式
server {
# 0.与浏览器交互的只有这个Nginx虚拟服务器,浏览器看到的【协议+主机+端口】永远只有一个,整个交互过程始终处于同一域下,故不会出现跨域问题
listen 80;
server_name localhost;;
# 1.前端项目打包好的dist目录,放置到这个目录下
root /data/;
# 2.后端多个微服务接口通过统一网关(9000)对外暴露,nginx反向代理统一网官
# 3.【code|auth|admin|buy】是后端各微服务接口前缀,网关按这个前缀来路由请求。
location ~* ^/(code|auth|admin|buy) {
proxy_pass http://127.0.0.1:9000;
#proxy_set_header Host $http_host;
proxy_connect_timeout 15s;
proxy_send_timeout 15s;
proxy_read_timeout 15s;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
一个完整的例子
server {
listen 8087;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /usr/local/package/front/ps_report;
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://172.16.85.52:8082;
}
location /wx/ {
proxy_pass http://172.16.85.52:8082;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
https配置
listen 443 ssl;
ssl_certificate /home/httpscerts/cmfullchaincert.cer;
ssl_certificate_key /home/httpscerts/cmkey.key;
server_name tmp5.raisetech.cn;