NGINX从入门到精通,学会这些就够了

20200622104645

工作这么多年一直用的都是NGINX,也一直想写总结,不过之前都是在上班,下班后就比较懒了,所以一直搁置着,趁着现在离职了有时间,就想把之前欠下的都补上,也算是对自己近年来工作技能的总结,希望这篇文章能帮助到你。

什么是nginx

Nginx(发音同“engine X”)是异步框架的网页服务器,也可以用作反向代理、负载平衡器和HTTP缓存。该软件由伊戈尔·赛索耶夫创建并于2004年首次公开发布。2011年成立同名公司以提供支持。2019年3月11日,Nginx公司被F5 Networks以6.7亿美元收购。

nginx的应用场景

nginx安装

下载nginx_modules(ps:编译的时候会用到)
链接: https://pan.baidu.com/s/1MjVdVkF4EAjhPfLImRfWMA 密码: wwgb

 1#!/usr/bin/env bash
 2
 3DIR=/Users/shiwenyuan/webserver
 4mkdir -p $DIR
 5cd $DIR
 6mkdir run
 7
 8tar -zxvf /Users/shiwenyuan/totalXbox/project/phpstorm/xlegal/devops/opbin/nginx_modules.tgz -C $DIR
 9
10mkdir tmp
11cd tmp
12
13wget http://nginx.org/download/nginx-1.8.1.tar.gz -O nginx-1.8.1.tar.gz
14
15tar -zxvf nginx-1.8.1.tar.gz
16
17cd nginx-1.8.1
18
19./configure \
20--with-http_realip_module \
21--with-http_stub_status_module \
22--with-http_addition_module \
23--add-module=$DIR/nginx_modules/echo-nginx-module-master \
24--add-module=$DIR/nginx_modules/headers-more-nginx-module-master \
25--add-module=$DIR/nginx_modules/memc-nginx-module-master \
26--add-module=$DIR/nginx_modules/nginx-http-concat-master \
27--add-module=$DIR/nginx_modules/ngx_devel_kit-master \
28--add-module=$DIR/nginx_modules/ngx_http_consistent_hash-master \
29--add-module=$DIR/nginx_modules/ngx_http_enhanced_memcached_module-master \
30--add-module=$DIR/nginx_modules/ngx_http_upstream_ketama_chash-0.6 \
31--add-module=$DIR/nginx_modules/srcache-nginx-module-master \
32--with-pcre=$DIR/nginx_modules/pcre-8.38 \
33--prefix=$DIR
34if [[ $? -ne 0 ]];then
35    echo 'error occured\n'
36    exit 1
37fi
38make && make install
39cd $DIR
40/bin/rm -rf tmp
41/bin/rm -rf node_modules
42
43/sbin/nginx -t

nginx命令行常用命令

  • nginx # 启动nginx
  • nginx -s reload # 向主进程发送信号,重新加载配置文件,热重启
  • nginx -s reopen # 重启 Nginx
  • nginx -s stop # 快速关闭
  • nginx -s quit # 等待工作进程处理完成后关闭
  • nginx -t # 查看当前 Nginx 配置是否有错误
  • nginx -t -c <配置路径> # 检查配置是否有问题,如果已经在配置目录,则不需要-c

nginx配置文件详解

线上应用常常都是一个nginx上面会配置好几个域名,每个域名都会放到一个单独的配置文件里。然后在nginx.conf中引用这些文件,所以可以理解为每次nginx启动的时候都会默认加载nginx.conf,nginx.conf会把相关的server配置都引用进来形成一个大的nginx文件。

20200622144019

20200622144019

  • main:全局设置
  • events:配置影响Nginx服务器或与用户的网络连接
  • http:http模块设置
  • upstream:负载均衡设置
  • server:http服务器配置,一个http模块中可以有多个server模块
  • location:url匹配配置,一个server模块中可以包含多个location模块

一个nginx配置文件的结构就像nginx.conf显示的那样,配置文件的语法规则:

  1. 配置文件由模块组成
  2. 使用#添加注释
  3. 使用$使用变量
  4. 使用include引用多个配置文件

nginx与php通信

访问路径

 1www.example.com/index.php
 2        |
 3        |
 4      Nginx
 5        |
 6        |
 7php-fpm监听127.0.0.1:9000地址
 8        |
 9        |
10www.example.com/index.php请求转发到127.0.0.1:9000
11        |
12        |
13nginx的fastcgi模块将http请求映射为fastcgi请求
14        |
15        | 
16  php-fpm监听fastcgi请求
17        |
18        | 
19php-fpm接收到请求,并通过worker进程处理请求
20        |
21        | 
22php-fpm处理完请求,返回给nginx
23        |
24        | 

nginx与php通信方式

tcp-socket

tcp socket通信方式,需要在nginx配置文件中填写php-fpm运行的ip地址和端口号,该方式支持跨服务器,即nginx和php-fpm不再统一机器上时。

