码迷,mamicode.com
首页 > 其他好文 > 详细

Nginx

时间:2018-05-13 16:52:47      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:ati   发送   操作   这一   上下文   png   成功   安全   ror   

1.安装nginx

sudo apt-get install nginx

2.启动,停止nginx

nginx -c /usr/local/nginx/conf/nginx.conf // -c 为 nginx 的配置文件

 

nginx -s quit   //执行该命令的用户需要和启动的 nginx 的用户一致。

stop — 直接关闭 nginx
quit — 会在处理完当前正在的请求后退出,也叫优雅关闭
reload — 重新加载配置文件,相当于重启
reopen — 重新打开日志文件 比如,等待当前子进程处理完正在执行的请求后,结束 nginx 进程,可以使用下列命令

 

nginx 的主进程的进程 ID 是写死在 nginx.pid 文件中的。该文件通常放在 /usr/local/nginx/logs 或者 /var/run 目录下。比如,如果主进程的 ID 是 1628,为了发送 QUIT 信号来使 nginx 优雅退出,可以执行:kill -s QUIT 1628

为了得到所有正在运行的 nginx 进程,我们可能会使用到 ps 工具:ps -ax | grep nginx

3.重新加载配置

nginx -s reload //执行该命令的用户需要和启动的 nginx 的用户一致。

一旦主进程接收到重载配置文件的命令后,它会先检查配置文件语法的合法性,如果没有错误,则会重新加载配置文件。如果成功,则主进程会重新创建一个子进程并且发送关闭请求给以前的子进程。如果没有成功,主进程会回滚改动并且继续使用以前的配置。老的子进程在接受关闭的命令后,会停止接受新的请求并且继续处理当前的请求,直到处理完毕。之后,该子进程就直接退出了。

 

默认配置文件位置:这三个文件都在/etc/nginx下

/etc/nginx/nginx.conf(这个是文件,下面两个 是文件夹)

/etc/nginx/sites-available

/etc/nginx/conf.d

nginx的配置文件的读写顺序问题:nginx的配置文件是/etc/nginx/nginx.conf,这个配置文件中又引用了/etc/nginx/conf.d/和/etc/nginx/sites-enabled/这两个文件夹的配置文件,通过include来实现。所以,无论是直接在nginx.conf或者在conf.d、sites-enabled中配置都是可以的。

注意:nginx.conf中include命令是在http上下文中,这也就说明了在sites-available文件夹和conf.d文件夹下的文件是server块级指令。

这些全部都是默认的读写文件:所以我们可以直接在这些文件夹下进行创建,或者修改成自己的。默认的配置文件已经包含了一些关于 server 指令的样式,大多数情况下直接把他们给注释掉。

4.配置文件的基本结构

# 开头的行,会被当做注释。

nginx 是由一些模块组成,我们一般在配置文件中使用一些具体的指令来控制它们。指令被分为简单指令和块级命令。

简单指令是由名字和参数组成,中间用空格分开,并以分号结尾:
// 简单指令
root /data/www;


块级指令和简单指令一样有着类似的结构,但是末尾不是分号而是用 { 和 } 大括号包裹的额外指令集。

