此帐号已被封,内容无法查看 此帐号的内容被自由微信解封
文章于 2022年7月1日 被检测为删除。
查看原文
被微信屏蔽
其他

Nginx 入门到实战,新手必懂!

推荐关注一个公众号

关注程序员小乐带你玩爆编程技术


哈喽,各位新来的小伙伴们,大家好!由于公众号做了改版,为了保证公众号的资源能准时推送到你手里,大家记得将程序员小乐的公众号 加星标置顶 ,在此真诚的表示感谢~


来源:segmentfault.com/a/1190000014893012


上一篇干货:Mybatis-Plus 官方神器发布!



正文



大家好,我是小乐。

一、环境

服务器版本:CentOS 7.2,为了保证学习阶段不遇到奇怪的事情,请保证以下四点(大神选择性无视)
  1. 确认系统网络

  2. 确认yum可用

  3. 确认关闭iptables

  4. 确认停用selinux
#查看iptables状态
systemctl status firewalld.service
#关闭防火墙(临时关闭)
systemctl stop firewalld.service
#查看SELinux状态 
getenforce
#临时关闭SELinux 
setenforce 0
安装一些系统基本工具,正常情况系统都会自带(没有在装哦)
yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake
yum -y install wget httpd-tools vim

二、Nginx是什么?

Nginx是一个开源且高性能、可靠的HTTP中间件、代理服务 其他的HTTP服务:
  1. HTTPD-Apache基金会

  2. IIS-微软

  3. GWS-Google(不对外开放)

近几年,Nginx的市场占有率越来越高,一度飙升,为什么呢?接下来我们就知道了!三、我们为什么选择Nginx?
1. IO多路复用epoll(IO复用)
如何理解呢?举个例子吧!有A、B、C三个老师,他们都遇到一个难题,要帮助一个班级的学生解决课堂作业。
老师A采用从第一排开始一个学生一个学生轮流解答的方式去回答问题,老师A浪费了很多时间,并且有的学生作业还没有完成呢,老师就来了,反反复复效率极慢。
老师B是一个忍者,他发现老师A的方法行不通,于是他使用了影分身术,分身出好几个自己同一时间去帮好几个同学回答问题,最后还没回答完,老师B消耗光了能量累倒了。
福利来了:Intellij IDEA 2021.2.3 最新版免费激活教程(可激活至 2099 年,亲测有效)
老师C比较精明,他告诉学生,谁完成了作业举手,有举手的同学他才去指导问题,他让学生主动发声,分开了“并发”。这个老师C就是Nginx。
2. 轻量级
  • 功能模块少 - Nginx仅保留了HTTP需要的模块,其他都用插件的方式,后天添加

  • 代码模块化 - 更适合二次开发,如阿里巴巴Tengine

3. CPU亲和
把CPU核心和Nginx工作进程绑定,把每个worker进程固定在一个CPU上执行,减少切换CPU的cache miss,从而提高性能。

三、安装与目录

本人使用了鸟哥的lnmp集成包,简单方便-推荐!
#执行这句语句,根据指引,将安装 nginx php mysql 可进入lnmp官网查看更详细的过程
#默认安装目录/usr/local
wget -c http://soft.vpser.net/lnmp/lnmp1.4.tar.gz && tar zxf lnmp1.4.tar.gz && cd lnmp1.4 && ./install.sh lnmp

#默认安装目录
/usr/local

四、基本配置

#打开主配置文件,若你是用lnmp环境安装
vim /usr/local/nginx/conf/nginx.conf

----------------------------------------

user #设置nginx服务的系统使用用户
worker_processes #工作进程数 一般情况与CPU核数保持一致
error_log #nginx的错误日志
pid #nginx启动时的pid

events {
    worker_connections    #每个进程允许最大连接数
    use #nginx使用的内核模型
}
我们使用 nginx 的 http 服务,在配置文件 nginx.conf 中的 http 区域,配置无数个 server ,每一个 server 对应这一个虚拟主机或者域名
http {
    ... ... #后面再详细介绍 http 配置项目
    
    server {
        listen 80 #监听端口;
        server_name localhost #地址
        
        location / { #访问首页路径
            root /xxx/xxx/index.html #默认目录
            index index.html index.htm #默认文件 
        } 
        
        error_page 500 504 /50x.html #当出现以上状态码时从新定义到50x.html 
        location = /50x.html { #当访问50x.html时
            root /xxx/xxx/html #50x.html 页面所在位置
        } 
    }
    
    server {
        ... ... 
    } 
}
一个 server 可以出现多个 location ,我们对不同的访问路径进行不同情况的配置 我们再来看看 http 的配置详情
http {
    sendfile  on                  #高效传输文件的模式 一定要开启
    keepalive_timeout 65        #客户端服务端请求超时时间
    log_format main XXX #定义日志格式 代号为main
    access_log /usr/local/access.log main #日志保存地址 格式代码 main
}

四、模块

查看 nginx 已开启和编联进去的模块,模块太多了,就不在这长篇大论,有需要自行百度吧~
另外搜索公众号Java后端栈回复关键字"面试”获取一份惊喜礼包。

#大写V查看所有模块,小写v查看版本
nginx -V
# 查看此配置文件 是否存在语法错误
nginx -tc /usr/local/nginx/conf/nginx.conf

五、静态资源 Web 服务

