3、Nginx常用功能
3.1 反向代理服务器
3.1.1、demo2
a.我在tomcat下部署了一个javaweb项目,tomcat安装的服务器IP为:192.168.37.136,部署的项目在tomcat下的访问地址为:http://192.168.37.136:8080/lywh/
b.我在IP为192.168.37.133的服务器下面安装成功了Nginx。
c.那怎么样将tomcat下部署的网站使用Nginx代理呢?,修改Nginx的配置文件,修改命令:vim /usr/local/nginx/conf/nginx.conf
#配置tomcat的IP地址和访问端口
34 upstream gw {
35
server 192.168.37.136:8080 weight=1;
36 }
#Nginx代理配置
50 location /lywh {
51 proxy_pass http://gw/lywh;
52 }
53 location /sapi {
54 proxy_pass http://gw/shopappapi;
55 }
56 location /cas{
57 proxy_pass http://gw/cas-server-webapp-4.0.0/login;
58 }
59 location /doc{
60 proxy_pass http://gw/docs;
61 }
3.1.2、demo2
如何将http://localhost的访问代理到http://localhost:8080
我们可以看到nginx文件夹内有一个conf文件夹,其中有好几个文件,其他先不管,我们打开nginx.conf,可以看到一段:
这段代码在server里面,相当于一个代理服务器,当然可以配置多个。
下面我们仔细来分析一下:
listen:表示当前的代理服务器监听的端口,默认的是监听80端口。注意,如果我们配置了多个server,这个listen要配置不一样,不然就不能确定转到哪里去了。
server_name:表示监听到之后需要转到哪里去,这时我们直接转到本地,这时是直接到nginx文件夹内。
location:表示匹配的路径,这时配置了/表示所有请求都被匹配到这里
root:里面配置了root这时表示当匹配这个请求的路径时,将会在这个文件夹内寻找相应的文件,这里对我们之后的静态文件伺服很有用。
index:当没有指定主页时,默认会选择这个指定的文件,它可以有多个,并按顺序来加载,如果第一个不存在,则找第二个,依此类推。
下面的error_page是代表错误的页面,这里我们暂时不用,先不管它。
那我们知道了具体的配置了,怎么让它访问localhost时转到tomcat时。实际上就修改两个地方:
Java代码
- server_name localhost:8080;
- location / {
- proxy_pass http://localhost:8080;
- }
我们就修改了上面两个地方,我的tomcat在8080端口,可以根据自己的需要修改。这里有一个新元素proxy_pass,它表示代理路径,相当于转发,而不像之前说的root必须指定一个文件夹。
此时我们修改了文件,是不是就意思着必须先关了nginx再重新启动了,其实不必,nginx可以重新加载文件的。
我们直接运行:
Html代码
- nginx -s reload
一切没问题了,然后我们再重新打开http://localhost,我们看到tomcat的首页了。
3.2 静态资源服务器
http://blog.csdn.net/name_is_wl/article/details/52958472
Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端
- server {
- listen80; # 端口号
- location / {
- root /usr/share/nginx/html; # 静态文件路径
- }
- }
3.3 虚拟主机
3.3.1、demo1
有的网站访问量大,需要负载均衡。然而并不是所有网站都如此出色,有的网站,由于访问量太小,需要节省成本,将多个网站部署在同一台服务器上。
例如将www.aaa.com和www.bbb.com两个网站部署在同一台服务器上,两个域名解析到同一个IP地址,但是用户通过两个域名却可以打开两个完全不同的网站,互相不影响,就像访问两个服务器一样,所以叫两个虚拟主机。
- server {
- listen80default_server;
- server_name _;
- return444; # 过滤其他域名的请求,返回444状态码
- }
- server {
- listen80;
- server_name www.aaa.com; # www.aaa.com域名
- location / {
- proxy_pass http://localhost:8080; # 对应端口号8080
- }
- }
- server {
- listen80;
- server_name www.bbb.com; # www.bbb.com域名
- location / {
- proxy_pass http://localhost:8081; # 对应端口号8081
- }
- }
在服务器8080和8081分别开了一个应用,客户端通过不同的域名访问,根据server_name可以反向代理到对应的应用服务器。虚拟主机的原理是通过HTTP请求头中的Host是否匹配server_name来实现的,有兴趣的同学可以研究一下HTTP协议。另外,server_name配置还可以过滤有人恶意将某些域名指向你的主机服务器。
3.3.2、demo2
两个虚拟主机(纯静态-html 支持) - Two Virtual Hosts, Serving Static Files
http {
: server {
: listen 80;
: server_name www.domain1.com;
: access_log logs/domain1.access.log main;
: location / {
: index index.html;
: root /var/www/domain1.com/htdocs;
: }
: }
: server {
: listen 80;
: server_name www.domain2.com;
: access_log logs/domain2.access.log main;
: location / {
: index index.html;
: root /var/www/domain2.com/htdocs;
: }
: }
}
虚拟主机标准配置(简化) - A Default Catchall Virtual Host
http {
: server {
: listen 80 default;
: server_name _ *;
: access_log logs/default.access.log main;
: location / {
: index index.html;
: root /var/www/default/htdocs;
: }
: }
}
在父文件夹中建立子文件夹以指向子域名 - Wildcard Subdomains in a Parent Folder
server {
: # Replace this port with the right one for your requirements
: # 根据你的需求改变此端口
: listen 80; #could also be 1.2.3.4:80 也可以是1.2.3.4:80的形式
: # Multiple hostnames seperated by spaces. Replace these as well.
: # 多个主机名可以用空格隔开,当然这个信息也是需要按照你的需求而改变的。
: server_name star.yourdomain.com *.yourdomain.com www.*.yourdomain.com;
: #Alternately: _ *
: #或者可以使用:_ * (具体内容参见本维基其他页面)
: root /PATH/TO/WEBROOT/$host;
: error_page 404 http://yourdomain.com/errors/404.html;
: access_log logs/star.yourdomain.com.access.log;
: location / {
: root /PATH/TO/WEBROOT/$host/;
: index index.php;
: }
: # serve static files directly
: # 直接支持静态文件 (从配置上看来不是直接支持)
: location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|html)$ {
: access_log off;
: expires 30d;
: }
: location ~ .php$ {
: # By all means use a different server for the fcgi processes if you need to
: # 如果需要,你可以为不同的FCGI进程设置不同的服务信息
: fastcgi_pass 127.0.0.1:YOURFCGIPORTHERE;
: fastcgi_index index.php;
: fastcgi_param SCRIPT_FILENAME /PATH/TO/WEBROOT/$host/$fastcgi_script_name;
: fastcgi_param QUERY_STRING $query_string;
: fastcgi_param REQUEST_METHOD $request_method;
: fastcgi_param CONTENT_TYPE $content_type;
: fastcgi_param CONTENT_LENGTH $content_length;
: fastcgi_intercept_errors on;
: }
: location ~ /\.ht {
: deny all;
: }
: }
3.4、负载均衡
一个简单的负载均衡的示例,把www.domain.com均衡到本机不同的端口,也可以改为均衡到不同的地址上。>
http {
: upstream myproject {
: server 127.0.0.1:8000 weight=3;
: server 127.0.0.1:8001;
: server 127.0.0.1:8002;
: server 127.0.0.1:8003;
: }
: server {
: listen 80;
: server_name www.domain.com;
: location / {
: proxy_pass http://myproject;
: }
: }
}
nginx的upstream目前支持4种方式的分配
3.4.1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
3.4.2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
例如:
upstream bakend {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}
3.4.3、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
例如:
upstream bakend {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}
3.4.4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backend {
server server1;
server server2;
fair;
}
3.4.5、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法
upstream backend {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
3.5、FastCGI
Nginx本身不支持PHP等语言,但是它可以通过FastCGI来将请求扔给某些语言或框架处理(例如PHP、Python、Perl)。
- server {
- listen80;
- location ~ \.php$ {
- include fastcgi_params;
- fastcgi_param SCRIPT_FILENAME /PHP文件路径$fastcgi_script_name; # PHP文件路径
- fastcgi_pass127.0.0.1:9000; # PHP-FPM地址和端口号
- # 另一种方式:fastcgi_pass unix:/var/run/php5-fpm.sock;
- }
- }
配置中将.php结尾的请求通过FashCGI交给PHP-FPM处理,PHP-FPM是PHP的一个FastCGI管理器。