加载中...

Nginx的使用


Nginx的基本使用

1. Nginx的安装

  • a. 首先解决源码编译安装所需的基础开发环境!!!

    yum install gcc patch libffi-devel python-devel  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y
  • b. 下载源代码

    wget http://tengine.taobao.org/download/tengine-2.3.2.tar.gz
  • c. 解压缩tenginx文件

    tar zxf tengine-2.3.2.tar.gz
  • d. 进入源代码目录,指定安装路径,开始编辑安装

    ./configure --prefix=/opt/tngx232
    make && make install
    
    # --prefix是指定nginx的安装目录
  • d. 配置nginx环境变量

    # 先进入tenginx的sbin目录,然后把工作目录加入PATH(/etc/profile)环境中
    [root@bogon sbin]# pwd
    /opt/tngx232/sbin
    [root@bogon sbin]# vi /etc/profile
    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/python36/bin:/root/bin:/opt/tngx232/sbin"
    # 再手动更新环境变量
    [root@bogon sbin]# source /etc/profile
  • 启动nginx,直接输入nginx命令

    nginx -t        # 检测ngingx.conf的语法是否正确
    nginx -s reload # 平滑重启nginx:不重启nginx,重新读取配置文件,立即生效
    nginx -s stop   # 停止nginx
    nginx           # 启动nginx
  • 当然也可以使用yum安装,它可以自动解决安装所需的依赖关系

    yum install -y nginx
    # 安装后nginx首页配置在 /usr/share/nginx/html/index.html

2. Nginx的目录结构

[root@bogon tngx232]# ls
client_body_temp  conf  fastcgi_temp  html  logs  proxy_temp  sbin  scgi_temp  uwsgi_temp
  • conf 存放nginx所有配置文件的目录,主要为nginx.conf
  • html 存放nginx默认站点的目录,如index.html、error.html等
  • logs 存放nginx默认日志的目录,如error.log access.log
  • sbin 存放nginx主命令的目录,sbin/nginx

