写点什么

Nginx 服务器配置

  • 2021 年 11 月 11 日
  • 本文字数:4819 字

    阅读完需:约 16 分钟

#}


}

another virtual host using mix of IP-, name-, and port-based configuration


#server {

listen 8000;

listen somename:8080;

server_name somename alias another.alias;

location / {

root html;

index index.html index.htm;

}

#}


#对应的机器的配置需要增加相应的路由规则。


location / {


rewrite "^/+UEP" /path/of/php break;


#...其他配置。


}

HTTPS server


#server {

listen 443 ssl;

server_name localhost;

ssl_certificate cert.pem;

ssl_certificate_key cert.key;

ssl_session_cache shared:SSL:1m;

ssl_session_timeout 5m;

ssl_ciphers HIGH:!aNULL:!MD5;

ssl_prefer_server_ciphers on;

location / {

root html;

index index.html index.htm;

}

#}


}


其实反向代理和负载均衡可以分开也能结合,因为配置起来是差不多的。主要配置就在 server 中。


反向代理的配置:


1,先在 upstream 中增加目标服务器的 IP 和端口


2,在 server 中的 location 中设置 proxy_pass 为上面的 upstream;


注意:需要设计多少个目标服务器(或者相同服务器不同端口),就有多少个 upstream 和 server,每个 sever 的 server_name 可以是 ip,也可以是域名。



根据不同的路径访问不用服务器和项目


upstream mt-uep {


server 192.168.1.61:9099;


}


upstream mt-ynnop {


server 192.168.1.61:8099;


}


upstream mt-nx {


server 192.168.1.63:9001;


}


server {


listen 8888;


server_name localhost;


location / {


#IP 过滤


if ($remote_addr = 192.168.5.87){


return 404;


}


proxy_pass http://mt-ynnop;


proxy_redirect off;


}


location /UEP{


proxy_pass http://mt-uep;


proxy_redirect off;


}


location /logs/MtnoWeb_log.log {


proxy_pass http://mt-nx;


proxy_redirect off;


}


error_page 500 502 503 504 /50x.html;


location = /50x.html {


root html;


}


}


实现负载均衡


upstream test {


server 192.168.1.61:9099 weight=5 max_fails=2 fail_timeout=3;


server 192.168.1.61:8099 weight=1 max_fails=2 fail_timeout=3;


}


