nginx分布式实例入门操作
本文目的
前段时间学习WCF已经渐入佳境,完成了既定学习目标,转入分布式系统学习。本文技术路线是:

采用wcf实现分布式服务端和客户端,客户端部署于本地主机,nginx和WCF部署于虚拟机端(分别是三个虚拟机)
此文验证:当其中一个服务端断线后,另一个服务端可以继续支撑整个会话的完成。
技术关键词
wcf,nginx,虚拟机
(如果wcf基础知识还不是很熟,建议先学习wcf技术知识。虚拟机采用vmware,虚拟机建立的系统是Win7.
提前准备好虚拟机,并建立三个虚拟机,每个虚拟机建立Win7系统,每个Win7系统安装.NET4.6平台。
下载nginx程序包。)
准备工作:虚拟机与主机建立局域网
为了保障本文的测试成功,主机与三个虚拟机之间组成局域网。三个虚拟机完成下图设置

三个虚拟机完成虚拟网路设置:

选择VMnet8(因为此项外部连接是NAT模式),然后点击NAT设置。

设置NAT网关设置

三个虚拟机还需要关闭防火墙和修改入站规则


我们来从自己本地主机ping虚拟机进行验证。

我们从虚拟机向本地主机ping

以上就实现了每个虚拟机与主机的局域网建立。
wcf契约与Service
本文的wcf服务代码没有很特殊的地方,贴代码
namespace NginxWCFTest_Contract
{
[ServiceContract]
public interface IOutputSomething
{
[OperationContract]
string GetContentData(int i);
[OperationContract]
string GetIpAddress();
}
}
namespace NginxWCFTest_Service
{
public class OutputSomethingService:IOutputSomething
{
string threadName;
readonly object lockObject = new object(); public string GetContentData(int i)
{
lock (lockObject)
{
threadName = i.ToString( + "-" + "我是主机:" + GetIpAddress());
}
return string.Format("序列号:{0},线程号:{1}", i, threadName);
}
public string GetIpAddress()
{
string AddressIP = string.Empty;
foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
{
if (_IPAddress.AddressFamily.ToString() == "InterNetwork")
{
AddressIP = _IPAddress.ToString();
}
}
return AddressIP;
}
}
}
wcf服务端宿主(部署于192.168.21.129和192.168.21.130)
namespace NginxWCFTest_Hosting
{
class Program
{
static void Main(string[] args)
{
ServiceHost host = new ServiceHost(typeof(OutputSomethingService));
host.Open();
//host.Opened += delegate
//{
// Console.WriteLine(host.Description.Endpoints[0].Address.Uri + "已经启动,按任意键终止服务!");
//};
Console.Read();
}
}
}
如果wcf基础知识扎实的话, 宿主的代码很easy,我们重点需要关注的是配置信息
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="metaBehavior">
<!-- 为避免泄漏元数据信息,
请在部署前将以下值设置为 false -->
<serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"
httpGetUrl="http://192.168.21.129:80/OutputSomethingService/meta"/>
<!-- 要接收故障异常详细信息以进行调试,
请将以下值设置为 true。在部署前设置为 false
以避免泄漏异常信息 -->
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors> <services>
<service name="NginxWCFTest_Service.OutputSomethingService" behaviorConfiguration="metaBehavior">
<!--修改Binding为webHttpBinding-->
<endpoint address="" binding="basicHttpBinding"
contract="NginxWCFTest_Contract.IOutputSomething" >
<identity> </identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> <host>
<baseAddresses>
<add baseAddress="http://192.168.21.129:80/OutputSomethingService/" />
</baseAddresses>
</host>
</service>
</services> </system.serviceModel>
可以看得到服务端宿主的url端口是80,因为80是系统自带的默认端口。一般80作为网页服务器的访问端口,比如一个网站的ip地址是123.123.123.123,我们访问的是123.123.123.123:80 只是80是默认端口可以省略。

