一 .什么是Nginx
Nginx是一款使用c语言编写的高性能的HTTP和反向代理服务器,特点是占用内存小,并发能力强,常用于反向代理和负载均衡.
二 下载使用Nginx
1.Nginx下载
Nginx官网: nginx.org/
1.1 安装Nginx所需要的环境
// c编译器
yum -y install gcc gcc-c++ autoconf automake make
// 解析正则的pcre库
yum install -y pcre pcre-devel
// 添加对gzip的支持
yum install -y zlib zlib-devel
// SSL
yum -y install pcre pcre-devel zlib zlib-devel openssl openssl-devel
1.2 解压压缩包
tar -zxvf nginx-1.22.0.tar.gz
1.3 安装
cd /usr/local/nginx-1.24.0/
./configure
make && make install
2. Nginx启动
/usr/local/nginx/sbin/nginx/ -c /usr/local/nginx/conf/nginx.conf
3. 查看Nginx
通过自己电脑的IP地址+Nginx设置的端口,来访问Nginx服务器
- Nginx常用命令
// 配置文件启动
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
// 暴力停止服务
/usr/local/nginx/sbin/nginx -s stop
// 优雅停止服务
/usr/local/nginx/sbin/nginx -s quit
// 检查配置文件
/usr/local/nginx/sbin/nginx -t
// 重新加载配置
/usr/local/nginx/sbin/nginx -s reload
三 Nginx作为HTTP服务器
1. 静态资源使用默认配置
1.1 新建一个html网页(我这里命名为user.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="http://apps.bdimg.com/libs/jquery/1.9.1/jquery.min.js"></script>
</head>
<body>
<div >
<table border="1">
<tr>
我的网页
</tr>
</table>
</div>
</body>
</html>
1.2 将新建的user.html放到/usr/local/nginx/html目录下
1.3 启动Nginx服务器
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
1.4 通过ip+port访问
http://192.168.197.135:8090/user.html
这里的ip地址是我自己的linux的,端口是在前面nginx.conf文件中设置的,我们可以直接使用user.html来访问是因为html这个目录是nginx服务器的默认静态资源目录,所以可以在端口后面直接user.html访问
2. 静态资源使用自定义配置
如果我们不想访问html这个默认的,想让一些静态资源放在我们自定义的目录去访问也是可以的.
2.1 新建自定义目录
mkdir -p /data/static/file/target/
我这里新建了很多个目录
2.2 新建一个html页面放入到2.1新建自定义目录
2.3 修改nginx.conf文件
location /test/ {
alias /data/static/file/target/;
}
这个意思就是如果在浏览器输入的url是test,就会直接将test转到/data/static/file/target里面去.
在之前,我们是直接输入url,然后会自动帮我们导到html文件里面,因为那个是默认的,而这个是自定义的.
四 Nginx作为反向代理
反向代理是指代理服务接受客户端的连接请求,然后将请求转发给内部网络上的服务器,并将服务器得到的结果返回给Internet上请求连接的客户端.举个简单的例子: 浏览器将请求发送给nginx服务器,nginx服务器将请求转发到tomcat服务器上,然后tomcat服务器上响应之后给nginx,由nginx返回给客户端.这样就减少了tomcat服务器的压力.接下来讲两个反向代理的案例
案例一: 在windows上输入www.123.com可以跳转到在linux部署的tomcat服务器上
1. 修改windows中的hosts域名映射
打开C:\Windows\System\drivers\etc\hosts文件
修改如下配置
图中的意思是如果在windows中输入www.123.com就会跳转到192.168.197.135这个网址上去
2. 在linux中启动tomcat服务器(端口配置好8080)
3. 配置nginx.conf文件
/: 192.168.197.135
意思就是如果访问了192.168.197.135:8080
4. 原理讲解
在windows中输入www.123.com,由于在host中映射,会将www.123.com映射成192.168.197.135,在nginx.conf文件中,如果访问了192.168.197.135就会将请求转成192.168.197.135:8080,也就是tomcat服务器
案例二 根据访问的路径跳转到不同端口的服务中
1. 启动两个tomcat,端口分别是8080和8081
2. 配置tomcat
mkdir -p /usr/local/tomcat8080/webapps/edu
mkdir -p /usr/local/tomcat8081/webapps/vod
3. 配置nginx.conf
这里相对于之前的proxy_pass,这里更加多样,带了正则.如果在url中碰到了edu这个,就会将192.168.197.135(也就是本机ip)转到127.0.0.1:8080,如果碰到了vod,就会将192.168.197.135(本机ip)转到127.0.0.1:8081
五 Nginx负载均衡
负载均衡大致意思就是部署了多个tomcat服务器,然后请求发送到了nginx服务器上,nginx服务器会通过一定的方法将请求分发给多个服务器,同样一个请求,发送了多次,可能第一次请求的是tomcat1服务器,第二次访问的就是tomcat2服务器了,这个是根据nginx的一个策略来的.接下来讲解如何实现负载均衡
1. 在两个tomcat下新建一个相同的目录
mkdir -p /usr/local/tomcat8080/webapps/uniapp
mkdir -p /usr/local/tomcat8081/webapps/uniapp
cp a.html /usr/local/tomcat8080/webapps/uniapp
cp a.html /usr/local/tomcat8081/webapps/uniapp
2.配置nginx.conf文件
新建一个upstream标签,myserver是自定义名字,然后在下面两个server的值是需要访问的tomcat服务器的地址,然后在proxy_pass里面不再是写死的东西了,而是可以使用刚才自定义的upstream标签的名
3. 启动tomcat服务
注意:
nginx分配策略有两种,一种是按照weight(权重),另外一种是按照ip_hash
weight越大,说明访问到的可能性越高
按照ip_hash来的话,可以解决session问题,因为如果第一次访问了tomcat1服务器并且在该服务器存储了session,那第二次如果访问到tomcat2就没有了session,所以这样可以解决session问题
六 Nginx配置详解
#配置worker进程运行用户,nobody是一个Linux用户,一般用于启动程序,没有密码
user nobody;
#配置工作进程数目,根据硬件调整,通常等于CPU数量或者2倍于CPU数量
worker_processes 2;
events
{
#单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 1024;
}
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型
client_header_buffer_size 32k; #上传文件大小限制
server {
listen 8090; #配置监听端口
server_name localhost; #配置服务名,可任意写
charset utf-8; #配置字符集
location / {
#root是配置服务器的默认网站根目录位置,默认为Nginx安装主目录下的html目录
proxy_pass http://myserver;#反向代理的地址
root html;
index index.html index.htm;
}
七 Nginx原理
Nginx时采用多进程工作方式,当Nginx启动后,会运行一个master进程和多个worker进程,master充当整个进程和用户的交互接口,同时负责监督,worker进程负责处理基本网络事件.worker进程之间是存在相互竞争关系的,当一个请求发送过来,worker进程之间会相互竞争.每个worker进程是相互独立的,如果有一个出了问题,不会影响整个服务.
如果只访问Nginx静态资源,一个发送请求会占用worker的2个连接数;而如果是作为反向代理服务器,一个发送请求会占用worker的4个连接数
如果只访问nginx静态资源,最大并发数量是: worker_connectionsworker_processes/2,而如果是作为反向代理服务器,最大并发数量应该是: worker_connectionsworker_processes/4
八 Nginx解决跨域问题
为了解决跨域问题,我们可以在nginx.conf文件中添加如下配置:
// 允许跨域请求的域,*代表所有
add_header 'Access-Control-Allow-Origin' '*';
// 允许带上cookie
add_header 'Access-Control-Allow-Credentials' 'true';
// 允许请求的方法
add_header 'Access-Control-Allow-Methods' '*';
// 允许请求的header
add_header 'Access-Control-Allow-Headers' '*';
// 这个是为了防止json跨域失败
if ($request_method = 'OPTIONS'){ return 204; }
当发送请求的参数类型为json时,会发送两次请求,第一次为预检请求,这个是为了防止预检请求跨域失败.