介绍和使用nginx 的记录

Nginx同Apache一样都是一种WEB服务器。Apache的发展时期很长,而且是毫无争议的世界第一大服务器。它有着很多优点:稳定、开源、跨平台等等。Apache 是一个重量级、高并发的服务器,在运行并发程序的时候,会消耗服务器大量内存。这导致了 Apache不可能成为高性能web 服务器。

轻量级高并发服务器Nginx就应运而生了。由于 Nginx 有以下特点:

  • Nginx使用基于事件驱动架构,使得其可以支持数以百万级别的TCP连接
  • 高度的模块化和自由软件许可证使得第三方模块层出不穷(这是个开源的时代啊~)
  • Nginx是一个跨平台服务器,可以运行在Linux,Windows,FreeBSD,Solaris,AIX,Mac OS等操作系统上

这些优秀的设计带来的是极大的稳定性。

概念

功能

nginx主要是做转发

(1)反向代理(Reverse Proxy):

maybe是使用最多的用途。

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。

客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。

反向代理,“它代理的是服务端,代服务端接收请求”,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。

反向代理的作用: (1)保证内网的安全,通常将反向代理作为公网访问地址,Web服务器是内网 (2)负载均衡,通过反向代理服务器来优化网站的负载

反向代理的意思是以代理服务器(这里也就是nginx)来接收网络上的请求,也就是url(默认是80端口),

1,nginx通过对url里面的一些判断(转达规则配置在nginx配置文件中),比如端口号(nginx默认是80)有可能是对二级域名来判断 比如test1.baidu.com,test2.baidu.com,这就是两个二级域名,这里的一级域名也就是baidu.com,DNS会将这两个域名都解析到同一个ip(需要添加二级域名解析才行(阿里云需要在域名解析中添加解析即可,不同的域名,可解析到统一ip的服务器上),也可以分别解析到不同ip) 2,nginx配置反向代理后可以将不同二级域名的请求转发到不同的可以提供相应服务的端口或者ip和端口

(2)负载均衡

这里提到的客户端发送的、Nginx反向代理服务器接收到的请求数量,就是我们说的负载量。请求数量按照一定的规则进行分发到不同的服务器处理的规则,就是一种均衡规则。所以,将服务器接收到的请求按照规则分发的过程,称为负载均衡。

负载均衡也是Nginx常用的一个功能,负载均衡其意思就是分摊到多个操作单元上进行执行。简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。Nginx支持的负载均衡调度算法方式如下:

weight轮询(默认,常用):接收到的请求按照权重分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,Nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。 ip_hash(常用):每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。 fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是Nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块。 url_hash:按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在Nginx作为静态服务器的情况下提高缓存效率。同样要注意Nginx默认不支持这种调度算法,要使用的话需要安装Nginx的hash软件包。

(3)http 服务器

Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,同时现在也很流行动静分离,就可以通过Nginx来实现。

如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。

动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。

(4)正向代理

正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。当你需要把你的服务器作为代理服务器的时候,可以用Nginx来实现正向代理。

正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息

客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的IP地址,还有代理程序的端口。

总结来说:正向代理,“它代理的是客户端,代客户端发出请求”

正向代理和反向代理的区别:1、正向代理:类似我们想要访问国外的Google服务器,但是由于访问限制,我们需要找一个代理去访问。换句话说,客户端明确知道要访问的服务器的地址,客户端把请求发送给代理,代理转发给服务器,服务器把响应传给代理,最后代理把响应传给客户端。我们可以看到客户端知道服务器是谁,但是服务器并不知道客户端是谁,这就是正向代理,隐藏了客户端的真实信息。2、反向代理:类似我们访问淘宝,由于访问量巨大,淘宝会使用许多台服务器(就是分布式服务器)来支持,但是每个客户端的请求到底由哪一台服务器来响应,我们需要一个代理来决定。换句话说,客户端并不知道要把请求发送给哪一台服务器,但是知道发送给哪一个代理,然后代理依据规则(响应时间,负载均衡等)决定把请求转发给哪一台服务器。可以看到,客户端并不知道他访问的服务器是谁,这就是反向代理,隐藏了服务器的真实信息。