1location ~ \.php$ {
2    include fastcgi_params;
3    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;;
4    fastcgi_pass 127.0.0.1:9000;
5    fastcgi_index index.php;
6}

unix-socket

unix socket通信方式,需要在nginx配置文件中填写php-fpm运行的pid文件地址。unix socket又叫IPC(inter process communication进程间通信)socket,用于实现统一主机上进程间通信。

1location ~ \.php$ {
2    include fastcgi_params;
3    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;;
4    fastcgi_pass unix:/var/run/php5-fpm.sock;
5    fastcgi_index index.php;
6}

两者间的区别

Unix socket 不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。所以其效率比 tcp socket 的方式要高,可减少不必要的 tcp 开销。不过,unix socket 高并发时不稳定,连接数爆发时,会产生大量的长时缓存,在没有面向连接协议的支撑下,大数据包可能会直接出错不返回异常。而 tcp 这样的面向连接的协议,可以更好的保证通信的正确性和完整性。

所以,如果面临的是高并发业务,则考虑优先使用更可靠的tcp socket,我们可以通过负载均衡、内核优化等手段来提供效率。

nginx配置动静分离

什么是动静分离

在Web开发中,通常来说,动态资源其实就是指那些后台资源,而静态资源就是指HTML,JavaScript,CSS,img等文件。
在使用前后端分离之后,可以很大程度的提升静态资源的访问速度,同时在开过程中也可以让前后端开发并行可以有效的提高开发时间,也可以有些的减少联调时间 。

动静分离方案

  • 直接使用不同的域名,把静态资源放在独立的云服务器上,这个种方案也是目前比较推崇的。
  • 动态请求和静态文件放在一起,通过nginx配置分开
 1server {
 2  location /www/ {
 3      root /www/;
 4    index index.html index.htm;
 5  }
 6
 7  location /image/ {
 8      root /image/;
 9  }
10}

nginx配置反向代理

反向代理常用与不想把端口暴露出去,直接访问域名处理请求。

 1server {
 2    listen    80;
 3    server_name www.phpblog.com.cn;
 4    location /swoole/ {
 5        proxy_pass http://127.0.0.1:9501;
 6    }
 7    location /node/ {
 8        proxy_pass http://127.0.0.1:9502;
 9    }
10
11}

nginx配置负载均衡

 1upstream phpServer{
 2    server 127.0.0.1:9501;
 3    server 127.0.0.1:9502;
 4    server 127.0.0.1:9503;
 5}
 6server {
 7    listen    80;
 8    server_name www.phpblog.com.cn;
 9    location / {
10        proxy_pass http://phpServer;
11        proxy_redirect     off;
12        proxy_set_header   Host             $host;
13        proxy_set_header   X-Real-IP        $remote_addr;
14        proxy_next_upstream error timeout invalid_header;
15        proxy_max_temp_file_size 0;
16        proxy_connect_timeout      90;
17        proxy_send_timeout         90;
18        proxy_read_timeout         90;
19        proxy_buffer_size          4k;
20        proxy_buffers              4 32k;
21        proxy_busy_buffers_size    64k;
22        proxy_temp_file_write_size 64k;
23    }
24}

常见的负载均衡策略

round-robin/轮询: 到应用服务器的请求以round-robin/轮询的方式被分发

1upstream phpServer{
2    server 127.0.0.1:9501 weight=3;
3    server 127.0.0.1:9502;
4    server 127.0.0.1:9503;
5}

在这个配置中,每5个新请求将会如下的在应用实例中分派: 3个请求分派去9501,一个去9502,另外一个去9503.

least-connected/最少连接:下一个请求将被分派到活动连接数量最少的服务器

1upstream phpServer{
2    least_conn;
3    server 127.0.0.1:9501;
4    server 127.0.0.1:9502;
5    server 127.0.0.1:9503;
6}

当某些请求需要更长时间来完成时,最少连接可以更公平的控制应用实例上的负载。

ip-hash/IP散列: 使用hash算法来决定下一个请求要选择哪个服务器(基于客户端IP地址)

1upstream phpServer{
2    ip_hash;
3    server 127.0.0.1:9501;
4    server 127.0.0.1:9502;
5    server 127.0.0.1:9503;
6}

将一个客户端绑定给某个特定的应用服务器;

nginx配置跨域

由于浏览器同源策略的存在使得一个源中加载来自其它源中资源的行为受到了限制。即会出现跨域请求禁止。
所谓同源是指:域名、协议、端口相同。

20200622140049