后面针对为什么用80端口会再一次介绍。
wcf客户端宿主(部署于192.168.21.3)
客户端宿主代码跟普通没有区别,唯一需要注意的是配置代码
namespace NginxWCFTest_Client
{
class Program
{
static void Main(string[] args)
{
string AddressIP = string.Empty;
foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
{
if (_IPAddress.AddressFamily.ToString() == "InterNetwork")
{
AddressIP = _IPAddress.ToString();
}
}
Console.WriteLine("本机IP是:" + AddressIP); using (ChannelFactory<IOutputSomething> channelFactory = new ChannelFactory<IOutputSomething>("OutputSomethingService"))
{
//ChannelFactory:一个创建不同类型通道的工厂,客户端使用这些通道将消息发送到不同配置的服务终结点
//创建通道
IOutputSomething proxy = channelFactory.CreateChannel();
for (int i = ; i < ; i++)
{
Console.WriteLine(proxy.GetContentData(i));
}
Console.Read();
} }
}

大家可以看到客户端指向的地址是jackchen.com地址。这个地址是nginx虚拟机的域名。为此,我们需要做以下事情。
主机域名处理
nginx虚拟机主机域名处理:

主机域名的文件路径地址在“C:\Windows\System32\drivers\etc\hosts" 上图红箭头为新增加域名,如果IE浏览器中输入jackchen.com即相当于输入http://192.168.21.128
WCF服务端主机域名处理

192.168.21.130与上图类似,配置为192.168.21.130 jackchen.com。
wcf客户端域名配置如下

nginx应用
上面讲了WCF分布式服务的客户端和服务端,也讲了主机域名的处理。现在讲讲Nginx的作用和为什么要做域名处理
nginx的基础知识我就多讲了,此处链接http://tengine.taobao.org/book/chapter_09.html.
从上一步的主机域名解析就可以知道,WCF客户端指向的是ngnix的虚拟机(192.168.21.128),然后由nginx做均衡负载和备份机制管理,
未使用nginx

使用nginx

nginx部署于192.168.21.128,需要对nginx文件夹中config文件进行配置。

配置信息为:
#user nobody;
worker_processes ; #error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info; pid logs/nginx.pid; events {
worker_connections ;
} http {
include mime.types;
default_type application/octet-stream; #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;
#tcp_nopush on; #keepalive_timeout ;
keepalive_timeout ; #gzip on; server {
listen ;
server_name jackchen.com; #charset koi8-r; #access_log logs/host.access.log main; location / {
autoindex off;#是否打开目录浏览
root \html\Views\Home;#默认主页目录在nginx安装目录的html子目录。
index Index.cshtml index.html index.htm;#起始页
proxy_pass http://jackchen.com;
} #error_page /.html; # redirect server error pages to the static page /50x.html
#
error_page /50x.html;
location = /50x.html {
root html;
} # proxy the PHP scripts to Apache listening on 127.0.0.1:
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#} # deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
} upstream linuxidc {
server 127.0.0.1:;
server 127.0.0.1:;
server 127.0.0.1:;
}
upstream jackchen.com {
server 192.168.21.129:;
server 192.168.21.130:;
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen ;
# listen somename:;
# server_name somename alias another.alias; # location / {
# root html;
# index index.html index.htm;
# }
#} # HTTPS server
#
#server {
# listen ssl;
# server_name localhost; # ssl_certificate cert.pem;
# ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on; # location / {
# root html;
# index index.html index.htm;
# }
#}
}
其中的修改点为:

upstream是配置集群,集群由192.168.21.129 和192.168.21.130组成
修改完了之后准备开启nginx,下图是进入nginx.exe所在的文件夹

接着输入 start nginx可以启动nginx,输入nginx -s stop可以停止nginx,输入nginx -s reload可以重启nginx
效果展示
启动两个服务端和nginx,同时启动客户端,效果图如下

关闭192.168.21.130效果图如下

