nginx能做什么?
访问控制、静态资源服务器、反向代理、负载均衡、静态资源合并
1.nginx介绍及环境准备
nginx是一款轻量级的HTTP服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的IO性能,时常用于服务端的反向代理和负载均衡
- 安装
#软件装哪了 which nginx
#查看nginx是否配置正确:nginx -t
#查看是否有Nginx的进程:ps -ef | grep nginx
#查看是否有80端口:netstat -ntl netstat -lntp
#霸道删除进程:killall nginx
$ yum install nginx
复制代码
centos6
,可以使用如下命令
老叶的mac:/usr/local/nginx/sbin
启动:nginx
重启:nginx -s reload
查看ng配置状态:nginx -t
查看ng配置信息:nginx -T
查看ng进程信息:ps -ef | grep nginx
查看是否有80端口:netstat -ntl
查看当前端口占用:netstat -anp |grep 6000
//删除
ps -ef | grep nginx //查进程
kill -QUIT 15800 //从容的停止进程id:15800,即不会立刻停止
Kill -TERM 15800 // 立刻停止
Kill -INT 15800 //和上面一样,也是立刻停止
killall nginx //霸道删除进程
复制代码
centos7
以后可以使用systemctl 来管理
停止ng: systemctl stop nginx.service
启动ng:systemctl start nginx.service
重启ng:systemctl restart nginx.service
查看ng状态:systemctl status nginx.service
设置开机启动:systemctl enable nginx.service
取消开机服务:systemctl disable nginx.service
复制代码
2. 访问控制
nginx -t
查看配置文件路径
(1)简单访问控制
进入当前nginx配置文件(小编的路径为:/etc/nginx/conf.d/default.conf),加入如下配置:
location / {
deny 10.200.240.219; //不允许此ip访问,指定为all,可以阻止所有ip访问
allow 10.200.202.231; //只允许此ip访问
}
复制代码
注意:就是在同一个块下的两个权限指令,先出现的设置会覆盖后出现的设置,例如:
//以下配置表示:拒绝所有ip访问
location / {
deny all; //all,可以阻止所有ip访问
allow 10.200.202.231; //这一条因为出现在deny all 之后,所以并没有什么作用
}
//以下配置表示:只允许10.200.202.231访问
location / {
allow 10.200.202.231; //这一条因为出现在deny all 之前,所以允许此ip访问
deny all; //除了allow的ip可以访问,其他的ip拒绝访问
}
复制代码
(2)精确访问控制
比如:对于网站下的www目录是运行所有用户访问,但对于网站下的admin目录则只允许公司内网固定IP访问
location =/www{
allow all; //没什么秘密,大家随便看
}
location =/admin{
deny 10.200.240.219; //比如后台admin管理系统,只能小编自己访问
}
复制代码
又比如:公司java的jsp文件,只能内网ip访问,这样配置别人就看不了.jsp文件结尾的文件了。
location ~\.jsp$ {
allow 10.200.240.219;
deny all;
}
复制代码
配置完,记得重启一下nginx服务
3. 设置单个或多个虚机
- a. 进入主目录:/etc/nginx/nginx.conf
----或者进入子目录:/etc/nginx/conf.d/default.conf
----或者在conf.d下新建配置文件,都可以被读取到(需要主配置包含进去)
- b. server_name 可以设置本机(localhost)、ip地址(10.200.240.219)、域名(baidu.com)等
//基于端口号配置
server {
listen 80;
server_name localhost;
error_page 500 502 503 504 /50x.html;
location / {
index index.html index.htm;
#读取项目目录下html80下的index.html文件
root <你自己的项目路径>/html80
# 反向代理本机的8080应用
proxy_pass http://127.0.0.1:8080;
}
}
server {
listen 8080;
server_name localhost;
error_page 500 502 503 504 /50x.html;
location / {
#读取项目目录下html8080下的index.html文件
root <你自己的项目路径>/html8080
index index.html index.htm;;
}
}
//------------------------------------------------------------------------------------------
//基于域名配置示例
server {
listen 80;
server_name www.aa.com;
location /api/ {
proxy_pass http://; #反向代理到其他站点
}
}
server {
listen 80;
server_name www.bb.com;
location /api/ {
proxy_pass http://localhost:8002; #反向代理到其他站点
}
}
复制代码
基于Nginx虚拟主机配置实现,Nginx有三种类型的虚拟主机
-
基于IP的虚拟主机:需要你的服务器上有多个地址,每个站点对应不同的地址,这种方式使用的比较少
-
基于端口的虚拟主机:每个站点对应不同的端口,访问的时候使用ip:port的方式访问,可以修改listen的端口来使用
-
基于域名的虚拟主机:使用最广的方式,上边例子中就是用了基于域名的虚拟主机,前提条件是你有多个域名分别对应每个站点,server_name填写不同的域名即可
-
c. 一个服务配置多个站点
server {
listen 80;
server_name a.ops-coffee.cn;
location / {
root /home/project/pa;
index index.html;
}
}
server {
listen 80;
server_name ops-coffee.cn b.ops-coffee.cn;
location / {
root /home/project/pb;
index index.html;
}
}
server {
listen 80;
server_name c.ops-coffee.cn;
location / {
root /home/project/pc;
index index.html;
}
}
复制代码
- d. 一个站点配置多个域名
server {
listen 80;
server_name ops-coffee.cn b.ops-coffee.cn;
}
复制代码
4. 反向代理
主要配置location模块的 proxy_pass
一般反向代理都配置一个ip地址,因为如果配置域名,还要走一遍dns解析,没必要
以下示例访问 http://localhost
,其实就是访问 http://localhost:8080
server {
listen 80;
server_name localhost;
error_page 500 502 503 504 /50x.html;
location / {
proxy_pass http://localhost:8080; #反向代理到其他web服务器
}
}
复制代码
其他反向代理配置项:
- proxy_set_header :在将客户端请求发送给后端服务器之前,更改来自客户端的请求头信息。
- proxy_read_timeout : 配置Nginx向后端服务器组发出read请求后,等待相应的超时时间。
- proxy_send_timeout:配置Nginx向后端服务器组发出write请求后,等待相应的超时时间。
- proxy_connect_timeout:配置Nginx与后端代理服务器尝试建立连接的超时时间。
- proxy_redirect :用于修改后端服务器返回的响应头中的Location和Refresh。
例如:
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
复制代码
4.1反向代理解决js跨域
那么我们正常请求:http://a.com/api/getHomeData 会被转发到 b.com/api/getHome… 这样就不会因为域名的不同导致js跨域了。
server {
listen 80;
server_name a.com;
error_page 500 502 503 504 /50x.html;
location /api {
proxy_pass http://b.com/api
}
}
复制代码
4.2url的/问题
在nginx中配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走。
- 下面四种情况分别用http://192.168.1.4/proxy/test.html 进行访问。
# 1. 会被代理到http://127.0.0.1:81/test.html 这个url
location /proxy/ {
proxy_pass http://127.0.0.1:81/;
}
# 2. 第二咱(相对于第一种,最后少一个 /),会被代理到http://127.0.0.1:81/proxy/test.html 这个url
location /proxy/ {
proxy_pass http://127.0.0.1:81;
}
# 3. 会被代理到http://127.0.0.1:81/ftlynx/test.html 这个url。
location /proxy/ {
proxy_pass http://127.0.0.1:81/ftlynx/;
}
# 4. 第四种情况(相对于第三种,最后少一个 / ):会被代理到http://127.0.0.1:81/ftlynxtest.html 这个url
location /proxy/ {
proxy_pass http://127.0.0.1:81/ftlynx;
}
复制代码
5. nginx区分PC还是移动端
- nginx通过内置变量$http_user_agent,可以获取到请求客户端的userAgent,进而判断移动端还是PC端,控制返回给客户是PC版还是H5版,这也是当下很多公司的方案
- 以下配置就可以让 http://localhost:8080 在移动端的环境下,读取mobile下的网站内容(默认读取PC下的网站内容)
//常用--根据UA做重定向
server{
listen 8080;
server_name localhost;
root /Users/joker/2019/pc;
if ($http_host !~ "^www.aa.com$") {
rewrite ^(.*) http://www.aa.com$1 permanent;
}
if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry)') {
rewrite ^(.*) http://m.aa.com$1 permanent;
}
}
//不常用--同一台服务器放两份代码
server{
listen 8080;
server_name localhost;
location / {
root /Users/joker/2019/pc;
if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry)') {
root /Users/joker/2019/mobile;
}
index index.html;
}
}
复制代码
6. 负载均衡
主要配置upstream和location模块的proxy_pass
upstream test_pool{
ip_hash;
server 127.0.0.1:8001 weight=10; #设置访问权重,权重越高越容易被访问
server 127.0.0.1:8002 weight=10;
server 127.0.0.1:8003 weight=7;
}
server {
listen 80;
server_name test.a.com;
location / {
proxy_pass http://test_pool; #反向代理到其他服务器集合
}
}
复制代码
ip_hash:使用ip_hash策略的负载均衡解决session问题。每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可较好地解决session的问题。
7. 静态资源请求合并
nginx-http-concat
8. location的那点事
rewrite
location ~ \.php${
rewirte "^/php/(.*)$" http://localhost:8001/$1
}
复制代码
将localhost/php/test.php重定向到localhost:8090/test.php。如果正则表达式(regex)匹配到了请求的URI(request URI),这个URI会被后面的replacement替换
可选的flag参数如下:
- last
结束当前的请求处理,用替换后的URI重新匹配location;
可理解为重写(rewrite)后,发起了一个新请求,进入server模块,匹配location;
如果重新匹配循环的次数超过10次,nginx会返回500错误;
返回302 http状态码 ;
浏览器地址栏显示重定向后的url
- break
结束当前的请求处理,使用当前资源,不在执行location里余下的语句;
返回302 http状态码 ;
浏览器地址栏显示重定向后的url
- redirect
临时跳转,返回302 http状态码;
浏览器地址栏显示重定向后的url
- permanent
永久跳转,返回301 http状态码;
浏览器地址栏显示重定向后的url
try_files
try_files指令是按顺序检测文件的存在性,并且返回第一个找到文件的内容,如果第一个找不到就会自动找第二个,依次查找.其实现的是内部跳转
# example01:跳转到变量
server {
listen 8000;
server_name 121.10.143.66;
root html;
index index.html index.php;
location /abc {
try_files /4.html /5.html @qwe; ## 检测文件4.html和5.html,如果存在正常显示,不存在就去查找@qwe值
}
location @qwe {
rewrite ^/(.*)$ http://www.baidu.com; ## 跳转到百度页面
}
}
# example02:跳转到指定文件,不存在就往后找,找到了显示。 测试链接:http://121.10.143.66:8000/abc
server {
listen 8000;
server_name 121.10.143.66;
root html;
index index.php index.html;
location /abc {
try_files /4.html /5.html /6.html;
}
}
复制代码
暂无评论