正向代理的用途:

  • 访问原来无法访问的资源,如Google
  • 可以做缓存,加速访问资源
  • 对客户端访问授权,上网进行认证
  • 代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息

在正向代理中,Proxy和Client同属于一个LAN(图中方框内),隐藏了客户端信息;

在反向代理中,Proxy和Server同属于一个LAN(图中方框内),隐藏了服务端信息;

其他

Nginx是支持热启动的,也就是说当我们修改配置文件后,不用关闭Nginx,就可以实现让配置生效

Nginx是一款轻量级的HTTP服务器,采用事件驱动的异步非阻塞处理方式框架,这让 其具有极好的IO性能,时常用于服务端的反向代理和负载均衡

在Nginx上部署静态网站项目

如何将自己的网站部署到阿里云的服务器

echo “<!doctype html><meta http-equiv=“Content-Type"content=“text/html; charset=utf-8” />

恭喜你,部署静态项目成功啦~~~

” > index.html

实战

在阿里云 Ubuntu 机器上搭建 nginx

一: 安装软件

(下面的yum 是 centos 的命令,在 Ubuntu 中需要安装对应的软件,但是使用不同的命令)

1
dpkg -l | grep zlib

1 SSL功能需要openssl库,直接通过yum安装: #yum install openssl

2 gzip模块需要zlib库,直接通过yum安装: #yum install zlib

3 rewrite模块需要pcre库,直接通过yum安装: #yum install pcre

https://blog.csdn.net/z920954494/article/details/52132125

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
server {
        listen 80 default_server;            #监听端口,将来访问的端口
        listen [::]:80 default_server;

        root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;


        server_name _;

        location / {
                include uwsgi_params;
                uwsgi_pass 127.0.0.1:8000;    #uwsgi中配置的路径
        }

        location /static {
                alias /apps/xxx/static;       #静态资源路径
        }

        location /resume.ico  {
                alias /apps/xxx/static/resume.ico;    #网页图标路径
        }
}

安装的结构

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Ubuntu安装之后的文件结构大致为:
    1)所有的配置文件都在/etc/nginx下,并且每个虚拟主机已经安排在了/etc/nginx/sites-available下

    2)程序文件在/usr/sbin/nginx

    3)日志放在了/var/log/nginx中

    4)并已经在/etc/init.d/下创建了启动脚本nginx

    5)默认的虚拟主机的目录设置在了/var/www/nginx-default (有的版本默认的虚拟主机的目录设置在了/var/www, 请参考/etc/nginx/sites-available里的配置)

二:配置 nginx

安装成了之后,需要开启相应的服务

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
service nginx start

systemctl status nginx.service


修改文件之后,使用这个进行语法的检查

Turns out I can test if the configuration file is OK with:
nginx -t -c /etc/nginx/nginx.conf

nginx -t -c /etc/nginx/nginx.conf



sudo rm /etc/nginx/sites-enabled/default
sudo service nginx restart

报错原因:您已经有一个绑定到HTTP端口80的进程。您可以运行命令sudo lsof -i:80以使用该端口获取进程列表,然后停止/禁用Web服务器。 解决方案:您可以运行命令来停止使用端口80 sudo fuser -k 80 / tcp的进程

查看Nginx服务状态

1
service nginx status

在Nginx运行时,会查找/etc/sites-enabled目录下的所有配置文件用于显示对应内容。完成新的配置时,需要重启服务器:

sudo service nginx reload

检测配置文件是否有错误

1
2
3
root@[ESC实例]:~# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

然后reload 一下, 重启nginx

1
sudo nginx -s reload

重启nginx 服务

1
sudo systemctl restart nginx

简单命令

1
2
3
4
5
6
7
8
    sudo service nginx start        #启动
    sudo service nginx stop         #停止
    sudo service nginx restart      #重新启动
    sudo service nginx reload       #重新启动
    sudo nginx -s start     #启动
    sudo nginx -s stop      #停止
    sudo nginx -s restart   #重新启动
    sudo nginx -s reload    #重新加载配置

