5月 27

log4net不用介绍了,很久以前就在使用了 零配置使用Log4Net

 

确实非常方便,一般小项目都是直接调用就好了,免除了配置的麻烦,直到最近遇到点小麻烦.

在一个站点我需要两个logger实例,记录两种类型的日志,并且把文件也分开到两个地方,但是实际用下来发现无法分离log内容,会有很多重复.

 

查了之后才明白,每个logger都会继承父类的东西,需要设置logger的additivity属性即可,

就像这样.

   <logger name='loggerRoot'  additivity='false'>

 可惜,我翻遍了也没找到可以用code设置additivity的方法.

 

找到配置的初始化方法.

//默认配置,就是把配置写到config文件的那种
public static ICollection Configure();
//配置从一个文件读取
public static ICollection Configure(FileInfo configFile);
//配置从一个流中获取
public static ICollection Configure(Stream configStream);

灵机一动.把配置字符串以流方式传进去实例化,规避配置文件

        static LogHelper()
        { 
            string xml = @"
  <log4net>
   <logger name='loggerRoot'  additivity='false'>
      <level value='ALL' />
      <appender-ref ref='LogAppender' />
    </logger>
   <logger name='loggerExe'  additivity='false'>
      <level value='ALL' />
      <appender-ref ref='LogExeAppender' />
    </logger>
  <appender name='LogAppender' type='log4net.Appender.RollingFileAppender'>
      <param name='File' value='logs/' />
      <param name='AppendToFile' value='true' /> 
      <param name='RollingStyle' value='Date' />
      <param name='DatePattern' value='yyyy.MM.dd"".log""' />
      <param name='StaticLogFileName' value='false' />
      <lockingModel type='log4net.Appender.FileAppender+MinimalLock' />
      <layout type='log4net.Layout.PatternLayout'>
        <param name='ConversionPattern' value='[%d][%p] - %m%n' />
      </layout>
    </appender>
  <appender name='LogExeAppender' type='log4net.Appender.RollingFileAppender'>
      <param name='File' value='logs/visit/' />
      <param name='AppendToFile' value='true' /> 
      <param name='RollingStyle' value='Date' />
      <param name='DatePattern' value='yyyy.MM.dd.HH"".log""' />
      <param name='StaticLogFileName' value='false' />
      <lockingModel type='log4net.Appender.FileAppender+MinimalLock' />
      <layout type='log4net.Layout.PatternLayout'>
        <param name='ConversionPattern' value='[%d][%p] - %m%n' />
      </layout>
    </appender>
  </log4net>
";
            using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
            {
                XmlConfigurator.Configure(stream);
            }
            logger = LogManager.GetLogger("loggerRoot");
           
        }
        static log4net.ILog logger = null;

试了一下果然可以了,从此可以以通用的方式定制自己的零配置log组件,太棒了,给自己点个赞

2017.6.21更新

加入asp.net core下的初始化方法

    static LogHelper()
        {
            string xml = @"
  <log4net>
   <logger name='loggerRoot'  additivity='false'>
      <level value='ALL' />
      <appender-ref ref='LogAppender' />
    </logger>
  <appender name='LogAppender' type='log4net.Appender.RollingFileAppender'>
      <param name='File' value='logs/' />
      <param name='AppendToFile' value='true' /> 
      <param name='RollingStyle' value='Date' />
      <param name='DatePattern' value='yyyy.MM.dd"".log""' />
      <param name='StaticLogFileName' value='false' />
      <lockingModel type='log4net.Appender.FileAppender+MinimalLock' />
      <layout type='log4net.Layout.PatternLayout'>
        <param name='ConversionPattern' value='[%d][%p] - %m%n' />
      </layout>
    </appender>
  </log4net>
";

            ILoggerRepository repository = LogManager.CreateRepository("NETCoreRepository");
            using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
            {               
                XmlConfigurator.Configure(repository, stream);
            }
            logger = LogManager.GetLogger(repository.Name, "loggerRoot");

        }

written by ocean \\ tags: ,

5月 25

程序本地跑的很好,结果一上服务器就提示错误