20200622140049

 1server {
 2        listen       80;
 3        server_name  www.phpblog.com.cn;
 4        root   /Users/shiwenyuan/blog/public;
 5        index  index.html index.htm index.php;
 6        location / {
 7            try_files $uri $uri/ /index.php?$query_string;
 8        }
 9        add_header 'Access-Control-Allow-Origin' "$http_origin";
10        add_header 'Access-Control-Allow-Credentials' 'true';
11        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT, PATCH';
12        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-XSRF-TOKEN';
13
14        location ~ \.php$ {
15            fastcgi_pass   127.0.0.1:9000;
16            fastcgi_index  index.php;
17            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
18            include        fastcgi_params;
19        }
20        error_page  404              /404.html;
21        error_page   500 502 503 504  /50x.html;
22        location = /50x.html {
23            root   html;
24        }
25}
  • Access-Control-Allow-Origin:允许的域名,只能填 *(通配符)或者单域名。
  • Access-Control-Allow-Methods: 允许的方法,多个方法以逗号分隔。
  • Access-Control-Allow-Headers: 允许的头部,多个方法以逗号分隔。
  • Access-Control-Allow-Credentials: 是否允许发送Cookie。

nginx配置https

此处可以参考我之前写的一篇文章
nginx配置https证书认证

nginx伪静态

应用场景

  • seo优化
  • 安全
  • 流量转发
1location ^~ /saas {
2    root /home/work/php/saas/public;
3    index index.php;
4    rewrite ^/saas(/[^\?]*)?((\?.*)?)$ /index.php$1$2 last;
5    break;
6}

日常工作中的奇淫技巧

日志切割脚本

 1#!/bin/bash
 2#设置你的日志存放的目录
 3log_files_path="/mnt/usr/logs/"
 4#日志以年/月的目录形式存放
 5log_files_dir=${log_files_path}"backup/"
 6#设置需要进行日志分割的日志文件名称,多个以空格隔开
 7log_files_name=(access.log error.log)
 8#设置nginx的安装路径
 9nginx_sbin="/mnt/usr/sbin/nginx -c /mnt/usr/conf/nginx.conf"
10#Set how long you want to save
11save_days=10
12
13############################################
14#Please do not modify the following script #
15############################################
16mkdir -p $log_files_dir
17
18log_files_num=${#log_files_name[@]}
19#cut nginx log files
20for((i=0;i<$log_files_num;i++));do
21    mv ${log_files_path}${log_files_name[i]} ${log_files_dir}${log_files_name[i]}_$(date -d "yesterday" +"%Y%m%d")
22done
23$nginx_sbin -s reload

图片防盗链

 1server {
 2  listen       80;        
 3  server_name  *.phpblog.com.cn;
 4
 5  # 图片防盗链
 6  location ~* \.(gif|jpg|jpeg|png|bmp|swf)$ {
 7    valid_referers none blocked server_names ~\.google\. ~\.baidu\. *.qq.com;
 8    if ($invalid_referer){
 9      return 403;
10    }
11  }
12}

nginx访问控制

1location ~ \.php$ {
2    allow 127.0.0.1;  #只允许127.0.0.1的访问,其他均拒绝
3    deny all;
4    fastcgi_pass   127.0.0.1:9000;
5    fastcgi_index  index.php;
6    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
7    include        fastcgi_params;
8}

丢弃不受支持的文件扩展名的请求

1location ~ \.(js|css|sql)$ {
2    deny all;
3}

后话

创作不易,希望对你有所帮助。
如果本篇博客有任何错误,请批评指教,不胜感激!!!

原创不易,转载请注明处。
文章将持续更新中,可以通过微信搜索[石先生的私房菜]或者下方二维码关注第一时间阅读和催更,除了博客以外还会定期发送leetcodephp版题解

20200619155130

20200619155130

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Nginx(发音为“Engine X”)是一个高性能的Web服务器和反向代理服务器。它以其轻量级、高性能和可扩展性而闻名,并且被广泛用于许多大型的互联网公司和网站。 要从入门到精通Nginx开发,你需要掌握以下几个方面: 1. 理解Nginx的基本原理:Nginx采用异步、非阻塞的事件驱动模型,可以同时处理大量的并发请求。你需要了解Nginx的事件循环机制、多进程模型以及其与其他服务器的区别。 2. 学习配置NginxNginx使用基于文本的配置文件来对服务器进行配置。你需要学习配置文件的语法、常用指令和块结构,并能够根据需求配置虚拟主机、反向代理、负载均衡等功能。 3. 理解Nginx模块机制:Nginx采用模块化的架构,允许开发者根据需求编写自定义模块。你需要了解Nginx模块的开发原理、常用的API接口和开发方式,以及如何将自定义模块和Nginx进行编译和链接。 4. 学习使用Nginx扩展功能:Nginx提供了许多扩展功能,例如HTTP缓存、SSL/TLS支持、HTTP/2协议等。你需要学习如何配置和使用这些功能,以提高性能和安全性。 5. 掌握Nginx调优和故障排除:Nginx在高并发和大规模访问下表现出色,但需要进行一些调优和故障排除。你需要学习如何监控Nginx服务器的性能、调整配置参数以优化性能,并能够快速识别和解决常见的故障。 总之,要从入门到精通Nginx开发,需要通过学习理论知识、实践项目和阅读优秀的开发资源来不断提升自己。同时,参与开源社区和与其他开发者的交流也是提高自己的好方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值