nginx源码安装
# yum install pcre pcre-devel zlib zlib-devel openssl openssl-devel
# cd /usr/local/src/
# wget http://nginx.org/download/nginx-1.12.2.tar.gz
# tar zxvf nginx-1.12.2.tar.gz
# cd nginx-1.12.2
# ./configure --prefix=/usr/local/nginx
# make && make install
nginx命令
./sbin/nginx 启动nginx
./sbin/nginx -s reload 重新启动nginx
./sbin/nginx -s stop 关闭nginx
./sbin/nginx -t 查看nginx配置文件是否有错误
nginx命令添加到环境变量中
# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
# nginx 直接输入命令可以使用了
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx配置项
#全局区
worker_processes 1;//有1个工作的子进程,可以自行修改,但太大无意义,因为要争夺cpu;一般设置为CPU数*核数(4*8), 好的服务器有4块cpu,每个cpu是8核,所以可以设置成32
events {
//一般配置nginx连接的特性
// 如一个work能同事连接多少个请求
worker_connections 1024;// 一个worker子进程最大连接1024个连接
}
//主要是用来配置http服务器
http {
include mime.types;
default_type application/octet-stream;
// log 日志的格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
//配置虚拟主机
server {//最简单的server,基于域名的虚拟主机
listen 80;
//当访问test.com ,这个server段就起作用了
server_name test.com;
location / {
root test.com; //这里是相对路径,相对/usr/local/nginx; 也可以写绝对路径
index a.html index.html //默认的首页, 从左往右
}
}
server {//基于端口的虚拟主机
listen 8080;
server_name test.com;
location / {
root test.com;
}
}
server{//基于ip的虚拟主机
listen 80;
server_name 60.205.231.199,
location / {
root ip;
}
}
nginx 日志管理
...
http{
// log 日志的格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
//全局访问日子的存放的文件,可以被server段里面的配置覆盖;使用的格式是'main'格式,main格式可以自定义;main格式是我们定义好的一种日志的格式,并起个名字,便于引用;
//$remote_addr 客户端的ip 122.96.40.215
//$remote_user [$time_local]客户端的访问的时间 [30/Mar/2018:11:41:06 +0800]
//$request客户端的请求 GET / HTTP/1.1
//$status返回的状态码
//$body_bytes_sent返回给客户端的字节数
//$http_referer 客户端请求当前页面的来源
//$http_user_agent 用户的代理浏览器
//$http_x_forwarded_for
access_log logs/access.log main
//给某一个server添加访问日志
server {
listen 80;
server_name test.com;
//该server,它的访问日志的文件是 logs/access.log;
access_log logs/test.com.log main;
location / {
root test.com;
index index.html
}
}
}
...
nginx定时任务,日志切割
- 把昨天某个server下面的日志改个名称(用昨天的时间)存起来
# mkdir /data
# vim nginxlog.sh
#!/usr/bin/bash
LOGPATH=/ur/local/nginx/logs/test.com.access.log;
BASEPATH=/data
bakname=$BASEPATH/$(date -d yesterday +"%Y%m%d%H%M").test.com.access.log;
echo $bakname;
mv $LOGPATH $bakname;
touch $LOGPAHT;
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`;
# chmod +x nginxlog.sh
# crontab -e //添加定时任务
*/1 * * * * sh /data/nginxlog.sh //每分钟执行一次nginxlog.sh脚本
location相关
- 定义: 根据不同的uri,进行不同的路由匹配
- 语法:
location [=|~|~*|^~] match {}
-
匹配类型分三种情况:
- location = match{} 精准匹配
- location match{} 一般匹配
- location ~ match{} 正则匹配
~区分大小写;~*不区分大小写;^~以摸个字符开头
-
路由匹配优先级:
- 首先看路由中是否有精准匹配,如果有的话,停止匹配过程;比如$uri == match匹配成功,使用configA
location = match{ configA }
- 如果没有精准匹配与$uri对应;则剩下普通匹配和正则匹配,此时正则匹配优先级高于普通匹配,如果没有没有正则匹配与$uri对应,最后使用普通匹配;
location / { root /usr/local/nginx/html/image; index index.html; } location ~ image { root /var/www/; index index.html; }
ps: 如果访问http://www.test.com/image/test.jpg,最终起作用的location是
location ~ image{}
- 如何既没有精准匹配和正则匹配,只有两个普通匹配,如下:
location / { root /usr/local/nginx/html/image; index index.html; } location /test { root html; index index.html; }
ps: 如果访问http://www.test.com/test,最终起作用的location是location /test {},因为它比较长,所以其作用了
nginx有哪些配置块
- main(全局配置)
- events(事件配置)
- upstream(上游服务器设置)
- http(通用请求处理)
- server(主机设置)
- location (url匹配特定位置后的设置)
nginx处理请求的过程
- nginx收到请求后,根据请求定位到location,有handler生成response, 再由fileter进行处理;nginx模块开发,可以是Handler模块开发,也可以是Filter开发
nginx 重写
- if 语法格式
if 空格 (条件) {
重写模式
}
#条件四种书写方式
#1. = 来判断相等,用于字符串比较
#2. ~ 用正则来匹配(此正则区分大小写)
#3. ~* 不区分大小写的正则
#4. -f, -d, -e 来判断是否为文件,为目录,是否存在
例:
//返回状态码,禁止某台ip的访问
if ($remote_addr = 127.0.0.1) {
return 403;
}
//重定向到内部的某个页面,重定向到某个路劲
if ( $http_user_agent ~* chrome) {
rewrite ^.*$ /h5/rewrite.html;//会以root作为根
break;(不break会循环重定向)
}
root /Users/credan;
nginx常用的系统变量
- $remote_addr //获取客户端ip地址
- $http_user_agent //获取客户端的信息
nginx配置显示目录结构
location ^~ /h5 {
autoindex on; //自动显示目录
autoindex_exact_size off; //默认为on,显示出文件的真实大小,单位是bytes;改为off后,显示出文件的大概大小,单位是kb或者MB或者GB;
autoindex_localtime on;//默认为off,显示的文件时间为GMT时间;改为on后,显示的文件为文件的服务器时间
root /usr/local/www;
}
ps: 该根目录下面一定不要有index.html文件,不然就直接显示该文件了
nginx配置运行跨域访问
location ^~ /app {
add_header 'Access-Control-Allow-Origin' '*';
root /usr/local/www;
}
nginx配置反向代理和负载均衡
- 反向代理
server {
listen 80;
server_name test.xxx.com;
root /usr/local/www;
error_log /usr/local/nginx/logs/error.log;
location ^~ /node {
//如果匹配到此路由会反向代理到本地3000端口服务
proxy_pass http://127.0.0.1:3000;
}
}
- 负载均衡配置
upstream demo {
server 127.0.0.1:3000;
server 127.0.0.1:3001;
}
server {
listen 80;
server_name test.xxx.com;
root /usr/local/www;
error_log /usr/local/nginx/logs/error.log;
location ^~ /node {
proxy_pass http://demo;
}
}