System.Web.HttpRequestValidationException
A potentially dangerous Request.Form value was detected from the client (html="<!doctype html>...").
Description: HTTP 500.Request validation detected a potentially dangerous input value from the client and aborted the request. This might be an attemp of using cross-site scripting to compromise the security of your site. You can disable request validation using the 'validateRequest=false' attribute in your page or setting it in your machine.config or web.config configuration files. If you disable it, you're encouraged to properly check the input values you get from the client

以前是asp.net webform的时候,解决方法是在页头加

ValidateRequest="false"

在web.config文件加配置

<system.web >
<pages validateRequest="false" ></pages > 
</system.web >

这样就解决了。

如果是.net framework 2.0以上版本需要加

<system.web >
<httpRuntime requestValidationMode="2.0" / >
</system.web >

 

 

 

做了mvc之后,一般用Unvalidated就可以,例如以下

            model.Html = Request.Unvalidated["html"];
            model.XPath = Request.Unvalidated["xpath"];

结果传到服务器还不行,查了一下,在action添加attrubte

        [ValidateInput(false)]
        public ActionResult Xpath(){
            //..
        }

结果还不行,还要在web.config加说明

<system.web >
<httpRuntime requestValidationMode="2.0" / >
</system.web >

终于可以了   

written by ocean

5月 22

 首先建表