上下文:如果一个块级指令的大括号里有其他指令,则它被叫做一个上下文(比如:events,Module ngx_http_core_module,server,和 location。在配置文件中,没有放在任何上下文中的指令都是处在主上下文中。events 和 http 的指令是放在主上下文中,server 放在 http 中, location 放在 server 中。

 

# this is a comment
events {
worker_connections 4096; ## Default: 1024
}

http {
server {
listen 80;
server_name domain1.com www.domain1.com;
access_log logs/domain1.access.log main;
root html;

location ~ \.php$ {
fastcgi_pass 127.0.0.1:1025;
}
}
}

 

 

5.搭建nginx静态服务器

location指令:一个重要的网络服务器的任务是处理文件(比如图片或者静态 HTML 文件)。一旦 nginx 决定哪个服务进程处理请求,它会根据在 server 块级指令中定义好location 指令的参数,来匹配请求头中指定的 URI。

root命令:文件会从不同的目录中映射(取决于取决于location后的正正则)。

server指令:该配置文件可能会包含多个 server 指令。这些 server 指令监听不同的端口和服务器名。

默认的配置文件已经包含了一些关于 server 指令的样式,大多数情况下直接把他们给注释掉。现在,注释掉其他的区块,然后写一个新的 server 区块(新的server区块要在http下):

http {
    server {
    location / {
        root /data/www;
      } } }

 

 

该 location 指令相对于请求中的 URI 执行了 “/” 的前缀。为了匹配请求,URI 会被添加到 root 命令指定的路径后,即 /data/www,得到本地文件系统中请求文件的路径。如果,有几个 location 匹配到,那么 nginx 会选择最长的前缀。上面的 location 提供了长度为 1 的前缀,所以,仅当其他的 location 匹配失败后,该指令才会使用。 接着,添加第二个 location 区块:

location /images/ {
root /data;
}
它会匹配到以 /images/ 开头的请求(location / 也会匹配到该请求,只是前缀更短) server 块级命令的配置结果如下:

server {
location / {
root /data/www;
}

location /images/ {
root /data;
}
}
这已经是一个可用的服务器配置,它监听标准的 80 端口并且可以在本地上通过 http://localhost/ 访问。

对于 URI 以 /images/ 开头的请求,服务器会从 /data/images 目录中,返回对应的文件。例如,nginx 会返回 /data/images/example.png 文件,当接收http://localhost/images/example.png 的请求响应时。如果该文件不存在,nginx 会返回一个 404 错误的响应。没有以 /images/ 开头的 URI 的请求,将会直接映射到 /data/www 目录中。

 

修改location指令集,使他返回一些典型后缀的图片文件请求,现在它只会映射带有 /images/ 前缀的请求到 /data/images 目录下。修改后的 location 指令如下:

location ~ \.(gif|jpg|png)$ {
    root /data/images;
}

该参数是一个正则表达式,它会匹配所有以 .gif,.jpg 或者 .png 结尾的 URIs。一个正则表达式需要以 ~ 开头。匹配到的请求会被映射到 /data/images 目录下。 当 nginx 在选择 location 去响应一个请求时,它会先检测带有前缀的 location 指令,记住先是检测带有最长前缀的 location,然后检测正则表达式。如果有一个正则的匹配的规则,nginx 会选择该 location,否则,会选择之前缓存的规则。 

 

比如,响应 http://localhost/some/example.html 的请求,nginx 会发送 /data/www/some/example.html 文件。 为了使用新的配置文件,如果还没开启 nginx 需要先开启,然后将重载信号发送给 nginx 的主进程,通过执行:

nginx -s reload

如果你发现有些地方出了问题,你可以在 /usr/local/nginx/logs 或者 /var/log/nginx 目录下的 access.log 和 error.log 文件中,找到原因。(如果你的server没有配置默认的access,和error目录,如果你配置了,那就去该去的地方找)

server {
listen 80;
server_name 140.143.62.230;
access_log /home/ubuntu/Logo_website/logs/access.log;
error_log /home/ubuntu/Logo_website/logs/error.log;

location / {

include uwsgi_params;

uwsgi_pass 127.0.0.1:5052;

uwsgi_param UWSGI_CHDIR /home/ubuntu/Logo_website;

uwsgi_param UWSGI_SCRIPT Logo_website:app;
}
location /image/ {

alias
/home/ubuntu/Logo_website/uploads_flask/;
}
}

6.配置nginx作为代理服务器

所谓反向代理,很简单,其实就是在location这一段配置中的root替换成proxy_pass即可。root说明是静态资源,可以由Nginx进行返回;而proxy_pass说明是动态请求,需要进行转发,比如代理到Tomcat上。

nignx有一个主进程,和n个子进程
主:加载和执行配置文件,并且驻留子进程
子:实际的请求处理

当server中的监听端口没有定义时,就是监听默认的80端口,

 

server {
    location / {
        proxy_pass http://localhost:8080;
    }

    location /images/ {
        root /data;
    }
}

上面就是一个简单的服务器,它监听在 8080 端口并且会映射所有的请求给 本地文件目录 /data/up1。

注意,root 指令是放在 server 上下文中。当响应请求的 location 区块中,没有自己的 root 指令,上述的 root 指令才会被使用。

 

 7.配置服务器名称

服务器名称是用server_name指令来定义的,并且它决定了哪一个server块将用来处理给定的请求。可以使用精确名称、通配符、正则表达式来定义服务器名称。

 

8.端口号

    服务器和客户端都有端口号,但是,服务器的端口号是重要的,因为客户端只有了解了服务器的地址和端口号,才可以连接到它(即使是采用UDP传输数据,也需要指定发送目标的地址和端口号);而客户端的端口号是无关紧要的,一般由操作系统自动分配。

本地端口是你主机上可以接的接口,简单地说,本地端口就是本地可以对外提供服务或与外界连接的接口。

服务器所有应用通信都是通过对应的端口建立的,端口范围是1-65535,window服务器默认远程管理服务端口是3389,为了增强安全性,一般都会更改3389端口。修改默认远程服务3389端口后(您也可以联系景安客服人员,让售后技术帮您进行修改),登录服务器时在ip地址后面输入”:端口号”就可以了。

服务端怎么知道和客户端的哪个进程连接???
---------------------------------------------------------
对于TCP,服务器在客户端连接后,会在监听套接字之外另外生成一个新的套接字,表示与客户端的连接,这个套接字了解客户端的地址和端口号,从而可以区分是哪个客户端;
对于UDP,服务器在收到UDP数据时,也了解数据来自什么地址和端口,也可以区分是哪个客户端。

从基本的网络概念来说,网络层(IP)负责两个主机间的通信,用IP地址区分主机;传输层(TCP和UDP)处理两个进程间(可以是在同一台机器中的两个进程,也可以是不同主机中的两个进程)的通信,用端口号区分进程。两者合起来就是,用 IP地址+传输层协议+端口号 来区分与谁进行通信。(传输层协议就是指TCP或者UDP,也可以是别的传输层协议,因为互联网协议栈是个开放的结构,其他传输层协议也可以利用IP作为网络层提供的服务)

不论是服务器编程还是客户端编程,其中设置的主机(ip地址),端口号都是服务器端的ip和端口号。客户端的端口号由系统自动分配。客户端端口号和服务器端的端口号没必要相同。服务器要监听客户机的链接,所以需要人为的设置绑定端口。这样客户端才能根据ip地址和端口号访问服务器。服务器端的accept()函数接收到客户端连接时,便重新建立一个socket,这个socket里面含有客户端的地址和端口号信息,以此实现服务器和客户端的通信。 侦听端口是服务器向客户端所开放的端口,也就是客户端要连接服务器需要的目标端口。通信端口是客户端去访问服务器端口时所携带的源端口,这两个端口号是不一样的,服务端侦听的端口号一般是固定的,而客户端的通信源端口号是随机产生的。

如果想自己指定客户端的端口,那么可以向在服务端一样,在socket()创建客户端套接字后,调用一下bind()函数来绑定本机端口。然后在调用connect()函数绑定服务器的主机和端口。

 

9.配置 HTTPS 服务器

修改 conf/nginx.conf 文件,必须在配置文件 server 块中的监听指令 listen 后启用 ssl 参数,并且指定服务器证书 ssl_certificate 和私钥 ssl_certificate_key 的位置:

server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate www.example.com.crt;
ssl_certificate_key www.example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
...
}
服务器证书是一个公共实体,它被发送给连接到服务器的每一个客户机。私钥是一个安全实体,应该存储在具有受限访问的文件中,但它必须可被nginx主进程读取。私钥也可以存储在与服务器证书相同的文件中:

ssl_certificate www.example.com.cert;
ssl_certificate_key www.example.com.cert;
在这种情况下,这个证书文件的访问权限也应受到限制。虽然证书和密钥存储在一个文件中,但只有证书被发送到客户端。

指令 ssl_protocols 和 ssl_ciphers 可用于限制仅包括强版本和密码的 SSL/TLS 连接。 默认情况下,NGINX 使 用ssl_protocols TLSv1 TLSv1.1 TLSv1.2版本和ssl_ciphers HIGH:!aNULL:!MD5密码,因此通常不需要显式地配置它们。需要注意的是,这些指令的默认值在不同的版本里面已经变更好几次了。

10.负载均衡

负载均衡【upstream】

上面的反向代理中,我们通过proxy_pass来指定Tomcat的地址,很显然我们只能指定一台Tomcat地址,那么我们如果想指定多台来达到负载均衡呢?

第一,通过upstream来定义一组Tomcat,并指定负载策略(IPHASH、加权论调、最少连接),健康检查策略(Nginx可以监控这一组Tomcat的状态)等。

第二,将proxy_pass替换成upstream指定的值即可。

负载均衡可能带来的问题?

负载均衡所带来的明显的问题是,一个请求,可以到A server,也可以到B server,这完全不受我们的控制,当然这也不是什么问题,只是我们得注意的是:用户状态的保存问题,如Session会话信息,不能在保存到服务器上。

