Nginx学习笔记

Nginx

以下内容基于nginx/1.14.0

什么是Nginx

  • 读音:engine x
  • 高性能HTTP和反向代理服务器

Nginx的优势

  • 占用内存少,并发能力强
  • 成本低廉、配置简单、运行稳定

安装与使用(Windows 10)

  1. cd到nginx目录
  2. 启动nginx: start nginxnginx.exe
  3. 停止nginx: nginx.exe -s stopnginx.exe -s quit
  4. 校验配置文件:nginx.exe -t
  5. 重启:nginx.exe -s reload

安装与使用(服务器ubuntu环境)

  • 安装
sudo apt update
sudo apt install nginx
  • 查看版本号
nginx -v	# 显示 nginx 的版本
nginx -V	# 显示 nginx 的版本,编译器版本和配置参数
  • 测试配置文件
nginx -t # 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
  • 启动服务
service nginx start
  • 停止服务
service nginx stop
  • 重启服务
service nginx restart
  • 不重启重新载入最新配置文件内容
service nginx reload
  • signal
nginx -s [signal] # send signal to a master process: stop, quit, reopen, reload
  • 测试配置文件
nginx -t # 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
  • 查看防火墙是否开启,inactive表示未开启
sudo ufw status
  • 如果运行着防火墙,还需要打开80和443端口
sudo ufw allow 'Nginx Full'

Nginx Full :此配置文件打开端口80(正常,未加密的网络流量)和端口443(TLS / SSL加密流量)

Nginx HTTP :此配置文件仅打开端口80(正常,未加密的网络流量)

Nginx HTTPS :此配置文件仅打开端口443(TLS / SSL加密流量)

  • 如果是云服务器,还要配置安全组。然后浏览器访问云服务器ip

在这里插入图片描述

  • systemctl
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
sudo systemctl reload nginx
  • 卸载Nginx
sudo service nginx stop

sudo apt --purge remove nginx-common 

sudo apt --purge remove nginx*

sudo apt autoremove

sudo apt install nginx
  • Nginx也可以用docker容器安装,参考https://www.cnblogs.com/lichmama/p/11366262.htm

  • nginx 从容停止命令,等所有请求结束后关闭服务

# 查看进程号
ps -ef | grep nginx

kill -QUIT  nginx主进程号
  • nginx 快速停止命令,立刻关闭nginx进程
ps -ef |grep nginx

kill -TERM nginx主进程号 
  • nginx 强制停止
kill -9 nginx主进程号

正向代理

  • 局域网中的客户端要访问局域网外的Internet,则需要通过代理服务器
  • 客户端需要配置代理服务器

在这里插入图片描述

反向代理

  • 对客户端来说,访问代理服务器就是访问真实服务器
  • 客户端不需要配置代理服务器

在这里插入图片描述

在这里插入图片描述

负载均衡

  • 配置多台服务器
  • 客户端访问反向代理服务器,由反向代理服务器选择由哪个真实服务器进行服务

动静分离

Java 中的资源可以分为动态和静态,动态需要经过 Tomcat 解析之后,才能返回给浏览器,例如 JSP 页面、Freemarker 页面、控制器返回的 JSON 数据等,都算作动态资源,动态资源经过了 Tomcat 处理,速度必然降低。对于静态资源,例如图片、HTML、JS、CSS 等资源,这种资源可以不必经过 Tomcat 解析,当客户端请求这些资源时,之间将资源返回给客户端就行了。此时,可以使用 Nginx 搭建静态资源服务器,将静态资源直接返回给客户端。

Nginx的配置文件

在/etc/nginx/目录下

  • 版本不同可能会有变化
  • conf.d:用户自己定义的conf配置文件目录
  • sites-available:系统默认设置的配置文件目录
  • sites-enabled:由sites-available中的配置文件转换生成的文件目录
  • nginx.conf:汇总以上三个配置文件的内容,同时配置我们所需要的参数
  • 1.21.6 版本中则存在以下文件 conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params, 直接在 conf.d 目录中修改 default.conf 或复制新建配置文件即可。
/etc/nginx/nginx.conf
  • 三大组成:全局块、events块、http块
  • http块中引入了其他配置文件
    在这里插入图片描述
  • 在部署需要的web服务时,我们可以拷贝sites-enabled中的default文件到conf.d目录下,并且修改名字为**.conf,然后进行配置