CREATE TABLE `sys_visitlog` (
`Id`  int(11) NOT NULL AUTO_INCREMENT ,
`Url`  varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`Ip`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`Agent`  varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`AddDate`  datetime NULL DEFAULT NULL ,
`Type`  int(255) NULL DEFAULT NULL ,
`SubDomain`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
PRIMARY KEY (`Id`),
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=2564
ROW_FORMAT=COMPACT
;

 组件代码

    public class LogDBHelper
    {
        public static string ConnectionString = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];
        /// <summary>
        /// 访问日志到db
        /// </summary>
        /// <param name="url"></param>
        /// <param name="ip"></param>
        /// <param name="angent"></param>
        /// <param name="type">1,get    2,post</param>
        public static bool AddVisitLog(string url, string ip, string agent, int type, string SubDomain)
        {
            try
            {
                DateTime now = DateTime.Now;

                using (IDbConnection connection = new MySqlConnection(ConnectionString))
                {
                    var result = connection.Execute(@"insert into `sys_visitlog`(`Url`,`Ip`,`Agent`,`AddDate`,`Type`,`SubDomain`)
                                                                values
                                                                (?Url,?Ip,?Agent,?AddDate,?Type,?SubDomain)",
                                                       new { Url = url, Ip = ip, Agent = agent, AddDate = now, Type = type, SubDomain = SubDomain });
                    return result > 0;
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error(ex);
            }
            return false;
        }
    }

调用代码,埋点

            string url = HttpContext.Current.Request.Url.ToString().ToLower();
            string ip = IPHelper.ClientIP;
            var agentObject = HttpContext.Current.Request.ServerVariables["HTTP_USER_AGENT"];
            var SubDomain = HttpContext.Current.Request.Url.Host;
            LogDBHelper.AddVisitLog(url,
                ip,
                agentObject,
                ((HttpContext.Current.Request.RequestType == "POST") ? 2 : 1),
                SubDomain);

最后记录一下查看的语句

select count(*) c,url,ip from sys_visitlog  GROUP BY ip,url ORDER BY c DESC;

过滤

select count(*) c,url,ip from sys_visitlog  GROUP BY ip,url  HAVING count(*)>2

 post

select * FROM sys_visitlog WHERE Type=2

written by ocean

5月 18

 AngularJS中,通常需要注册一个module,然后为module在注册controller等。AngularJS不仅仅有angular.js文件,还有其他的js文件,比如用来做路由配置的angular-route.js文件等,每一个文件包含module,使用AngularJS的过程就是让这些modules协同工作的过程。

 

首先在页面引入AngularJS的核心js文件:

<script src="angular.min.js"></script>

接着,在定义js文件中为当前页面注册一个module:

var myApp = angular.module("helloApp",[])

以上,module的名称为helloApp, []数组用来存放与当前module有依赖关系的其它modules,比如['ngRoute','….']。

然后,为module注册controller。

    myApp.controller("TestController",['$scope',function($scope){
        $scope.hello = "Hello World!";
    }]);

 以上,controller()的第一个参数是controller的名称,第二个参数的数组,数组的最后一个元素一定是匿名函数,其它元素是AngularJS的全局service,或者说是全局对象。需要注意的是:数组中的全局service的位置和名称必须和匿名函数的形参一一对应。

我们还可以这样写:

myApp.controller("TestController", function($scope){
    $scope.hello = "Hello World!";  
});

不过,以上的写法在给js文件优化压缩的时候,会改变$scope变量的名称,比如替代为a,由于AngularJS只认$scope不认识a,这样会导致报错。所以,这种方法不推荐。

另外,全局service是以注入的方式被当前controller所使用。在AngularJS中,很多全局service都是通过依赖注入的方式被运用。

 

最后,页面中要做3件事情。

1、使用ng-app声明当前module的名称

<html ng-app="helloApp">

2、使用ng-controller声明需要使用的controller

<body ng-controller="TestController">

3、使用{{}}显示$scope中的变量

<p>{{hello.name}}</p>

 下面两种写法是等价的

<p>{{hello.name}}</p>
<p ng-bind="hello.name"></p>

 总结:留给我们的关键词是:module, module之间的协同和依赖, controller, 全局service依赖注入

 

项目目录

App/images // 存放Web前端使用的图片资源

App/Styles // 存放样式文件

App/scripts // 整个Web前端用到的脚本文件
                / Controllers // angularJS控制器模块存放目录
               /  directives // angularJs指令模块存放目录
              /   filters  // 过滤器模块存放目录
              /   services // 服务模块存放目录
            / app.js // Web前端程序配置模块(路由配置)
App/Modules  // 项目依赖库,angular、Bootstrap、Jquery库

App/Views // AngularJs视图模板存放目录

转载学习自:http://www.cnblogs.com/darrenji/p/4850739.html

written by ocean \\ tags:

5月 16

添加引用,这是引用的百度库

<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>

各版本最新地址

https://github.com/angular/angular.js/releases

AngularJS 通过 ng-directives 扩展了 HTML。

ng-app 指令定义一个 AngularJS 应用程序。

ng-model 指令把元素值(比如输入域的值)绑定到应用程序。

ng-bind 指令把应用程序数据绑定到 HTML 视图。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
</head>
<body>
<div ng-app="">
 	<p>名字 : <input type="text" ng-model="name"></p>
 	<h1>Hello {{name}}</h1>
</div>
</body>
</html>

绑定条件的例子

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>angularjs 模板解释</title>
    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
    <script type="text/javascript">
        (function () {
            var app = angular.module("testApp", []);
            app.controller("tmplController", ["$scope", function ($scope) {
                //给变量val赋值
                $scope.val = "学习AngularJS";
                //给变量list赋值
                $scope.list = [
                    { title: "古诗大全", url: "http://www.wx6.org/" },
                    { title: "成语大全", url: "http://chengyu.wx6.org/" },
                    { title: "词语大全", url: "http://ciyu.wx6.org/" },
                    { title: "汉字大全", url: "http://hanzi.wx6.org/" },
                    { title: "歇后语大全", url: "http://xiehouyu.wx6.org/" }
                ]
                //给变量hasValue赋值
                $scope.hasValue = false;
            }]);
        })()
    </script>
</head>
<body ng-app="testApp">
    <div ng-controller="tmplController">
        <!--普通输出-->
        <div>{{val}}</div>
        <!--循环-->
        <ul ng-repeat="item in list">
            <li><a href="{{item.url}}" rel=nofollow>{{item.title}}</a></li>
        </ul>
        <!--条件语句-->
        <div ng-if="!hasValue">
            Angularjs条件语句
        </div>
    </div>
</body>
</html>

&scope是控制器与页面沟通的主要元素,测试一下angularjs的双向绑定.

<!DOCTYPE html> 
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>angularjs控制器介绍</title>
        <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
        <script type="text/javascript">
            (function () {
                var app = angular.module("Yiim", []);
                app.controller("cntoController", ["$scope", function ($scope) {
                    var defaults = "ocean's test";
                    //设置值
                    $scope.val = defaults;
                    $scope.click = function () {
                        $scope.val = defaults;
                    };
                }]);
            })()
        </script>
    </head>
    <body ng-app="Yiim">
        <div ng-controller="cntoController">
            <!--绑定值-->
            <div><textarea ng-model="val"></textarea></div>
            <!--输出值-->
            <div>{{val}}</div>
            <!--绑定方法-->
            <div><button ng-click="click()">重置</button></div>
        </div>
    </body>
</html>


路由

单页Web应用由于没有后端URL资源定位的支持,需要自己实现URL资源定位。angularjs使用浏览器URL "#" 后的字符串来定位资源,区分不同的功能模块。

路由并非在angularjs核心文件内,需要另外加入一段脚本 “angular-route.min.js”

需要注意的是在创建 “app” 对象是需要填写对 ngRoute 依赖

route.html

<!DOCTYPE html>
<html ng-app="Yiim" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>angularjs路由介绍</title>
    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
    <script src="http://apps.bdimg.com/libs/angular-route/1.3.13/angular-route.js"></script>
    <script type="text/javascript">
        (function () {
            //设置当前模块依赖,“ngRoute”,用.NET的理解就是给这个类库添加“ngRoute”引用
            var app = angular.module("Yiim", ['ngRoute']);
            //配置路由
            app.config(['$routeProvider', function ($routeProvider) {
                var route = $routeProvider;
                //指定URL为“/” 控制器:“indexController”,模板:“route.html”
                route.when('/list', { controller: 'listController', templateUrl: 'route-list.html' });
                //注意“/view/:id” 中的 “:id” 用于捕获参数ID
                route.when('/view/:id', { controller: 'viewController', templateUrl: 'route-view.html' });
                //跳转
                route.otherwise({ redirectTo: '/list' });
            }]);
            //创建一个提供数据的服务器
            app.factory("service", function () {
                var list = [
                    { id:1, title: "古诗大全", url: "http://www.wx6.org/" },
                    { id: 2, title: "成语大全", url: "http://chengyu.wx6.org/" },
                    { id: 3, title: "词语大全", url: "http://ciyu.wx6.org/" },
                    { id: 4, title: "汉字大全", url: "http://hanzi.wx6.org/" },
                    { id: 5, title: "歇后语大全", url: "http://xiehouyu.wx6.org/" }
                ];
                return function (id) {
                    //假如ID为无效值返回所有
                    if (!id) return list;
                    var t = 0;
                    //匹配返回的项目
                    angular.forEach(list, function (v, i) {
                        if (v.id == id) t = i;
                    });
                    return list[t];
                }
            })
            //创建控制器 indexController
            app.controller("listController", ["$scope", "service", function ($scope, service) {
                //获取所有数据
                $scope.list = service();
            }]);
            //创建查看控制器 viewController, 注意应为需要获取URL ID参数 我们多设置了一个 依赖注入参数 “$routeParams” 通过它获取传入的 ID参数
            app.controller("viewController",
                            ["$scope", "service", '$routeParams',
                                function ($scope, service, $routeParams) {
                                    $scope.model = service($routeParams.id || 0) || {};
                                }
                            ]
                            )
        })()
    </script>
</head>
<body>
    <div><a href="#/list">列表</a></div>
    <div ng-view>
    </div>
</body>
</html>

route-list.html

<ul ng-repeat="item in list">
    <li><a href="#view/{{item.id}}">{{item.title}}</a></li>
</ul>

route-view.html

<div>
    <div>网站ID:{{model.id}}</div>
    <div>网站名称:<a href="{{model.url}}" rel="nofollow">{{model.title}}</a></div>
    <div>访问地址:{{model.url}}</div>
</div>

以上代码中,我们首先配置了三条个处理个局部页面的路由

路由处理列表页并设置控制器为"listController",指定模板页为"route-list.html"

route.when('/list', { controller: 'listController', templateUrl: 'route-list.html' });

 

与上面不同的是第二条路由中包含":id"用于捕获URL后面的参数 。

route.when('/view/:id', { controller: 'viewController', templateUrl: 'route-view.html' });

 

处理所有未匹配到的路由跳转到 "'/list'"内。

route.otherwise({ redirectTo: '/list' });

 

我们还使用了模块方法 "factory" 创建一个"service" 服务,用于获取数据列表

后面我们声明了两个控制器"listController","viewController",同时配置对"service"的依赖,"viewController" 中我们还添加对"$routeParams" 的依赖,用于获取路由捕获的id。

需要注意的是我们再主页面声明了"ng-view"用于指定局部页面和控制器作用范围。

<div ng-view></div>

 

指令

 

下面的例子中,我们使用模块创建了一个指令"imCheck",并在指令方法"link"注册了使用当前指令的dom对象注册了两个delegate方法 处理全选和子选择项状态改变处理的方法。

"imCheck" 对应在html页面的属性为 "im-check" 注意大小写。

<table ng-controller="dectController" im-check>

还要注意的是我们使用了jQuery来操作dom节点。

<!DOCTYPE html>
<html ng-app="Yiim" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>angularjs指令演示</title>
    <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script> 
    <script type="text/javascript">
        (function () {
            var app = angular.module("Yiim", []);

            //创建一个提供数据的服务器
            app.factory("service", function () {
                var list = [
                    { id: 1, title: "古诗大全", url: "http://www.wx6.org/" },
                    { id: 2, title: "成语大全", url: "http://chengyu.wx6.org/" },
                    { id: 3, title: "词语大全", url: "http://ciyu.wx6.org/" },
                    { id: 4, title: "汉字大全", url: "http://hanzi.wx6.org/" },
                    { id: 5, title: "歇后语大全", url: "http://xiehouyu.wx6.org/" }
                ];
                return function (id) {
                    //假如ID为无效值返回所有
                    if (!id) return list;
                    var t = 0;
                    //匹配返回的项目
                    angular.forEach(list, function (v, i) {
                        if (v.id == id) t = i;
                    });
                    return list[t];
                }
            })
            //创建指令imCheck 在HTML中的语法为 im-check
            app.directive("imCheck", [function () {
                return {
                    restrict: 'A',
                    replace: false,
                    link: function (scope, element) {
                        var all = "thead input[type='checkbox']";
                        var item = "tbody input[type='checkbox']";
                        //当点击选择所有事便利所有项目
                        element.on("change", all, function () {
                            var o = $(this).prop("checked");
                            var tds = element.find(item);
                            tds.each(function (i, check) {
                                $(check).prop("checked", o);
                            });
                        });
                        //子项修改时的超值
                        element.on("change", item, function () {
                            var o = $(this).prop("checked");
                            var isChecked = true;
                            if (o) {
                                element.find(item).each(function () {
                                    if (!$(this).prop("checked")) {
                                        isChecked = false;
                                        return false;
                                    }
                                    return true;
                                });
                            }
                            element.find(all).prop("checked", o && isChecked);
                        });
                    }
                };
            }])

            app.controller("dectController", ['$scope', 'service', function ($scope, service) {
                $scope.list = service();
            }])
        })();
    </script>
</head>
<body>
    <!--注意一下标签 im-check 指定使用的指令-->
    <table ng-controller="dectController" im-check>
        <thead>
            <tr>
                <th><input type="checkbox">选择</th>
                <th>网站ID</th>
                <th>网站名称</th>
                <th>链接地址</th>
            </tr>
        </thead>
        <tbody>
            <tr ng-repeat="item in list">
                <td><input type="checkbox"></td>
                <td>{{item.id}}</td>
                <td>{{item.title}}</td>
                <td>{{item.url}}</td>
            </tr>
        </tbody>
    </table>
</body>
</html>

 

过滤器

 

angularjs过滤器,用来格式化数据(转化,排序,筛选等操作)。

<!DOCTYPE html>
<html ng-app="Yiim" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>angularjs 过滤器</title>
    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script> 
    <script type="text/javascript">
        (function () {
            var app = angular.module("Yiim", []);
            app.controller("namesController", ["$scope", function ($scope) {
                $scope.names = [
                     { "Name": "Alfreds Futterkiste", "City": "Berlin", "Country": "Germany" },
                     { "Name": "Berglunds snabbköp", "City": "Luleå", "Country": "Sweden" },
                     { "Name": "Centro comercial Moctezuma", "City": "México D.F.", "Country": "Mexico" },
                     { "Name": "Ernst Handel", "City": "Graz", "Country": "Austria" },
                     { "Name": "FISSA Fabrica Inter. Salchichas S.A.", "City": "Madrid", "Country": "Spain" },
                     { "Name": "Galería del gastrónomo", "City": "Barcelona", "Country": "Spain" },
                     { "Name": "Island Trading", "City": "Cowes", "Country": "UK" },
                     { "Name": "Königlich Essen", "City": "Brandenburg", "Country": "Germany" },
                     { "Name": "Laughing Bacchus Wine Cellars", "City": "Vancouver", "Country": "Canada" },
                     { "Name": "Magazzini Alimentari Riuniti", "City": "Bergamo", "Country": "Italy" },
                     { "Name": "North/South", "City": "London", "Country": "UK" },
                     { "Name": "Paris spécialités", "City": "Paris", "Country": "France" },
                     { "Name": "Rattlesnake Canyon Grocery", "City": "Albuquerque", "Country": "USA" },
                     { "Name": "Simons bistro", "City": "København", "Country": "Denmark" },
                     { "Name": "The Big Cheese", "City": "Portland", "Country": "USA" },
                     { "Name": "Vaffeljernet", "City": "Århus", "Country": "Denmark" },
                     { "Name": "Wolski Zajazd", "City": "Warszawa", "Country": "Poland" }
                ];
            }])
        })()
    </script>
</head>
<body>
    <div ng-controller="namesController">
        <p>输入过滤:</p>
        <p><input type="text" ng-model="name"></p>
        <ul>
            <li ng-repeat="x in names | filter:name | orderBy:'Country'">
                {{ (x.Name | uppercase) + ', ' + x.country }}
            </li>
        </ul>
    </div>
</body>
</html>

written by ocean

5月 12

闲来学习IOS,不打算学习Object-c了,直接swift入手

println("Hello Swift")

written by ocean

5月 06

查看状态

iptables -L

要允许ssh

iptables -A INPUT -p tcp  eth0 --dport ssh -j ACCEPT

 开放80端口

iptables -A INPUT -p tcp  eth0 --dport 80 -j ACCEPT

 屏蔽IP

iptables -I INPUT -s 59.151.119.180 -j DROP

written by ocean

5月 05

做负载用,记录一下配置

 

之前都是用mono的  Ubuntu安装配置笔记+运维常用命令,结果jexus作者做了免安装mono的版本,顺便测试一下

 

下载,解压

cd /tmp
wget linuxdot.net/down/jexus-5.8.1-x64.tar.gz
tar -zxvf jexus-5.8.1-x64.tar.gz

移动到usr下

sudo mv jexus /usr 
sudo rm -rf /tmp/jexus*

这样就安装完成了。so cool !

配置参考之前方式 程序迁移到Linode的Linux主机了

 

输入地址访问,一切OK!

 

然后是安装Nginx

之前有在windows下使用过 nginx本地开发

另外centos里也有安装过 CentOS下安装Nginx

今天试试ubuntu里的安装配置,果然很简单

apt-get install nginx

现在来配置一下
开启服务

sudo service nginx start

查询状态

sudo service nginx status

重新加载配置

sudo service nginx reload

配置文件

server {
	listen 80 ; 
	server_name www.wx6.org; 
	location / {
		if ($request_method = PUT ) {
			return 403;  
		}
		if ($request_method = DELETE ) {
			return 403;
		}
		if ($request_method = POST ) { #过滤POST请求
			return 403;
		}
		proxy_method GET;
		proxy_pass http://www.wx6.org:8080; 
	} 
}

另外因为我的网站比较特殊,需要本地修改host解析到本地

/etc/hosts

127.0.0.1	www.wx6.org

 

 

 

 

 

2018.4.20补充

nginx做负载均衡

首先在目录 /etc/nginx/conf.d/下面添加配置,任何名字都可以,但是需要以.conf为结尾

我在这里新建d2.conf作为文件名

upstream aspnetcoreservers {  
    server 172.28.3.125:8001;  
    server 172.28.3.125:8002;   
    server 172.28.3.125:8003;   
    server 172.28.3.125:8004;   
    server 172.28.3.125:8005;  
    } 

server {
    listen       80;
    server_name  172.28.3.125;

    location / {
        proxy_pass http://aspnetcoreservers;  
    } 
}

用了5个server做负载平衡,还有很多策略,需要用到的话再看。

特别重要一点,因为我使用的winscp修改的配置文件,文件的编码很重要 一定要选UTF-8 without BOM.

否则会出很多莫名其妙的问题,今天又在这个上面浪费时间了。

written by ocean