1. 静态资源类型

非服务器动态运行生成的文件,换句话说,就是可以直接在服务器上找到对应文件的请求

1. 浏览器端渲染:HTML,CSS,JS
2. 图片:JPEG,GIF,PNG
3. 视频:FLV,MPEG
4. 文件:TXT,任意下载文件

2. 静态资源服务场景-CDN

什么是CDN?例如一个北京用户要请求一个文件,而文件放在的新疆的资源存储中心,如果直接请求新疆距离太远,延迟久。使用nginx静态资源回源,分发给北京的资源存储中心,让用户请求的动态定位到北京的资源存储中心请求,实现传输延迟的最小化

2. nginx静态资源配置

配置域:http、server、location

http { 
     sendfile   on;
}

http { 
     sendfile   on;
     tcp_nopush on;
}

http { 
     sendfile   on;
     tcp_nopush on;
     tcp_nodelay on;
}

location ~ .*\.(gif|jpg)$ { 
    gzip on; 
    gzip_http_version 1.1; 
    gzip_comp_level 2; 
    gzip_types   text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss image/jpeg image/gif image/png; 
    root /opt/app/code; 
}

location ~ load^/download { 
    gzip_static on 
    tcp_nopush on;
    root /opt/app/code;
}


六、浏览器缓存

HTTP协议定义的缓存机制(如:Expires; Cache-control等 ),减少服务端的消耗,降低延迟

1. 浏览器无缓存

浏览器请求 -> 无缓存 -> 请求WEB服务器 -> 请求相应 -> 呈现

呈现阶段会根据缓存的设置在浏览器中生成缓存

2. 浏览器有缓存

浏览器请求 -> 有缓存 -> 校验本地缓存时间是否过期 -> 没有过期 -> 呈现

若过期从新请求WEB服务器

3. 语法配置

location ~ .*\.(html|htm)$ { 
    expires 12h; 
}

服务器响应静态文件时,请求头信息会带上 etag 和 last_modified_since 2个标签值,浏览器下次去请求时,头信息发送这两个标签,服务器检测文件有没有发生变化,如无,直接头信息返 etag 和last_modified_since,状态码为 304 ,浏览器知道内容无改变,于是直接调用本地缓存,这个过程也请求了服务,但是传着的内容极少。

七、跨站访问

开发 nginx 跨站访问设置

location ~ .*\.(html|htm)$ { 
     add_header Access-Control-Allow-Origin *;
     add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
     #Access-Control-Allow-Credentials true #允许cookie跨域
}

在响应中指定 Access-Control-Allow-Credentials 为 true 时,Access-Control-Allow-Origin 不能指定为 *,需要指定到具体域名。

相关跨域内容可参考 Laravel 跨域功能中间件 使用代码实现跨域,原理与nginx跨域配置相同

八、防盗链

防止服务器内的静态资源被其他网站所套用,此处介绍的 nginx 防盗链为基础方式,其它更加深入的方式将在之后的文章介绍

首先,需要理解一个nginx变量

$http_referer #表示当前请求上一次页面访问的地址,换句话说,访问 www.baidu.com 主页,这是第一次访问,所以 $http_referer 为空,但是 访问此页面的时候还需要获取一张首页图片,再请求这张图片的时候 $http_referer 就为 www.baidu.com。

然后配置

location ~ .*\.(jpg|gif)$ { 
    valid_referers none blocked 127.xxx.xxx.xx
    if ($invalid_referer) { 
        return 403;
    }
}

九、HTTP代理服务

Nginx可以实现多种代理方式

  • HTTP

  • ICMPPOPIMAP

  • HTTPS

  • RTMP

1. 代理区别

区别在于代理的对象不一样,正向代理代理的对象是客户端,反向代理代理的对象是服务端

2. 反向代理

语法:proxy_pass URL
默认:——
位置:loaction

server {
    listen 80;
    location / {
        proxy_pass http://127.0.0.1:8080/;
        proxy_redirect default;
        
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr; 
        
        proxy_connect_timeout 30; 
        proxy_send_timeout 60;
        proxy_read_timeout 60;
        
        proxy_buffer_size 32k;
        proxy_buffering on; 
        proxy_buffers 4 128k;
        proxy_busy_buffers_size 256k;
        proxy_max_temp_file_size 256k; 
    }
}

本文介绍了 Nginx 相关配置和场景,后面文章会介绍负载均衡和缓存服务相关知识。


最后给读者整理了一份BAT大厂面试真题,需要的可扫码加微信备注:“面试”获取。


--END--

(放到你圈子里,朋友们会感激您)PS:如果觉得我    的分享不错,欢迎大家随手点赞、在看。本文仅供交流学习 , 版权归属原作者。温馨提示:《程序员小乐》推文内容如有侵权请您告知我们会在第一时间处理或撤销;互联网是一个资源共享的生态圈,我们崇尚分享。往日好文:

硬核!一套基于SpringBoot + Vue 的开源物联网智能家居系统(附源码)!

Java 8 一行代码解决了空指针问题,太厉害了...

为什么国内 996 干不过国外的 955 呢?

阿里面试:“说一下从 url 输入到返回请求的过程”

一个月薪12000的北京程序员的真实生活

SQL 优化极简法则

在浏览器输入 URL 回车之后发生了什么(流程图,超详细版)

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存