Linux03_Nginx服务器


#  Nginx服务器

### 一、Nginx概述

##### 1、简介

~~~markdown
1. 什么Nginx
    Nginx是一款轻量级的Web服务器/反向代理服务器,其特点是占有的内存少,并发能力强。
~~~



##### 2、Nginx的作用

~~~markdown
1. 处理静态资源(动静分离)
           (1) 之前是将项目中的所有请求(包括静态请求和动态请求)都交给了uwsgi服务器来完成,现在要将静态资源的请求交给Nginx服务器完成,而将动态请求交给uwsgi服务器。
           (2) Nginx是一个HTTP服务器,可以将服务器上的静态文件通过HTTP协议展现给客户端,所以可以将静态资源的处理交给Nginx服务器。
           (3) Nginx提供的动静分离是指将动态请求和静态请求分开,目的是合适的服务器去处理合适的请求,使整个服务器的性能、效率最高。 
           (4) Nginx服务器更适合做静态内容的处理,uWSGI服务器更适合做动态内容的处理。
           (5) 客户端直接访问Nginx服务器,留下静态部分自己处理,然后动态部分转发给uwsgi服务器,最终实现“动静分离”。

2. 反向代理服务器
        Nginx接收intenet上的请求,然后将请求转发给内部网络上的其它服务器(uwsgi),并将uwsgi服务器上得到的结果返回给客户端浏览器,此时nginx对外表现就是一个反向代理服务器。
        代理:中介、律师、经销商(代理商)    客户租房请求 -> 中介 -> 房东
        

3. 负载均衡
        主要用于高并发的情况下,其原理是将数据流量(请求)分摊到多个服务器(uwsgi)执行,减轻服务器的压力,多台服务器(集群)共同完成工作,从而提高了数据的吞吐量。
~~~



### 二、Nginx的安装

~~~markdown
1. 下载并发送tar包给Linux

2. 解压tar包 
        tar -zxvf  nginx-1.11.1.tar.gz
        
3. 安装依赖
        yum install gcc zlib-devel pcre-devel
        
4. 进入解压目录执行
        ./configure
        
5. 编译并安装
        make && make install
~~~



~~~markdown
安装目录结构:
1. 配置文件路径
        /usr/local/nginx/conf
    
2. 日志文件路径    
        /usr/local/nginx/logs
    
3. HTML文件路径
        /usr/local/nginx/html    
        
4. 可执行文件路径
        /usr/local/nginx/sbin
        

# 为了能够在任意目录下直接使用nginx指令:
    ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
~~~



~~~markdown
# 启动/停止/重启

1. 启动
        [root@Mrlee ~]#    nginx
        
2. 停止
        [root@Mrlee ~]# nginx -s stop
        
3. 重启
        [root@Mrlee ~]# nginx -s reload
~~~

`访问: http://ip:80 即可访问nginx的欢迎界面`



### 三、Nginx与uWSGI通信

~~~markdown
# 准备工作:
1. 准备两台Linux系统,一台安装并运行Nginx服务器,一台安装并运行uWSGI服务器和项目

2. 修改Nginx的配置文件:
    /usr/local/nginx/conf/nginx.conf
~~~



~~~shell
# nginx.conf

upstream ems {
    server 192.168.79.129:9001;  # uwsgi服务器中的socket
    # 这些可以再添加其它的uwsgi服务器
}

server {
    listen       80;
    server_name  192.168.79.130; # 本机的ip-Nginx服务器的ip
    charset utf-8;

    # dynamic requests 动态请求
    location / {
        uwsgi_pass ems; # 表示将动态请求转发给ems中指定的服务器
        include /usr/local/nginx/conf/uwsgi_params;
    }
    
    # static requests 静态请求
    location /static {
        alias /usr/local/static; # nginx中存放静态资源的路径
    }
}

# 注意:nginx服务器中只需要安装nginx服务器及存放静态资源即可
~~~



### 四、集群与负载均衡策略

