重游清泉寺

吴姑城也叫清泉寺、巍霸山城,我们本地人一般叫它吴城庙,是一座拥有1300多年(巍霸山城始建于东汉光武年间,距今1900多年)历史的古寺,始建于唐贞观年间,这也是整个辽宁历史最悠久的一个寺庙了吧,坐落于普兰店市星台镇葡萄沟。
我对它的印象不深,只记得最近一次去的时候,应该是在初中二年级(也可能是一年级?),学校组织一起去的,想一下到现在,应该有20年了。当时是骑着自行车,骑了20多里地才到,之后还要爬山去找学校老师提前藏在山里的“宝藏”,找到之后的奖品一般是个作业本、铅笔等比较廉价的学习用品,但是当时如果能找到一个的话,也可以开心一整天了,而我却什么也找不到。
印象里,那时候来的时候,是从东城门进来的,新建的这部分在刚进门这里,正在开工,刚盖好了最北面的那一栋,正在弄屋顶。古建筑那部分现在看和当时的印象里差不多,没太大变化,心里很欣慰。
传说中,当年薛礼征东的时候,把高丽人一直往东打,死伤千人,之后回到巍霸山城安营扎寨,寻找到一湾清泉用于饮马,后来称为饮马湾;在一处清点剩下的将士,称为点将台;另外有一处为烽火台。而这几处现在在哪里我已经没有印象了,而我也因为时间紧促,也没有再次寻找,更没有像小时候那样沿着三面的山走一遍。
当然,除了传说,也有近代的抗日时期及之后的故事。抗战的时候,这里保护过共产党,也有很多女伤员在这里养伤。在文化大革命的时候,因为当年共产党留下了个红星而没有造到“破四旧”的破坏,才得以保存至信,这也应了那句善有善报。
这次时间比较仓促,没能久逛,除了烽火台、点将台、饮马湾等没去之外,最上面的娘娘庙因为今天没开放,也没有上去。另外新建的这些我也没进去,因为对它们没有那种特殊的感情在里面,毕竟对它们的印象几乎为零。大概的照了几张照片,尽量避开了佛像。

东城门入口
东城门入口

近代仿建
从东城门进来之后的近代仿建建筑群(只有20多年)

一洞天
向西往上的一洞天

道义之门
道义之门

万世佛
万世佛

古建筑的清瓦
古建筑的青瓦

IMG_20171104_140147.jpg
视野中能看到的最高的那个,就是我小时候来的时候刚建好的那个

IMG_20171104_140330.jpg
莲花界

IMG_20171104_140514.jpg
近代新建筑群

IMG_20171104_140528.jpg
南向北侧面

IMG_20171104_134619.jpg
周围的山

IMG_20171104_134834.jpg
莲花池

IMG_20171104_135300.jpg

.Net网站下使用Oracle数据库的环境设置

在.Net网站下使用Oracle,需要网站服务器安装Oracle数据库的客户端,这是目前必须要安装的。
以下是在Windows Server 2008 R2服务器环境下的设置方法及注意事项,其他系统可能会略有不同。
1.服务器需要安装Oracle数据库的客户端,版本为Oracle Database 11g Release 1,而且只能使用这个版本,其他版本不可行,另外需要与你的网站应用池的位数(32位或64位)一致;
2.安装时,安装类型选择“运行时”;
3.安装完成后,查看环境变量中,有没有把安装目录下的BIN文件夹添加到环境变量中,如:D:\app\Administrator\product\11.2.0\client_1\bin;;
4.打开安装目录右键属性,切换到“安全”选项卡,编辑,选中“Authenticated Users“,把”读取和执行“权限去掉,之后再重新勾选,之后”应用“;
5.最后一步,也是重要的一步,那就是重启服务器,不重启服务器不会生效。

这就可以了。

通过VG方式给CentOS 7的root分区扩容

