nginx的原理和使用

0 阅读4分钟

什么是nginx

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。2011年6月1日,nginx 1.0.4发布。

其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站。

Nginx 是一个安装非常的简单、配置文件非常简洁(还能够支持perl语法)、Bug非常少的服务。Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级。

Nginx代码完全用C语言从头写成。官方数据测试表明能够支持高达 50,000 个并发连接数的响应。

通俗来讲

就是你用户很多, 项目不止搭建在一台服务器上时, 需要用户可以毫无感觉的通过访问一个域名自动分配的访问到不同服务器并且返回对应结果

  • 这一个域名就是代理服务器, 就是nginx
  • 这个自动分配就是nginx干的(反向代理)

反向代理

负载均衡

至于你想用户请求这些服务器的比重就用到负载均衡, 比如说第一个服务器大, 你想用户多请求她一点就可以把他的比重搞高一点, 详情百度

配置文件

查找安装路径: whereis nginx

在路径下有配置文件 nginx.conf

文件结构

#全局块
#user  nobody;
worker_processes  1;

#event块
events {
    worker_connections  1024;
}

#http块
http {
    #http全局块
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    #server块
    server {
        #server全局块
        listen       8000;
        server_name  localhost;
        #location块
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    #这边可以有多个server块
    server {
      ...
    }
}

常用命令

cd /usr/local/nginx/sbin/
./nginx  启动
./nginx -s stop  停止
./nginx -s quit  安全退出
./nginx -s reload  重新加载配置文件
ps aux|grep nginx  查看nginx进程

更改完配置文件后记得重新加载配置文件

最小应用

# 其他块省略没写

upstream test{
    server 127.0.0.1:8080 weight=1;
    server 127.0.0.1:8081 weight=1;
}

server {
    listen 80;
    server_name localhost;
    location / {
    proxy_pass http://test;
	}
}

这就是一个用到反向代理和负载均衡的最小应用

这段代码的意思就是当用户请求localhost:80时, 会被反向代理到http://test, 然后再通过负载均衡按权重分配到不同端口上(相当于不同的服务器上)

  • test: 随便起的名字
  • upstream: 负载均衡
  • listen: 监听端口号
  • server_name: 访问ip或域名
  • proxy_pass: 反向代理到的地址

简单使用

作为一个小白肯定没有那么大的用户量需要将项目搭建在几个服务器上, 对于我来说的话, 主要使用场景如下:

当我搭建好一个网站需要绑定域名的时候, 因为在域名商无法直接将域名绑定至ip:端口号, 所以需要我们按以下步骤:

  1. 在域名商将域名或二级域名通过记录类型A绑定至某一ip
  2. 然后在该服务器内配置nginx, 当用户通过该域名直接访问时自动反向代理到ip:端口号的地址, 相当于我们就反向代理到一个端口, 没有负载均衡
  3. 这样我们就可以通过访问域名到指定ip:端口号

eg:
在alist的官方文档中, 反向代理用到了

server {
    listen 80;
    server_name localhost;
    location / {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header Range $http_range;
        proxy_set_header If-Range $http_if_range;
      proxy_redirect off;
      proxy_pass http://127.0.0.1:5244;
      # the max size of file to upload
      client_max_body_size 20000m;
	}
}

这样当我们访问http://localhost时(http默认就是80端口), 会自动反向代理到http://127.0.0.1:5244, 如果你将域名绑定到localhost(服务器ip地址)了的话, 那么访问域名会直接访问到alist网站

注意事项

通常我们写的配置都会放在配置文件里, nginx默认情况下有一个主配置文件, 我们可以将写的配置放在主配置文件里, 但这样有一定的风险, 各个服务之间的配置可能会出现相互干扰, 尽管是每一个server并且用的大括号. 所以最好每个服务单独写在一个配置文件里, 并且每个单服务配置文件都要放在主配置文件包含的路径下