~~~python
*默认: 轮询
    
upstream ems {
    server 192.168.79.129:9001;  
    server 192.168.79.131:9001;   
}

*ip_hash:基于ip的负载均衡
upstream ems {
    ip_hash;
    server 192.168.79.129:9001;  
    server 192.168.79.131:9001;   
}    

*权重轮询
upstream ems {
    server 192.168.79.129:9001 weight=1;  
    server 192.168.79.131:9001 weight=2;   
}   


*最小连接数
upstream ems {
    least_conn;
    server 192.168.79.129:9001;  
    server 192.168.79.131:9001;   
}   
~~~

至此,一个uwsgi的集群搭建完成,nginx作为反向代理服务器和web服务器来接收请求,然后它会处理静态部分,而动态部分按照负载均衡的策略转发给某一个uwsgi服务器。

因此python web项目就成功地运行在一个对高并发有更好的支持,并且具有高可用性的系统中。



~~~markdown
7*24不宕机  

虽然现在将项目部署在Linux系统中(虚拟机),但是用户无法访问。

企业级项目:
    1. 自己弄一台电脑,安装Linux系统,部署项目。给用户提供ip(局域网ip),无法访问。如果将主网络直接插在Linux系统中,用户依然无法访问(动态ip)。 除非你申请了一个固定ip(比较困难)
       此时还需要专门招一个管理服务器系统 8000
       
    2. 租服务器 ,云服务的运营商会给你提供一个ip地址,用户名密码,运程连接登录操作即可。
    
 另外还需要购买域名,和ip绑定(DNS解析)。 还需要备案
~~~

### 五、Nginx配置Http和Https共存

#### 1、生成证书

~~~markdown
pip install pyOpenSSL
# Linux下运行
openssl req -new -x509 -days 365 -nodes -out secret.pem -keyout secret.key
openssl pkcs8 -topk8 -inform PEM -outform PEM -in secret.key -out outfile.pem
~~~

#### 2、开启Nginx的SSL模块

~~~markdown
# 进入nginx安装包解压目录执行
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
# 配置完成后编译
make
# 这里不要进行make install,否则就是覆盖安装

# 备份原有已安装好的nginx(可以不备份)
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak

# 将刚刚编译好的nginx覆盖掉原有的nginx(这个时候nginx要停止状态)(nginx解压目录下执行)
cp ./objs/nginx /usr/local/nginx/sbin/
# ps -aux | grep nginx  查看nginx的进程进程
# netstat -anp | grep nginx 查看nginx占用的端口号
# kill -9 进程号
~~~

#### 3、Nginx 配置Http和Https共存

~~~conf
    server {
        #listen       80;
        #server_name  localhost;
        #server_name  192.168.100.114;
        
        listen 80 default backlog=2048;
        listen 443 ssl;
        server_name 192.168.100.114;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_session_cache    shared:SSL:10m;
        ssl_session_timeout  10m;
        ssl_prefer_server_ciphers  on;
        #有https协议时自动使用https,否则忽略这个参数。
        fastcgi_param HTTPS $https if_not_empty;  

  
        ssl_certificate /usr/local/nginx/conf/secret.pem;
        ssl_certificate_key /usr/local/nginx/conf/secret.key;
        
        charset utf-8;

        # dynamic requests 动态请求
        location / {
            include uwsgi_params; # 表示将动态请求转发给ems中指定的服务器
            uwsgi_pass 127.0.0.1:9000;
        }
    
        # static requests 静态请求
        location /static {
            alias /usr/local/project/first_project/first_project/static; # nginx中存放静态资源的路径
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
~~~

#### 4、Nginx 配置SSL安全证书重启避免输入密码

~~~linux
# 可以用私钥来做这件事。生成一个解密的key文件,替代原来key文件。
openssl rsa -in server.key -out server.key.unsecure
~~~

#### 5、Nginx SSL性能调优

~~~markdown
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
~~~