缓存

缓存,是Nginx提供的,可以加快访问速度的机制,说白了,在配置上就是一个开启,同时指定目录,让缓存可以存储到磁盘上。具体配置,大家可以参考Nginx官方文档,这里就不在展开了。

 
 
 
 
 

11.虚拟主机

在同一个服务器上部署多个网站。

有的网站访问量大,需要负载均衡。然而并不是所有网站都如此出色,有的网站,由于访问量太小,需要节省成本,将多个网站部署在同一台服务器上。

例如将www.aaa.comwww.bbb.com两个网站部署在同一台服务器上,两个域名解析到同一个IP地址,但是用户通过两个域名却可以打开两个完全不同的网站,互相不影响,就像访问两个服务器一样,所以叫两个虚拟主机。

配置:

server {
    listen 80 default_server;
    server_name _;
    return 444; # 过滤其他域名的请求,返回444状态码
}
server {
    listen 80;
    server_name www.aaa.com; # www.aaa.com域名
    location / {
        proxy_pass http://localhost:8080; # 对应端口号8080
    }
}
server {
    listen 80;
    server_name www.bbb.com; # www.bbb.com域名
    location / {
        proxy_pass http://localhost:8081; # 对应端口号8081
    }
}

在服务器8080和8081分别开了一个应用,客户端通过不同的域名访问,根据server_name可以反向代理到对应的应用服务器。

虚拟主机的原理是通过HTTP请求头中的Host是否匹配server_name来实现的,有兴趣的同学可以研究一下HTTP协议。

另外,server_name配置还可以过滤有人恶意将某些域名指向你的主机服务器。

 

 

第一:location可以进行正则匹配,应该注意正则的几种形式以及优先级。(这里不展开)

第二:Nginx能够提高速度的其中一个特性就是:动静分离,就是把静态资源放到Nginx上,由Nginx管理,动态请求转发给后端。

第三:我们可以在Nginx下把静态资源、日志文件归属到不同域名下(也即是目录),这样方便管理维护。

第四:Nginx可以进行IP访问控制,有些电商平台,就可以在Nginx这一层,做一下处理,内置一个黑名单模块,那么就不必等请求通过Nginx达到后端在进行拦截,而是直接在Nginx这一层就处理掉。

 

Nginx

标签:ati   发送   操作   这一   上下文   png   成功   安全   ror   

原文地址:https://www.cnblogs.com/BlueFire-py/p/9032470.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!