最新版本nginx配置是由4个文件构成:

  • conf.d:用户自己定义的conf配置文件
  • sites-available:系统默认设置的配置文件
  • sites-enabled:由sites-available中的配置文件转换生成
  • nginx.conf:汇总以上三个配置文件的内容,同时配置我们所需要的参数

sites-available 更像是一种资源文件夹, sites-enabled 是真正运行的文件夹,两者的关系是, sites-enabled是 sites-available 编译之后的结果。

在 Nginx 的默认配置文件 nginx.conf 中,最后一行写着 include /etc/nginx/conf.d/*.conf;说明只要是该目录下文件后缀为 conf 的文件都会被自动加载到 Nginx 配置中

1
2
3
4
5
6
scp -r jeng@112.126.63.128:/home/jeng/notebook ./
ssh -oPort=6001 jeng@123.56.8.10
ssh -oPort=6001 peiyi@123.56.8.10
ssh -oPort=6001 root@123.56.8.10
ssh -oPort=6001 shichao@123.56.8.10

112.126.63.128

卸载

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 删除nginx,使用-purge 
sudo apt-get --purge remove nginx

# 移除全部不使用的软件
sudo apt-get autoremove

# 罗列和nginx 所有相关的软件,然后删除
dpkg --get-selections|grep nginx
sudo apt-get --purge remove nginx
sudo apt-get --purge remove nginx-common
sudo apt-get --purge remove nginx-core

# 查看nginx 正在运行的进程,如果有那么久kill 掉
ps -ef |grep nginx
sudo kill -9 XXX
1
2
3
4
5
6
7
最新版本nginx配置是由4个文件构成:

conf.d:用户自己定义的conf配置文件
sites-available:系统默认设置的配置文件
sites-enabled:由sites-available中的配置文件转换生成
nginx.conf:汇总以上三个配置文件的内容,同时配置我们所需要的参数
在部署需要的web服务时,我们可以拷贝sites-enabled中的default文件到conf.d并且修改名字为**.conf,然后进行配置

多看看这里的例子的解释:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
server {
    #服务启动时监听的端口
    listen 80 default_server;
    listen [::]:80 default_server;
    #服务启动时文件加载的路径
    root /var/www/html/wordpress;
    #默认加载的第一个文件
    index index.php index.html index.htm index.nginx-debian.html;
    #页面访问域名,如果没有域名也可以填写_
    server_name www.xiexianbo.xin;

    location / {
        #页面加载失败后所跳转的页面
        try_files $uri $uri/ =404;
    }
    
      
    #以下配置只服务于php
    # 将PHP脚本传递给在127.0.0.1:9000上监听的FastCGI服务器
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        # With php7.0-cgi alone:
        #fastcgi_pass 127.0.0.1:9000;
        # With php7.0-fpm:
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }

    # 如果Apache的文档为root,则拒绝访问.htaccess文件
    location ~ /\.ht {
        deny all;
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
upstream drugHumanArchives { 
        server 127.0.0.1:8213 weight=1; 
    }
server {
        listen       8199;
        server_name  localhost;
    location / {
            root   /data/test/narcV3.1/front;
            index  index.html index.htm;
        }
        
        location /drugHumanArchives
        {
            proxy_set_header   Host             $host:8199;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_cookie_path  /drugHumanArchives  /drugHumanArchives;
            proxy_set_header   Cookies          $http_cookies;
            proxy_pass http://drugHumanArchives/drugHumanArchives;
        }
}

1)upstream 配置后端服务本来的访问路径

   2)server 配置代理端口 listen:统一端口号 server_name:域名

    第一个location / 说明:访问http://10.196.10.50:8199/drugarchives 即可访问到服务器静态资源/data/test/narcV3.1/front/drugarchives /index..html

    第二个location /drugHumanArchives 说明 proxy_pass 代理路径 http://drugHumanArchives/drugHumanArchives; 第一个drugHumanArchives代表上面配置的upstream ,即http://127.0.0.1:8213/drugHumanArchives;

      访问http://10.196.10.50:8199/drugHumanArchives 即可代理到路径http://10.196.10.50:8213/drugHumanArchives

关于location 的问题

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
location = / {
# 精确匹配 / ,后面带任何字符串的地址都不符合
}

localtion /api {
# 匹配任何 /api 开头的URL,包括 /api 后面任意的, 比如 /api/getList
# 匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
}

localtion ~ /api/abc {
# 匹配任何 /api/abc 开头的URL,包括 /api/abc 后面任意的, 比如 /api/abc/getList
# 匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
}
以/ 通用匹配, 如果没有其它匹配,任何请求都会匹配到
=开头表示精确匹配
如 A 中只匹配根目录结尾的请求,后面不能带任何字符串。
^~ 开头表示uri以某个常规字符串开头,不是正则匹配
~ 开头表示区分大小写的正则匹配;
~* 开头表示不区分大小写的正则匹配

nginx配置location总结及rewrite规则写法

1
2
3
4
5
6
7
配置nginx权限和静态文件统一
编辑nginx配置文件
vim /etc/nginx/nginx.conf
修改文件第一行的为静态文件的用户和组

# user 用户名 用户组  ; 这里的用户名和组就是静态文件的
user scott executor ;

如果访问不了,关闭Ubuntu系统中的防火墙:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
1].防火墙,重启后生效:

开启:chkconfig iptables on 

关闭:chkconfig iptables off

2].防火墙,即时生效,重启后失效:

开启:service iptables start 

关闭:service iptables stop

3].ubuntu系统下:

关闭防火墙:ufw disable 

开启防火墙:ufw enable

再次访问就能成功了。

常见的配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            #root   html;
            root   /home/webdemo/www/dist;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        # add by jeng, image server
        location ^~/images/ {
        alias /home/jeng/Projects/change_objects_api/results/;
        autoindex on;
        }
	# api 使用,映射到本地端口
        location ^~/api/ {
                proxy_pass http://127.0.0.1:8787/predict;
        }
        }
        

在centos 上设置开机自启(很重要的操作呀)

1
2
3
4
安装: yum install nginx
启动: systemctl start nginx
查看状态: systemctl status nginx
开机自启: systemctl enable nginx.service

彻底删除CentOS上的Nginx方法

nginx 实现上传功能

  1. 安装 nginx-upload-module

Nginx有一个Upload模块,可以非常简单的实现文件上传功能。此模块的原理是先把用户上传的文件保存到临时文件,然后在交由后台页面处理,并且把文件的原名,上传后的名称,文件类型,文件大小set到页面。

下载对应版本的 nginx (主要是想要有configure 文件)

下载file upload 的module地址:

https://github.com/vkholodkov/nginx-upload-module

重新安装是最简单的事情,再之前的基础上进行二次安装是比较难的。

只能使用

1
make

而不能使用

1
make & install

(这样会重新安装)

关键是最后要替换新版本的 nginx

1
2
3
4
5
6
7
8
# 备份
mv /data/services/nginx/sbin/nginx  /data/backup/nginx/nginx_$(date +%F)

# 更新
cp /data/packages/nginx/nginx-1.16.0/objs/nginx /data/services/nginx/sbin/

# 查看
/data/services/nginx/sbin/nginx -V

Nginx:编译安装/动态添加模块

  1. nginx配置文件

上传file 功能的具体配置参考如下的代码

Nginx Upload Module 上传文件功能

public/index.html 文件中添加如下的内容

1
<html><body>Hello World From The Frontend Container</body></html>

常用的命令

How to Start, Stop, or Restart Nginx

1
2
3
4
5
start: Starts the Nginx service.
stop: Terminates the Nginx service.
restart: Stops and then starts the Nginx service.
reload: Gracefully restarts the Nginx service. On reload, the main Nginx process shuts down the child processes, loads the new configuration, and starts new child processes.
status: Shows the service status.

使用 Ubuntu 操作命令

1
2
3
4
5
sudo systemctl restart nginx

sudo /usr/sbin/nginx -s reload
sudo systemctl start nginx
sudo systemctl stop nginx
1
2
3
4
5
# 查看进程
ps aux | grep nginx

#  杀死进程
sudo killall nginx