nginx学习总结(不包含安装过程)

1. nginx常见配置

http服务上支持【若干虚拟主机】。每个虚拟主机对应一个server配置项,配置项里面包含该虚拟主机相关的配置。

java 复制代码
server{
    listen 80 default;
    server_name www.yonqin.com;
    index index.html index.htm index.php;
    root /data/www;

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${
        expires      30d;
    }

    location ~ .*\.(js|css)?${
        expires      1h;
    }
}
  • listen 80; 监听端口,默认80,小于1024的要以root启动。可以为listen :80、listen 127.0.0.1:80等形式。
  • server_name www.yonqin.com 用于设置虚拟主机服务名称,如:127.0.0.1 、 localhost 、域名[www.baidu.comopen in new window | www.jd.comopen in new window],也可以进行正则匹配。
  • root /data/www 定义服务器的默认网站根目录位置。可以是linux的绝对路径(/xxx/xx),也可以是nginx安装目录的相对路径(html)。
  • index index.jsp index.html index.htm :定义路径下默认访问的文件名,一般跟着root放。
1.1 location 常见的配置项:

location通常用来匹配uri,其基本语法如下:

复制代码
location [=|~|~*|^~] /uri/ {}

(1)=表示匹配uri时必须做到完全匹配,如

复制代码
location = /index {}

(2)~表示匹配URI时是字母大小写敏感的,可以使用正则表达式。

(3)~*表示匹配URI时是忽略字母大小敏感的,可以使用正则表达式。

(4)^~表示匹配uri时只需满足前缀匹配即可

复制代码
# 所有 /./img/开头的uri会全部匹配
location ^~ /./img/ {}

(5)uri参数中是可以使用正则表达式的,如匹配以 .gif .jpg和.jpeg结尾的uri,如下:

复制代码
location ~* \.(gif|jpg|jpeg)$ {}

(6)以下方式可以匹配所有的uri

复制代码
location / {}

(7)@ 指定一个命名的location,一般用于内部重定义请求:

复制代码
location @name {...}
1.2文件路径的定义:

(1)以root方式设置资源路径

语法 root path ,默认 root html,可以在http、server、location模块中配置。

复制代码
location ^~ /backend {
	root /data/www/backend
}

如果url为 /backend/index/test.html则会返回/data/www/backend/backend/index/test.html这个文件。

(2)以alias方式设置资源路径

alias也是用来设置文件资源的,它和root不同点在于如何解读紧跟location后面的uri参数,可以在location中配置:

复制代码
location ^~ /backend {
	alias /data/www/backend
}

如果url为 /backend/index/test.html则会返回/data/www/backend/index/test.html文件。

alias会将location后的url部分丢弃掉,而root不会。

1.3 nginx做静态服务器

我们都知道,nginx的安装目录中有这样一个html的文件夹,这里只做一个基本的演示,进入后进行简单的修改即可, 修改index.html文件看 可以生效。

我们再结合nginx的基础配置文件中的以下内容:

复制代码
server {
    listen       80;
    server_name  localhost;

    location / {
        root   html;
        index  index.html index.htm;
    }
}

进入浏览器即可看到效果

2.反向代理解决跨域

在实现代理的过程中,我们需要将/api这个前缀删除掉,有以下两种方法,一种是重写url,如下:

复制代码
location ^~ /api/ {
    rewrite ^/api(.*)$ $1 break;
    proxy_pass http://127.0.0.1:8080;
}

更简单的做法是,在代理地址的后边加/,这样做也会去掉前缀,但不如以上方式灵活:

复制代码
location ^~ /api/ {
    proxy_pass http://127.0.0.1:8080/;
}

3. nginx为后端工程做负载均衡

3.1 upstream模块解读

nginx 的负载均衡功能依赖于 ngx_http_upstream_module模块。upstream 模块应该放于http{}标签内。

模块写法如下:

复制代码
upstream backend {
    ip_hash; 
    server backend1.example.com;
    server backend2.example.com:8080;
    server 127.0.0.1:8080;
    server backup2.example.com:8080;
}

然后在location处使用如下写法:

复制代码
location / {
    proxy_pass http://backend;
}

以上写法的意思就是,将来同一个url访问我们的服务时,服务可以由backend中的服务器按照某种特定规则轮流提供

