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的主配置文件
修改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; } }
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文件
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
基于端口的多虚拟主机
nginx404页面优化
location / { root html; index index.html index.htm; } error_page 404 /404.html;
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 | 最少链接数,那个机器链接数少就分发 |
轮询(不做配置,默认轮询)
weight权重(优先级)
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; }
实战项目部署
CRM项目部署
nginx(前端入口)+uwsgi+django(后台)+virtualenvwrapper+supervisor(进程管理工具)+mysql(mariadb) 部署
项目部署发布参考:https://www.luffycity.com/micro/play/18321
python的web框架:django和flask最火。tornado、sanic(最快的框架,赶上go语言的qps了)
- 为什么用nginx
nginx处理静态文件,且支持请求匹配,请求封禁,暴露在公网,比较安全,且负载均衡
- 为什么用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页面
}
}