nginx分布式实例入门操作的更多相关文章
- 【转】Nginx模块开发入门
转自: http://kb.cnblogs.com/page/98352/ 结论:对Nginx模块开发入门做了一个helloworld的示例,简单易懂.也有一定的深度.值得一看. Nginx模块开发入 ...
- Nginx模块开发入门
前言 Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%.与Apache相比,Nginx在高并 ...
- [转] Nginx模块开发入门
前言 Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%.与Apache相比,Nginx在高并 ...
- Nginx模块开发入门(转)
前言 Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%.与Apache相比,Nginx在高并 ...
- Nginx模块开发入门(转)
前言 Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%.与Apache相比,Nginx在高并 ...
- FW: Nginx模块开发入门
前言 Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%.与Apache相比,Nginx在高并 ...
- Nginx开发从入门到精通 学习目录分享学习 (阿里著作)
Nginx开发从入门到精通 缘起 nginx由于出色的性能,在世界范围内受到了越来越多人的关注,在淘宝内部它更是被广泛的使用,众多的开发以及运维同学都迫切的想要了解nginx模块的开发以及它的内部 ...
- Mysql的二进制安装和基础入门操作
前言:Mysql数据库,知识非常的多,要想学精学通这块知识,估计也要花费和学linux一样的精力和时间.小编也是只会些毛皮,给大家分享一下~ 一.MySQL安装 (1)安装方式: 1 .程序包yum安 ...
- 在Linux(Centos7)系统上对进行Hadoop分布式配置以及运行Hadoop伪分布式实例
在Linux(Centos7)系统上对进行Hadoop分布式配置以及运行Hadoop伪分布式实例 ...
随机推荐
- 区间dp(二维)——cf1199F
复杂度是O(N^5),枚举所有小矩形,转移时再按每列,每行进行转移 #include<bits/stdc++.h> using namespace std; #define N 55 in ...
- java基础集合底层介绍
ArrayList.Vector.HashMap.HashTable.HashSet的默认初始容量.加载因子.扩容增量 这里要讨论这些常用的默认初始容量和扩容的原因是: 当底层实现涉及到扩容时,容器或 ...
- C++之string面试问题
1.指针变量指向字符串常量的问题 代码如下: "; 问p[0]=2;是否可以?原因? 答案:不可以.“123456”是字符串常量,存储在常量区,其值不可更改. 2.sizeof求字符串长度问 ...
- Tomcat运行错误示例三
Tomcat运行错误示例三 最近碰到tomcat启动的问题,如图: 以前也碰见过这种情况,这次写的时候忘记加return,所以跳出了错误,加上之后的效果,如图: 参考网址 参考网址
- ArcGIS version not specified.
问题 在调用arcgis10 的ISurface用来取指定航线的地形时,这段代码在加载.dem时总是出错. 报: Fail to open raster dataset 解决方法: 在窗体中加载Map ...
- 拾遗:Git 与 Svn hook 不执行问题
要点: GIT 或 SVN 的 hook 执行之前,会将所有环境变量清空,因此在其中执行命令时,必须指定绝对路径或重新设置必要的环境变量,如:$HOME 等 修改为正确的名称,如:post-commi ...
- 剑指offer——42最小的K个数
题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 题解: 原以为书中会有好方法,想不到还是排序和STL这两种方法 ...
- python调用tushare获取IPO新股上市列表数据
接口:new_share 描述:获取新股上市列表数据 限量:单次最大2000条,总量不限制 积分:用户需要至少120积分才可以调取,具体请参阅本文最下方积分获取办法 注:tushare包下载和初始化教 ...
- 伪类checked
困惑了好久的复选框自定义样式终于有了谜底,原来就是一个 :checked 伪类 他的意思就是 匹配任意被勾选/选中的radio(单选按钮),chexked(复选框),或者option(select项) ...
- JS获取CkEditor在线编辑的内容
参考博文:[实践]获取CKEditor的html文本.纯文本.被选中的内容及赋值 1.获取CKEditor被选中的内容 var mySelection = CKEDITOR.instances.WOR ...