我有个VPS,因为不能自己安装系统,每次都得提交工单让他们帮助安装,而他们使用的也是模板安装,系统盘只给20G,/dev/mapper/centos-root分区只有8.5G,系统刚安装完一切都还好,大概只占用了不到2G,可是日积月累,这个分区就会吃满。那有没有办法在后期给/dev/mapper/centos-root分区扩展呢?最好是无痛的,答案当然是:有。
这个是有前提条件的,那就是你还得有一块数据盘,当然,我的VPS是有格外有一块150G的数据盘了,我不想把整块硬盘全加到/dev/mapper/centos-root分区,所以,先把这个数据盘分区,比如我要拿出30G加到root分区,那么我就需要把数据盘分成30G和120G这两个区,之后把30G的分区加到root上。下面是简单的步骤了:
1.先看下各盘的占用情况:

[root@localhost ~]# df -h

显示:

[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root  8.5G  1.8G  6.8G  21% /
devtmpfs                 1.9G     0  1.9G   0% /dev
tmpfs                    1.9G     0  1.9G   0% /dev/shm
tmpfs                    1.9G   17M  1.9G   1% /run
tmpfs                    1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/sda1                497M  151M  346M  31% /boot
tmpfs                    379M     0  379M   0% /run/user/0

查看磁盘情况:

fdisk -l

之后给空闲的数据盘分区,分成30G和120G两个区:

fdisk /dev/sdb
n
p
enter
enter
+30G
w

和第二个区:

fdisk /dev/sdb
n
p
enter
enter
enter
w

分完区之后,对两个区分别格式化:

mkfs.ext4 /dev/sdb1

mkfs.ext4 /dev/sdb2

创建PV:

[root@localhost ~]# pvcreate /dev/sdb1
WARNING: ext4 signature detected on /dev/sdb1 at offset 1080. Wipe it? [y/n]: y
  Wiping ext4 signature on /dev/sdb1.
  Physical volume "/dev/sdb1" successfully created.

查看下vg组:

[root@localhost ~]# vgs
  VG     #PV #LV #SN Attr   VSize  VFree
  centos   1   2   0 wz--n- <9.51g 40.00m

使用vgextend命令,扩展vg:

[root@localhost ~]# vgextend centos /dev/sdb1
  Volume group "centos" successfully extended

再查看下vg组:

[root@localhost ~]# vgs
  VG     #PV #LV #SN Attr   VSize  VFree
  centos   2   2   0 wz--n- 39.50g <30.04g

看下lv:

[root@localhost ~]# lvs
  LV   VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root centos -wi-ao---- <8.47g
  swap centos -wi-ao----  1.00g

使用lvextend来扩展lv

[root@localhost ~]# lvextend -L +30G /dev/mapper/centos-root
  Size of logical volume centos/root changed from <8.47 GiB (2168 extents) to <38.47 GiB (9848 extents).
  Logical volume centos/root successfully resized.

查看下lv:

[root@localhost ~]# lvs
  LV   VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root centos -wi-ao---- <38.47g
  swap centos -wi-ao----   1.00g

使用df -h看下分区情况:

[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root  8.5G  1.8G  6.8G  21% /
devtmpfs                 1.9G     0  1.9G   0% /dev
tmpfs                    1.9G     0  1.9G   0% /dev/shm
tmpfs                    1.9G   17M  1.9G   1% /run
tmpfs                    1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/sda1                497M  151M  346M  31% /boot
tmpfs                    379M     0  379M   0% /run/user/0

发现大小还是没变,我们使用xfs_growfs来重新读取一次:

[root@localhost ~]# xfs_growfs /dev/mapper/centos-root
meta-data=/dev/mapper/centos-root isize=256    agcount=4, agsize=555008 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=2220032, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 2220032 to 10084352

我们再来看下加没加上:

[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   39G  1.8G   37G   5% /
devtmpfs                 1.9G     0  1.9G   0% /dev
tmpfs                    1.9G     0  1.9G   0% /dev/shm
tmpfs                    1.9G   17M  1.9G   1% /run
tmpfs                    1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/sda1                497M  151M  346M  31% /boot
tmpfs                    379M     0  379M   0% /run/user/0

现在/dev/mapper/centos-root变成了39G,多出来了30G,说明已经加上了。
到这里操作就已经结束了。

在.Net Core 2.0中使用MySQL

在之前,我简单的介绍过在.net core中使用Mongodb(见文章《.Net Core系列教程(三)——使用Mongodb》),也使用过PostgreSQL(但是没有写文章介绍怎么使用,只是在文章《.Net Core系列教程(一)——环境搭建》中简单介绍过如何安装)。当然,我的文章质量都不高,只是把自己平时遇到的问题记录下来,很多问题是自己经历过之后在网上苦苦的寻找答案但都不适用或者不明了的情况下,自己摸索出来的解决方案,这也算是防止自己再次误入坑,也给遇到同样问题的朋友一点帮助吧。
下面说下怎样在.net core中使用MySQL,这个问题网上随便一搜有很多,我的当然也是从网上搜索来的,只是用自己的语言再次整理下而已。
在使用MySQL时,需要使用到MySQL的驱动,之前MySQL官方没有出驱动的时候,需要使用第三方的,不过现在有官方的驱动,还是尽量使用官方的吧,我这里也以官方的为准。另外还用到了Dapper这个小型ORM,这两个都可以通过Nuget来安装。需要注意的是,MySQL.Data需要安装最新版的(现在是6.10.3-rc版),旧版本不支持.net core 2.0
先在appsettings.json文件中,添加数据库的配置:

  "ConnectionStrings": {
    "MySqlConnection": "server=127.0.0.1;userid=root;pwd=root's password;port=3306;database=database's name;sslmode=none;Charset=utf8;"
  }

之后,增加数据库连接的Model类:

    public class ConnectionStrings
    {
        public string MySqlConnection { get; set; }        
    }

在Startup.cs文件中的ConfigureServices方法里,在services.AddMvc();之前增加添加调用:

services.Configure<Models.ConnectionStrings>(Configuration.GetSection("ConnectionStrings"));

这样就会把appsettings.json中的数据库连接配置注入到Models.ConnectionStrings实体类中。
在控制器中,添加:
private readonly IOptions<Models.ConnectionStrings> _settings;
之后控制器的构造函数:

        public NewsController(IOptions<Models.ConnectionStrings> settings)
        {
            _settings = settings;
        }

这里我是直接把数据库连接的实体类传给了DAL层,这样写:

        public NewsController(IOptions<Models.ConnectionStrings> settings)
        {
            _settings = new BLL.ServiceImp.News(settings.Value);
        }

其中的settings.Value就是数据库连接实体类了

之后在DAL层中使用,同时也附带了几个数据库操作的实例:

        private string ConnString;
        public News(Models.ConnectionStrings Connection)
        {
            ConnString = Connection.MySqlConnection;
        }


        /// <summary>
        /// 取前top条新闻
        /// </summary>
        /// <returns></returns>
        public async Task<Models.ResultModel<List<Models.News>>> Newslatest(int top)
        {
            Models.ResultModel<List<Models.News>> result = new ResultModel<List<Models.News>>();

            using (var Conn = new MySqlConnection(ConnString))
            {
                string sql = "select Id,title,datetime,writer,remark,body,cid,status,isimage,thumb,category from news where status=1 order by datetime desc limit 0,@top";
                var data = await Conn.QueryAsync<Models.News>(sql, new { top = top });
                if(data.Count()>0)
                {
                    result.code = 0;
                    result.status = true;
                    result.message = "OK";
                    result.data = data.AsList();
                }
            }

            return result;
        }

        /// <summary>
        /// 取单条
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public async Task<Models.ResultModel<Models.News>> Detail(int id)
        {
            Models.ResultModel<Models.News> result = new ResultModel<Models.News>();
            using (var Conn =  new MySqlConnection(ConnString))
            {
                string sql = "select n.Id,title,datetime,writer,remark,body,cid,status,isimage,thumb,c.category from news n left join category c on n.cid=c.id where n.Id=@id";
                var res = await Conn.QueryAsync<Models.News>(sql, new { id = id });
                var data = res.SingleOrDefault();  //注意这里
                result.code = -404;
                result.message = "没有找到该条新闻";
                if (data != null)
                {
                    result.status = true;
                    result.message = "OK";
                    result.code = 0;
                    result.data = data;
                }
                else
                {
                    result.status = false;
                    result.code = -404;
                    result.message = "没有找到该条新闻";
                }
            }
            return result;
        }


        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public async Task<Models.ResultModel<object>> Delete(int id)
        {
            Models.ResultModel<object> result = new ResultModel<object>();
            using (var Conn = new MySqlConnection(ConnString))
            {
                string sql = "delete from news where Id=@id";
                var res = await Conn.ExecuteAsync(sql, new { id = id });
                result.status = res > 0;
                if (result.status)
                {
                    result.code = 0;
                    result.message = "success";
                }
            }

            return result;
        }


        /// <summary>
        /// 使用事务
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public async Task<Models.ResultModel<object>> DeleteCategory(int id)
        {
            Models.ResultModel<object> result = new ResultModel<object>();

            using (var Conn = new MySqlConnection(ConnString))
            {
                Conn.Open();  //注意这里,使用事务时,需要先open
                using (IDbTransaction transaction = Conn.BeginTransaction())
                {
                    try
                    {
                        string sql = "update news set cid=0 where cid=@id;delete from category where Id=@id;";   //删除分类,同时把该分类下的新闻移动到默认分类下
                        var res = await Conn.ExecuteAsync(sql, new { id = id });
                        transaction.Commit();   //提交事务
                        result.status = res > 0;
                        if (result.status)
                        {
                            result.code = 0;
                            result.message = "success";
                        }
                        else
                        {
                            transaction.Rollback(); //删除失败,回滚
                        }
                    }
                    catch
                    {
                        transaction.Rollback(); //出现异常,回滚
                    }
                }
                Conn.Close();   
                
            }
            return result;
        }

以上。

.Net Core 2.0的一些不大一样的地方(二)——服务器环境

我在《.Net Core 2.0的一些不大一样的地方(一)——基础身份认证》中,说了下关于Cookies的不同之处,在这篇文章中,我说下关于服务器的相关问题。
服务器的环境安装,在官网中介绍的.Net Core 2.0环境的安装方法,是通过源的方法来安装,我尝试了下,失败了,可能是和我的服务器中有之前的.Net Core 1.0环境有关。把原来的环境删掉,先删除/usr/local/bin/dotnet软链接,之后再删除掉.net core的文件夹/opt/dotnet。不过我后面再没有试通过源的方式安装是否没问题,这里我还是使用.net core 1.0的时候安装的方法,下载.net core 2.0 sdk,之后解压缩设置软链接的方式安装。
微软官方给出的通过源安装的方法,参见:《.NET and C# - Get Started in 10 Minutes》一文,自行选择自己使用的操作系统,来按步骤安装。
如果在程序中,使用了身份认证(如Cookies等,见《.Net Core 2.0的一些不大一样的地方(一)——基础身份认证》),那么还需要在Startup.cs文件的Configure方法中,在调用UseAuthentication之前调用UseForwardedHeaders,如下:

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});

app.UseAuthentication();

这样,在做身份验证的时候,能够通过反代服务器取到用户访问的URL,不然的话,会因为URL不一致(用户访问的是Nginx服务器上绑定的域名,而.net core服务器使用的是localhost)导致验证失败。
nginx服务器的安装及反代服务配置与之前的版本没有什么区别,有区别的是守护程序的配置,使用的还是systemd(systemctl),配置中,需要多设置一项:
WorkingDirectory=站点的根目录
如:

[Unit]
Description=Example .NET Web API Application running on Ubuntu
[Service]
WorkingDirectory=/var/aspnetcore/hellomvc
ExecStart=/usr/local/bin/dotnet /var/aspnetcore/hellomvc/hellomvc.dll
Restart=always
RestartSec=10 # Restart service after 10 seconds if dotnet service crashes
SyslogIdentifier=dotnet-example
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
[Install]
WantedBy=multi-user.target

如果不设置这项的话,所有的静态资源文件都请求不到,返回502或404错误。

好了,基本就这些了吧,遇到其他的再继续补充。

分类

最新文章

最近回复

归档

标签云

C# .net core asp.net 情感 SQL mongodb sql server EasyUI linux 身份验证 typecho .net sql注入 安全 kms 激活 MVC https IIS 高并发 IE 坑爹 服务器 mysql Combobox Datagrid 口语 数据抓取 远程下载

其它