ubuntu@VM-0-11-ubuntu:~$ cd /etc/nginx/sites-enabled
ubuntu@VM-0-11-ubuntu:/etc/nginx/sites-enabled$ sudo cp default /etc/nginx/conf.d/my-config.conf
ubuntu@VM-0-11-ubuntu:/etc/nginx/sites-enabled$ sudo vim /etc/nginx/conf.d/my-config.conf
ubuntu@VM-0-11-ubuntu:/etc/nginx/sites-enabled$ service nginx reload
全局模块
  • user 用户,如果配置nginx后访问资源404,考虑这里配置的用户是否有权访问对应的资源

  • worker_processes 工作线程数。最多连接数:max_clients = worker_processes * worker_connections 。作为反向代理,max_clients为:max_clients = worker_processes * worker_connections/4. Since a browser opens 2 connections by default to a server and nginx uses the fds (file descriptors) from the same pool to connect to the upstream backend

事件模块
  • worker_connections 连接数
http块
  • location
location [ = | ~ | ~* | ^~] url{

}

=:用于不含正则表达式的 url 前,要求字符串与 url 严格匹配,匹配成功就停止向下搜索并处理请求。
~:用于表示 url 包含正则表达式,并且区分大小写。
~*:用于表示 url 包含正则表达式,并且不区分大小写。
^~:用于不含正则表达式的 url 前,要求 Nginx 服务器找到表示 url 和字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再匹配。
如果有 url 包含正则表达式,不需要有 ~ 开头标识。

location  = / {

  # matches the query / only.
  [ configuration A ] 
}

location  / {
  # matches any query, since all queries begin with /, but regular
  # expressions and any longer conventional blocks will be

  # matched first.
  [ configuration B ] 
}

location ^~ /images/ {
  # matches any query beginning with /images/ and halts searching,
  # so regular expressions will not be checked.

  [ configuration C ] 
}

location ~* \.(gif|jpg|jpeg)$ {
  # matches any request ending in gif, jpg, or jpeg. However, all
  # requests to the /images/ directory will be handled by

  # Configuration C.   
  [ configuration D ] 
}

# 命名路由
location / {
 try_files @joomla index.html;
}
location @joomla {
  rewrite ^(.*)$ /index.php?q=$1 last;
}

location  /i/ {
 alias   /spool/w3/images/;
}
  • root 和 alias的区别

root的处理结果是:root路径+location路径
alias的处理结果是:使用alias路径替换location路径
alias是一个目录别名的定义,root则是最上层目录的定义。
在一个server中,alias可以存在多个,但是root只能有一个
还有一个重要的区别是alias后面必须要用“/”结束,否则会找不到文件的。。。而root的“/”则可有可无~~

  • try_files
try_files file1 [file2 ... filen] fallback

This directive tells Nginx to test for each file's existence, and use the first found file as the URI. If none of the files are found, then the location fallback is called ("fallback" can be any name).

location / {

  try_files index.html index.htm @fallback;
}
 
location @fallback {
 root  /var/www/error;
 index index.html;
}

内置变量

在这里插入图片描述

应用

反向代理

  • 目标:通过访问服务器ip就能直接访问到tomcat

  • 安装两个tomcat

wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.27/bin/apache-tomcat-9.0.27.tar.gz

tar zxvf apache-tomcat-9.0.27.tar.gz
mv apache-tomcat-9.0.27 tomcat1
tar zxvf apache-tomcat-9.0.27.tar.gz
mv apache-tomcat-9.0.27 tomcat2
  • 修改tomcat端口,/path/to/tomcat/conf/server.xml

在这里插入图片描述

  • 这种修改对于8080端口冲突是可以解决的,但是如果想同时使用两个tomcat,那么这样的修改还不完整,因为还有其它的端口会冲突,还需要继续改

在这里插入图片描述

在这里插入图片描述

  • 修改tomcat2的端口

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 启动tomcat1
~/tomcat1/bin/startup.sh
  • 手动安装tomcat,修改端口太麻烦,也可以用docker安装tomcat

  • 在docker中运行tomcat服务器,服务器主机的8078和8079端口均映射到对应容器的8080端口

sudo docker run --name tomcat1 -d -p 8078:8080 tomcat
sudo docker run --name tomcat2 -d -p 8079:8080 tomcat
  • 如果在腾讯云服务器中测试,配置安全组规则,开放TCP协议下的8078和8079端口

在这里插入图片描述

  • 主机浏览器访问服务器ip:8078,出现tomcat首页

在这里插入图片描述

  • 配置nginx反向代理,server_name为服务器ip