3. Nginx的主配置文件

  1. 修改nginx的server虚拟主机的端口以及各种配置

    # 第一个虚拟主机的功能
        server {
            listen       80;    # 监听端口
            server_name  localhost;   # 定义网站的域名
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;    # 定义第一个虚拟主机的网站访问日志
            #access_log  "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G"  main;
            
            # nginx的url匹配,/ 这个斜杠就代表这样的请求:192.168.19.129::80/
            # 这是最低级匹配,所有的请求都会进入location,进行处理
            location / {
                # root参数用于定义网页根目录,可以写成绝对或者相对路径
                root   html;
                # index参数用于定义网站首页的名字
                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;
            }
        }
  2. dns客户端配置文件

    /etc/resolv.conf
    # 修改如下内容
    nameserver 192.168.19.2 # nameserver填写值是 公网的dns服务器
    						# 8.8.8.8 谷歌的公网dns
    						# 114.114.114.114
    						# 223.5.5.5
    						# 223.6.6.6 阿里巴巴的dns
    						# 119.29.29.29  腾讯的dns服务器
    # C:\Windows\System32\drivers\etc 这个是windows的hosts文件
  3. nginx的多虚拟主机功能

    nginx的配置文件,多个虚拟主机默认是自上而下的加载顺序,有先后顺序

    • 基于域名的多虚拟主机 hosts文件,本地dns解析

      • 第一步:在nginx.conf中配置两个server{}

        # 第一个虚拟主机的功能
        server {
                listen       80;    # 监听端口
                server_name  www.testlol.com;   # 定义网站的域名
                location / {
                    # root参数用于定义网页根目录,可以写成绝对或者相对路径
                    root   /opt/testlol;
                    # index参数用于定义网站首页的名字
                    index  index.html index.htm;
                }
                error_page   500 502 503 504  /50x.html;
                location = /50x.html {
                    root   html;
                }
            }
        # 第二个虚拟主机的功能
        server {
                listen       80;
                server_name  www.testhanju.com;
        
                location / {
                    root   /opt/testhanju;
                    index  index.html index.htm;
                }
            }
      • 第二步:分别创建/opt/testlol 和 /opt/testhanju的文件夹,且创建资料

      • 第三步:在windows下修改hosts文件,填入以下内容

        192.168.19.128  www.testlol.com
        192.168.19.128  www.testhanju.com
    • 基于端口的多虚拟主机

  4. nginx404页面优化

    location / {
                root   html;
                index  index.html index.htm;
            }
    error_page  404   /404.html;
  5. nginx的访问日志功能,监测用户的来源ip,访问时间,客户端地址信息

    http {
        include       mime.types;
        default_type  application/octet-stream;
    	# 日志格式           远程ip地址       访问用户      访问时间       请求的资源
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        				  # 状态码   发了多少bytes数据
                          '$status $body_bytes_sent "$http_referer" '
                          # 请求体(手机、PC)     # 解析代理池
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  logs/access.log  main;
        access_log  "pipe:rollback logs/access_log interval=1d baknum=7 maxsize=2G"  main;



Nginx进阶使用

nginx 代理功能

准备两台机器,保证两台机器通信

192.128.13.117 (资源网址,为了方便简单提供一个静态页面)

192.168.13.xx (反向代理机器,是nginx提供的功能)

配置步骤

1、准备资源服务器

2、配置代理服务器

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

3、在windows中的浏览器,客户端,访问代理机器,查看资源地址

nginx 负载均衡配置

准备3台机器

192.168.19.128 资源地址(模拟django机器1)

192.168.19.129 反向代理机器(基于nginx搭建,进行代理,转发)

192.168.19.130 资源地址(模拟django机器1)

  • a. 分别准备好2台资源机器(都用nginx模拟资源,因此都需要安装nginx)

    访问192.168.12.128看到一个这个ip的地址(用去区分)

    访问

  • b. 准备反向代理机器,192.168.19.129,当我们访问代理机器的时候,进行配置不同的分发规则,查看效果

    修改nginx.conf,配置规则如下,负载均衡还是在http中配置:

    # 在server的上面,添加负载均衡
        upstream myserver{
                # 默认负载算法是 轮询方式
                server 192.168.19.128;
                server 192.168.19.130;
        }
        server {
            listen       80 default_server;
            server_name  _;
            root         /usr/share/nginx/html;
            include /etc/nginx/default.d/*.conf;
            location / {
            # proxy_pass是基于http协议的请求转发
            # uwsgi_pass 结合python的uWSGI服务器,进行协同工作的
            proxy_pass  http://myserver;
            }

负载均衡调度算法

调度算法 概述
轮询 按时间顺序逐一分配到不同的后端服务器(默认)
weight 加权轮询,weight值越大,分配到的访问几率越高
ip_hash 每个请求按访问IP的hash结果分配,这样来自同一IP的固定访问一个后端服务器
url_hash 按照访问URL的hash结果来分配请求,是每个URL定向到同一个后端服务器
least_conn 最少链接数,那个机器链接数少就分发
  1. 轮询(不做配置,默认轮询)

  2. weight权重(优先级)

  3. ip_hash配置,根据客户端ip哈希分配,不能和weight一起用

  • weight权重机制

    upstream myserver{
                # 5次访问中128一次1304次
                server 192.168.19.128 weight=1;
                server 192.168.19.130 weight=4;
        }
  • ip_hash机制,不得与权重一起使用

    upstream myserver{
                # 5次访问中128一次1304次
                server 192.168.19.128 weight=1;
                server 192.168.19.130 weight=4;
                ip_hash;
        }

    负载均衡可参考博客:https://www.cnblogs.com/pyyu/p/10004681.html




实战项目部署

CRM项目部署

nginx(前端入口)+uwsgi+django(后台)+virtualenvwrapper+supervisor(进程管理工具)+mysql(mariadb) 部署

项目部署发布参考:https://www.luffycity.com/micro/play/18321

python的web框架:django和flask最火。tornado、sanic(最快的框架,赶上go语言的qps了)

  1. 为什么用nginx

nginx处理静态文件,且支持请求匹配,请求封禁,暴露在公网,比较安全,且负载均衡

  1. 为什么用uwsgi启动django呢

默认django用的是wsigre单机模块,单进程,性能很低

python3 manage.py runserver 仅仅是用来调试django代码,是否能启动的

在线上,使用uwsgi命令启动django,支持多线程,支持并发等等配置

MyBlog部署安装

第一步:配置数据库并导入数据

  • 1、启动mariadb数据库

    • a. 配置yum源

      yum install mariadb-server mariadb -y
    • b. 通过yum安装的软件,怎么启动

      systemctl  start/stop/status/restart  mariadb
    • c. 登录数据库

      mysql -uroot -p
  • 2、导出window数据库数据,导入给linux机器

    • d. 导出命令

      mysqldump -uroot -p --databases crm > d:\db_crm.sql  # 指定数据库导出到db_crm.sql中
    • e. 传输到linux中,进行导入

      简单的利用 lrzsz 工具进行传输

      rz   # 从win传输到linux
      sz 文件名  # 指定文件向win发送

      导入数据库的命令

      soruce db_crm.sql;

第二步:准备python3环境,以及虚拟环境

  • 1、编译安装python3,解决环境变量

  • 2、下载virtualenvwrapper工具

    pip3 install virtualenvwrapper
  • 3、使用mkvirtualenv 命令,创建新的虚拟环境,用于启动crm

    mkvirtualenv crmenv
  • 4、拷贝crm代码,到 linux机器

  • 5、解决crm运行所需的依赖环境、django等模块、以及pymysql

    解决方法1:

    根据一个一个报错进行安装解决

    解决方法2:

    pip3 freeze > requirements.txt  # 导出pip所有模块到requirements中
    pip3 install -r requirements.txt  # 指定依赖文件安装,读取文件中所有模块信息

第三步:安装uwsgi

  • 1、通过pip3安装

    pip3 install uwsgi -i https://pypi.douban.com/simple
  • 2、通过uwsig命令启动django

    • 启动方式1(只是练习用):通过命令和参数形式

      # 语法:uwsgi --http :8000 --module  项目名.wsgi
      			 --http # 指定http协议启动socket服务端,可以通过浏览器直接访问
      			 --module # 是找到crm项目第二级目录下的wsgi.py文件
      uwsgi --http :8000 --module CRM_project.wsgi
    • 启动方式2(通过配置文件方式启动,线上是这么启动)

      uwsgi的配置文件 uwsgi.ini

      • a. 创建配置文件

        touch uwsgi.ini
      • b. 配置 uwsgi.ini 文件

        [uwsgi]
        # Django-related settings
        # the base directory (full path)
        # 填写django项目的绝对路径,第一层
        chdir           = /opt/mysite
        # Django's wsgi file
        # 填写crm项目第二层目录中的wsgi文件
        module          = mysite.wsgi
        # the virtualenv (full path)
        # 填写解释器的安装的绝对路径(第一层,也就是bin上面一级)(虚拟环境)
        home            = /opt/venv
        # process-related settings
        # master
        master          = true
        # maximum number of worker processes
        # 指定uwsgi的多进程数量,指定为cpu的核数即可(2*cup核数+1)
        processes       = 1
        # the socket (use the full path to be safe
        # 指定crm启动的协议,当你和nginx结合进行反向代理,就用unix-socket协议,这种方式无法直接访问,只能通过nginx进行反代
        socket          = 0.0.0.0:8000
        # 指定http协议启动,不安全,没有意义,只是自己调试使用
        # http = 0.0.0.0:8000
        # ... with appropriate permissions - may be needed
        # chmod-socket    = 664
        # clear environment on exit
        vacuum          = true
      • c. 指定uwsgi.ini配置文件启动

        uwsgi --ini uwsgi.ini  # 参数 --ini是指定文件的意思
  • 3、收集django的所有静态文件,丢给nginx去处理

    • 打开django的settings.py文件,修改为如下行:

      STATIC_ROOT='/opt/Blog/blogstatic/'  # 只需加上这个参数即可
      STATIC_URL = '/static/'
      STATICFILES_DIRS = [
          os.path.join(BASE_DIR,'static')
      ]
    • 通过命令收集django的所有静态文件

      python3 manage.py collectstatic

第四步:启动nginx,配置反向代理

  • 1、安装nginx

  • 2、修改配置文件 nginx.conf

    注意server{} 多虚拟主机是自上而下的加载顺序

    因此修改第一个 server{} 虚拟主机,修改为如下反代的写法

    server {
            listen       80;
            server_name  localhost;
    
            location / {
            # 基于uwsgi协议的请求转发,给后端django的启动地址
            uwsgi_pass   0.0.0.0:8000;  # 这个是请求转发
            include uwsgi_params;       # 这个是添加一个文件,添加请求头信息的
            }
    }
  • 3、添加nginx处理django的静态文件(要执行第三步3)

    在第一个 server{} 虚拟主机中新增一个 location:

    # 当以后请求是从static开始,我就让他去这个目录去找
    location /static {   # 不加斜杠
    	alias /opt/Blog/blogstatic;
    }

部署前后端分离项目

前后端项目部署安装

nginx + vue 端口是80,看到路飞首页

vue向后台发起数据请求,首先找到的是nginx反代,此时这个反代端口是多少

1、前端(nginx+vue)

vue点击课程列表动作,向后台发起数据请求

drf启动(它不是http协议,而是uwsgi-socket协议,无法直接访问,必须通过nginx反代实现,虚拟主机实现的)

2、解压缩代码,修改vue的提交数据地址,以及编译打包生成dist

修改这个提交数据地址的js文件

# 地址:/opt/luffys23/07-luffy_project_01/src/restful
# sed 处理文件内容的命令
# 语法:sed -i "s/你想替换的内容/替换之后的内容/g" 文件名
# -i 将替换结果写入到文件,如果不写-i,只是显示替换后的结果;s是替换模式;g是global全局替换
sed -i "s/127.0.0.1:8000/192.168.65.129:8001/g" api.js

3、配置node.js环境

# 1.下载node源码
wget https://nodejs.org/download/release/v8.6.0/node-v8.6.0-linux-x64.tar.gz
# 2.解压缩,由于这是编译好的二进制命令压缩包,直接配置环境变量即可使用
tar -zxvf node-v8.6.0-linux-x64.tar.gz
# 3.配置PATH
vim /etc/profile
PATH="/opt/luffys23/node-v8.6.0-linux-x64/bin"
# 4.读取/etc/profile,手动生效
source /etc/profile
# 5.查看node和npm的版本,是否正常
node -v
npm -v

4、开始安装vue项目所需的node模块,默认找到当前文件夹的package.json文件(可以配置淘宝nginx源)

# 更换源
npm config set registry https://registry.npm.taobao.org
npm list
# 安装
npm install

5、编译vue代码,生成dist

npm run build

6、此时生成dist文件夹之后,可以丢给nginx去解析了

7、配置nginx.conf如下

# 1.配置第一个虚拟主机,返回路飞的首页内容
server {
        listen 81;
        server_name localhost;
        location / {
            root /opt/luffys23/07-luffy_project_01/dist;
            index index.html;
        }
    }
# 2.
server {
        listen 8001;
        server_name _;
        location / {
            include uwsgi_params;
            uwsgi_pass 0.0.0.0:8002;
        }
    }

8、配置drf的后端,提供数据支撑

获取后台代码

创建新的虚拟环境

mkvirtualenv luffys23

解决模块依赖问题

# 导出本地模块或手写文件
pip3 freeze > requirements.txt
# 安装模块
pip3 install -r requirements.txt

9、配置uwsgi和配置文件,启动drf

pip3 install uwsgi

10、写一个uwsgi.ini配置文件启动

  • 创建uwsgi.ini文件

  • 写入配置

    [uwsgi]
    # Django-related settings
    # the base directory (full path)
    # 填写django项目的绝对路径,第一层
    chdir           = /opt/luffys23/luffy_boy 
    # Django's wsgi file
    # 填写crm项目第二层目录中的wsgi文件
    module          = luffy_boy.wsgi
    # the virtualenv (full path)
    # 填写解释器的安装的绝对路径(虚拟环境)
    home            = /root/Envs/luffys23
    # process-related settings
    # master
    master          = true
    # maximum number of worker processes
    # 指定uwsgi的多进程数量,指定为cpu的核数即可(填cpu的4倍数量)
    processes       = 1
    # the socket (use the full path to be safe
    # 指定crm启动的协议,当你和nginx结合进行反向代理,就用unix-socket协议,这种方式无法直接访问,只能通过nginx进行反代
    socket          = 0.0.0.0:8002
    # 指定http协议启动,不安全,没有意义,只是自己调试使用
    # http = 0.0.0.0:8000
    # ... with appropriate permissions - may be needed
    # chmod-socket    = 664
    # clear environment on exit
    vacuum          = true
  • 启动uwsgi

    uwsgi --ini uwsgi.ini

11、登录

账号:alex 密码:alex3714

12、安装redis数据库,可以用于购物车功能

yum install redis -y

13、启动redis

systemctl start redis

14、验证登录redis

[root@localhost luffy_boy]# redis-cli
127.0.0.1:6379> ping
PONG

15、检查redis的key信息

127.0.0.1:6379> keys *
(empty list or set)

16、解决路飞首页刷新404问题的方法

server {
        listen 81;
        server_name localhost;
        location / {
            root /opt/luffys23/07-luffy_project_01/dist;
            index index.html;
            try_files $uri $uri/ /index.html;#这一条参数确保vue页面刷新时候,不会出现404页面
        }
    }

文章作者: 无夜
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 无夜 !
评论
  目录