3.2 ngixn负载均衡的五种算法

(1)round robin 轮询 (默认) 按时间顺序依次将请求分配到各个后台服务器中,挂掉的服务器自动从列表中剔除

复制代码
upstream bakend {  
   server 192.168.0.1 down;    
   server 192.168.0.2;  
}

(2)weight 轮询权重 weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下,或在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。

复制代码
upstream bakend {  
    server 192.168.0.1 weight=20;  
    server 192.168.0.2 weight=10;  
}

(3)ip_hash:每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。

复制代码
upstream bakend {  
    ip_hash;  
    server 192.168.0.1:88;  
    server 192.168.0.2:80;  
} 

(4)url_hash:按访问的URL的哈希结果来分配请求,使每个URL定向到同一台后端服务器,可以进一步提高后端服务器缓存的效率 ,Nginx本身不支持url_hash,需要安装Nginx的hash软件包。

复制代码
upstream backend {  
    server 192.168.0.1:88;     //使用hash语句时,不能在使用weight等其他参数
    server 192.168.0.2:80;  
    hash $request_uri;  
    hash_method crc32;    //使用hash算法
}

(5)fair算法:可以根据页面大小和加载时间长短智能地进行负载均衡,根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身不支持fair,要安装upstream_fair模块才能使用。

复制代码
upstream backend {  
    server 192.168.0.1:88;  
    server 192.168.0.2:80;  
    fair;  
}
简单的负载均衡的实践:
  1. 创建简单的SpringBoot项目 ,写一个controller层的接口 返回当前Java进程的监听端口号
java 复制代码
package spring.learn.nginx;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/nginx")
public class TestContoller {


    @Autowired
    private Environment env;
   
    @RequestMapping("/test")
    public String test(){ 
                         // 打印当前端口
        return "nginx yonqin port: "+ env.getProperty("server.port");
    }
}
  1. jar上传 并启动
  1. 配置nginx.conf

4.浏览器测试

三次请求访问不同的实例

4. nginx 做资源下载服务器
4.1 访问控制 allow/deny

Nginx 的访问控制模块默认就会安装,而且写法也非常简单,可以分别有多个allow,deny,允许或禁止某个ip或ip段访问,依次满足任何一个规则就停止往下匹配。如:

复制代码
location /status {
  stub_status on;
  access_log off;
  allow 192.168.10.100;
  allow 172.29.73.0/24;
  deny all;
}
4.2、列出目录 autoindex

打开nginx.conf文件,在location,server 或 http段中加入如下参数 ,通过配置可以做为资源下载站 下。

复制代码
location ^~ /file {
    root   /data/www;
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;
    charset utf-8,gbk;
}
  • autoindex on;运行列出目录内容。另外两个参数最好也加上去。
  • autoindex_exact_size off; 默认为on,显示出文件的确切大小,单位是bytes。改为off后,显示出文件的大概大小,单位是kB或者MB或者GB。
  • autoindex_localtime on; 默认为off,显示的文件时间为GMT时间。改为on后,显示的文件时间为文件的服务器时间。
4.3 演示 在nginx.conf 中配置
4.4 在浏览其中访问
相关推荐
一心0921 小时前
ubuntu 20.04.6 sudo 源码包在线升级到1.9.17p1
运维·ubuntu·sudo·漏洞升级
好好学习啊天天向上1 小时前
世上最全:ubuntu 上及天河超算上源码编译llvm遇到的坑,cmake,ninja完整过程
linux·运维·ubuntu·自动性能优化
你想考研啊2 小时前
三、jenkins使用tomcat部署项目
运维·tomcat·jenkins
代码老y3 小时前
Docker:容器化技术的基石与实践指南
运维·docker·容器
典学长编程3 小时前
Linux操作系统从入门到精通!第二天(命令行)
linux·运维·chrome
DuelCode3 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
爬山算法5 小时前
MySQL(116)如何监控负载均衡状态?
数据库·mysql·负载均衡
你想考研啊5 小时前
四、jenkins自动构建和设置邮箱
运维·jenkins
Code blocks5 小时前
使用Jenkins完成springboot项目快速更新
java·运维·spring boot·后端·jenkins
饥饿的半导体6 小时前
Linux快速入门
linux·运维