sudo cp /etc/nginx/sites-enabled/default /etc/nginx/conf.d/tomcat.conf
sudo vim /etc/nginx/conf.d/tomcat.conf
sudo service nginx reload

在这里插入图片描述

  • 主机浏览器访问服务器ip,再次出现tomcat首页
  • 在webapps新建test目录,test目录下新建index.html
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Tomcat1</title>
    </head>
    <body>
        <p>Hello World!</p>
    </body>
</html>
  • 访问服务器ip/test/index.html,Hello World! 出来了

在这里插入图片描述

负载均衡

  • 修改/etc/nginx/nginx.conf,添加upstream,server后是主机ip:port

在这里插入图片描述

  • 修改/etc/nginx/conf.d/tomcat.conf

在这里插入图片描述

  • 浏览器访问服务器ip/test/index.html,可以看到同样的链接,访问到了不同的资源。如果一直是同个页面,多刷新几次就出现不同了。

在这里插入图片描述

在这里插入图片描述

  • 均衡策略

    • 轮询(默认),按时间顺序分配,如果后端服务器挂了,自动剔除
    • 加权轮询,权重越高,被轮询的几率越高,提供服务的机会越多,解决机器配置不均衡的问题
    upstream server_pool{
        server 192.168.5.21 weight=10;
        server 192.168.5.22 weight=10;
    }
    
    • ip_hash(源地址哈希),根据ip的hash分配,可以解决session共享问题
    upstream server_pool{
        ip_hash;
        server 192.168.5.21:80;
        server 192.168.5.22:80;
    }
    
    • fair,第三方,按照后端的响应时间来分配,响应时间短的优先分配
    upstream server_pool{
        server 192.168.5.21:80;
        server 192.168.5.22:80;
        fair;
    }
    
    • 随机
    • least_conn(最小连接数)

动静分离

  • 动态请求和静态请求分离,tomcat负责动态请求,Nginx负责静态请求
  • 实现:一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
    另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。

高可用性

  • 主备nginx服务器
  • 需要安装keepalived
  • 对外提供虚拟ip
  • keepalived将虚拟ip绑定到主备nginx服务器

限流

  • 漏桶算法

黑白名单

  • 不限流白名单
  • 限流黑名单

缓存

  • 静态资源缓存
    nn(最小连接数)

动静分离

  • 动态请求和静态请求分离,tomcat负责动态请求,Nginx负责静态请求
  • 实现:一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
    另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。

高可用性

  • 主备nginx服务器
  • 需要安装keepalived
  • 对外提供虚拟ip
  • keepalived将虚拟ip绑定到主备nginx服务器

限流

  • 漏桶算法

黑白名单

  • 不限流白名单
  • 限流黑名单

缓存

  • 静态资源缓存
  • 代理层缓存

开启 gzip 压缩

server {
    # 是否开启gzip
    gzip on;
    # 缓冲(压缩在内存中缓冲几块? 每块多大?)
    gzip_buffers 32 4K;
    # 推荐6 压缩级别(级别越高,压的越小,越浪费CPU计算资源)
    gzip_comp_level 6;
    # 开始压缩的最小长度(再小就不要压缩了,意义不在)
    gzip_min_length 1k;
    gzip_types text/plain
        text/css
        application/json
        application/javascript
        application/x-javascript
        text/xml
        application/xml
        application/xml+rss
        text/javascript;
    # 正则匹配UA,配置禁用gzip条件。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
    gzip_disable "MSIE [1-6]\.";
    # 开始压缩的http协议版本(可以不设置,目前几乎全是1.1协议)
    gzip_http_version 1.1;
    # 是否传输gzip压缩标志
    gzip_vary on;
}

开启缓存

# 缓存图片
location ~* ^.+\.(ico|gif|jpg|jpeg|png)$ { 
  access_log   off; 
  expires      30d; #根据自己需要修改时间
}

# 缓存js、css、视频文件
location ~* ^.+\.(css|js|txt|xml|swf|wav)$ {
  access_log   off;
  expires      24h;
}

# 缓存html类型文件
location ~* ^.+\.(html|htm)$ {
  expires      1h;
}

# 缓存字体文件,配合gzip更好
location ~* ^.+\.(eot|ttf|otf|woff|svg)$ {
  access_log   off;
  expires 30d;
}

可视化配置

https://www.digitalocean.com/community/tools/nginx?global.app.lang=zhCN

注:部分图片来自微信公众号——江南一点雨

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值