server {


listen 8888;


server_name localhost;


location / {


proxy_pass http://test ;


proxy_redirect off;


}


比价一下负载均衡和反向代理,配置很像吧,如果想要对一个项目做负载均衡,可以把目标服务器绑定一组 upstream,然后 server 中代理一下就可以了。


Nginx 可以通过 kill -HUP cat logs/nginx.pid 关闭 nginx 进程达到重启 Nginx 的目的。比


start nginx


nginx.exe -s stop


nginx -s reload


要好用一些。并且可以通过这个结合 bat/shell 脚本以及定时任务实现 Nginx 日志按天(时间)分割。


Nginx 还可以配置 SSL 证书,确保网站安全访问。




分割线




之后有同事做了一次 Nginx 分享,有些地方没有了解到,现在补充一下,方便自己以后回忆。


Nginx 相对于 Apache 优势


  1. 高并发性能非常好,静态文件并发可以达到 5w/s

  2. 反向代理性能非常好,可以用作负载均衡

  3. 内存和 CPU 占用率很低,约为 Apache 的 1/5~1/10

  4. 对后端服务器有健康检查的功能

  5. 支持 PHPcgi 方式和 fastcgi 方式

  6. 配置代码简洁,且容易上手


Nginx 支持高并发的原因


Nginx 的高并发得益于 epoll 模型,这种模型是异步非阻塞的,而 Apache 使用的是 select 模型


select 模型:句柄有事件响应时,select 遍历所有的句柄才能获取哪些句柄有事件通知


epoll 模型:epoll 对于句柄事件的选择不是遍历,而是事件响应,句柄上有事件就马上选择出来。


(1)select,poll 实现需要自己不断轮询所有 fd 集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。而 epoll 其实也需要调用 epoll_wait 不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪时,调用回调函数,把就绪 fd 放入就绪链表中,并唤醒在 epoll_wait 中进入睡眠的进程。虽然都要睡眠和交替,但是 select 和 poll 在“醒着”的时候要遍历整个 fd 集合,而 epoll 在“醒着”的时候只要判断一下就绪链表是否为空就行了,这节省了大量的 CPU 时间。这就是回调机制带来的性能提升。


(2)select,poll 每次调用都要把 fd 集合从用户态往内核态拷贝一次,并且要把 current 往设备等待队列中挂一次,而 epoll 只要一次拷贝,而且把 current 往等待队列上挂也只挂一次(在 epoll_wait 的开始,注意这里的等待队列并不是设备等待队列,只是一个 epoll 内部定义的等待队列)。这也能节省不少的开销。


nginx -t


//这个命令是检测配置文件是否正确。


//最好在 nginx -s reload 命令之前执行-t ,x 先检查配置文件


location 匹配规则及优先级


语法规则:


=


^~


~


~*


/


/url


样例解释


locati


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


on = /url 等号表示精准匹配,只有完全匹配上才会生效,如找到,停止搜索


location ^~ /url ^~开头表示对 URL 路径进行前缀匹配,并且在正则匹配之前,若找到,停止匹配


location ~ /url 表示区分大小写的正则匹配,按照配置文件顺序匹配


location ~*表示不区分大小写的正则匹配,按照配置文件顺序匹配


location /url 不带任何修饰符,表示前缀匹配,在正则匹配之后


location / 一般匹配,任何没有匹配到其他的 location 的请求都会匹配到,相当于 default


优先级


精确匹配 > 正则匹配 > 一般匹配


题目


location = / {


[ configuration A ]


}


location / {


[ configuration B ]


}


location /documents/ {


[ configuration C ]


}


location ^~ /images/ {


[ configuration D ]


}


location ~* .(gif|jpg|jpeg)$ {


[ configuration E ]


}


The “/” request will match configuration [], A


the “/index.html” request will match configuration [], B


the “/documents/document.html” request will match configuration [], C


the “/images/1.gif” request will match configuration [], D


and the “/documents/1.jpg” request will match configuration []. E


静态页面管理


每个应用中通常都会有很多的静态资源,比如 jpg,png,css,js 等等。这些静态资源如果每次都需要从服务器请求无疑会浪费很多资源。这个时候就可以使用 nginx 实现动静分离。


server {


listen 80;


server_name localhost;


location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {


root html/static;


expires 1d;


#表示缓存在本地一天


}


}


虚拟主机


在真实的服务器环境,为了充分利用服务器资源,一台 nginx 服务器会同时配置 N 个虚拟域名主机,即多个域名对同一个 80 端口。


也可以用使用相同的域名配置不同的端口区分不同的虚拟主机。


Nginx 提供了三种虚拟主机配置方式,


  1. 基于 ip 的虚拟主机,

  2. 基于端口的虚拟主机,

  3. 基于域名的虚拟主机。


最常用的是第三种,相对于 ip 地址和端口号,域名更方便记忆和使用。



修改 nginx.conf 文件,添加两个虚拟主机,如下:


#配置虚拟主机 a.test.com


server { #监听的 ip 和端口,配置本机 ip 和端口


listen 80;


#虚拟主机名称是 a.test.com,请求域名 a.test.com 的 url 将由此 server 配置解析


server_name a.test.com;


#所有的请求都以/开始,所有的请求都可以匹配此


location location / {


#使用 root 指令指定虚拟主机目录即网页存放目录


root a_html;


#指定欢迎页面,按从左到右顺序查找


index index.html index.htm;


}


}


#配置虚拟主机 b.test.com


server {


listen 80;


server_name b.test.com;


location / {


root b_html;


index index.html index.htm;


}


}


######反向代理


Nginx 服务器的反向代理服务是其最常用的重要功能,由反向代理服务可以衍生出很多与此相关的 nginx 服务器重要功能。


我们工作中最常用的也是配置反向代理。


反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。



server {


listen 80;


server_name localhost;


location / {


#代理的地址


proxy_pass http://server2:8888;


}


}


负载均衡


当我们的业务规模越来越大的时候,访问量持续上升,此时一台服务器肯定是扛不住的。必需搭建集群,使用 nginx 的反向代理,由 nginx 将请求分发到每台机器,并进行负载均衡。


nginx 的 upstream 目前支持 4 种方式的分配


  1. 轮询(默认)


每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。


  1. weight


指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。


  1. ip_hash


每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。


  1. fair(第三方)


按后端服务器的响应时间来分配请求,响应时间短的优先分配。


  1. url_hash(第三方)


#配置上游服务器


upstream myservers {


server server2:8888 weight=10;


server server3:9999 weight=1;


}


server {


listen 80;


server_name localhost;


location / {


proxy_pass http://myservers;


}


}


pstream 每个设备的状态:


1.down 表示单前的 server 暂时不参与负载


  1. weight 默认为 1 。weight 越大,负载的权重就越大。


3.max_fails :允许请求失败的次数默认为 1.当超过最大次数时,返回 proxy_next_upstream 模块定义的错误


4.fail_timeout: max_fails 次失败后,暂停的时间。


5.backup: 其它所有的非 backup 机器 down 或者忙的时候,请求 backup 机器。所以这台机器压力会最轻。


共享会话


  1. Ip_hash


使用 ip_hash 这种方式的话,虽然可以达到共享会话的目的,但是假如我们 3 台 tomcat 同时在工作,访问 nginx,由 nginx 进行负载在其中一台 tomcat,假如此时这台 tomcat 出现故障无法访问,这时会话就不共享了。


  1. 基于 cookie


我们也可以把用户的各种信息保存在 cookie 中,用户每次请求都携带 cookie,接收到请求后就可以拿到 cookie 中的数据。但显而易见,这种方式十分危险。


基于 db(各种关系型数据库和非关系型数据库)


当然我们也可以将数据直接保存在数据库中,但如果访问量大,会频繁访问数据库,对数据库造成很大的压力。


  1. 基于 redis+cookie 共享 session


最好的方式就是将用户信息放到 redis 中进行存储,由于是基于内存,因此效率非常高。 此时 cookie 中只需保存我们 redis 中的 key,用户每次请求只要拿到 cookie 中的 key 然后再到 redis 中拿用户信息,不仅安全了,效率也提高了。



keepalive


是在 TCP 中一个可以检测死连接的机制。keepalive 实现 Nginx 高可用确保一个 Nginx 挂掉后可以重新启动




保留几分配置


1.静态文件


#user nobody;


worker_processes 1;


#error_log logs/error.log;


#error_log logs/error.log notice;


#error_log logs/error.log info;


#pid logs/nginx.pid;


events {


worker_connections 1024;


}


http {


include mime.types;


default_type application/octet-stream;


#log_format main 'remote_user [request" '

'body_bytes_sent "$http_referer" '

'"http_x_forwarded_for"';

#access_log logs/access.log main;


sendfile on;


#tcp_nopush on;


#keepalive_timeout 0;


keepalive_timeout 65;


#gzip on;


server {


listen 8888;


server_name localhost;


location ~* .(jpg|txt|rar|mp4|)$ {


root E:/NGINX/nginx-1.16.0/file;


#expires 1d; #表示缓存在本地一天


}


error_page 500 502 503 504 /50x.html;


location = /50x.html {


root html;


}


}

another virtual host using mix of IP-, name-, and port-based configuration


#server {

listen 8000;

listen somename:8080;

server_name somename alias another.alias;

location / {

root html;

index index.html index.htm;

}

#}

HTTPS server


#server {

listen 443 ssl;

server_name localhost;

ssl_certificate cert.pem;

ssl_certificate_key cert.key;

ssl_session_cache shared:SSL:1m;

ssl_session_timeout 5m;

ssl_ciphers HIGH:!aNULL:!MD5;

ssl_prefer_server_ciphers on;

location / {

root html;

index index.html index.htm;

}

#}


}


2.虚拟主机


#user nobody;


worker_processes 1;

评论

发布
暂无评论
Nginx服务器配置