Windows设置多用户同时远程登录

Windows7设置多用户同时远程登录

有时候服务器是Win7系统的时候,远程登录桌面时,即使登录的是不同的管理账号,还是会把远程登录的人给踢下来。即不同的账号只能同时存在一个会话窗。下面教大家如果设置Win7让两个账号的两会话同时存在,且相互之间不冲突。

设置步骤

1、创建需要远程的两个用户账号。点击桌面计算机,右键—>管理—>本地用户和组—>用户—>新建用户。假设创建一个用户UserTable

 

2、开启计算机远程。点击桌面计算机,右键—>属性—>远程设置—>勾上允许任意版本远程桌面的计算机连接。

 

3、将新建用户添加到远程桌面组。在远程设置里面,点击用户—>添加。

 

4、在选择用户里面,点击高级–立即查找,找到刚刚我创建的需要远程的用户,依次点击确定。一般管理员账号的不需要再添加的。管理员账号本来就属于远程账号组。

 

5、防火墙如果是开着的,就需要确认是否开启远程桌面服务。控制面板—>系统和安全—>Windows 防火墙—>高级设置—>入站规则。确认远程桌面是服务是启用状态。

 

6、点击开始菜单—>运行—>输入“gpedit.msc”进入本地组策略编辑器。

 

7、在本地组策略编辑器里面,依次展开计算机配置—>管理模板—>Windows组件—>远程桌面服务—>远程桌面会话主机—>连接—>限制连接的数量。

 

8、打开限制连接数,这里未配置时,默认的最大连接数是1.点击已启用—>允许的RD最大连接数为该为2—>确定。

 

9、打开“远程桌面服务用户限制到单独的远程桌面服务会话”,点击已禁用,然后确定。

10、下载一个universal termsrv.dll patch。

链接:http://pan.baidu.com/s/1kV9hirt 密码:jqg2

第三方工具。解压到文件夹。打开UniversalTermsrvPatch文件夹—>管理员身份运行UniversalTermsrvPatch-x86.exe文件。

 

win服务器版默认是支持多用户登陆的,甚至可以在主机上用不同用户自己远程登陆自己,如window server 2016。

Win10 正常情况下是不允许用户同时远程的,即一个用户远程进来会把另一个用户踢掉,因此需要破解才能使得多个用户同时登陆远程桌面。

主要有以下两个步骤:

  1. 主机修改远程登录相关配置;

  2. 破解远程登录用户限制;

 

主机修改远程登录相关配置。

  • 新建用户:

右键“此电脑—>管理—>本地用户和组“,右键”用户—>新用户“,添加用户名,设置密码(勾选密码永不过期)。然后点击创建即可。

  • 添加远程桌面用户

右键“此电脑—>属性—>远程设置“

勾选“允许远程协助连接这台计算机“。然后点击”选择用户—>添加—>高级—>立即查找“找到刚刚创建的用户,点击确定。

  • 配置本地组策略

运行 gpedit.msc 打开本地组策略编辑器。

选择“【管理模板】—>【Windows组件】—>【远程桌面服务】—>【远程桌面会话主机】—>【连接】。

  • 配置【限制连接的数量】,点击“已启用”,其中允许的RD最大连接数可以自己视情况而定。

  • 配置【将远程桌面服务用户限制到单独的远程桌面服务会话】

这个配置很重要,我最开始没配置,导致断开一个远程登录连接后,再重新连接,会重新打开一个新的桌面。但是打开新的应用程序时,系统提示系统后台正在运行,之前断开前的应用程序一个也找不到。后来发现是因为这部分设置没配置时,同一个用户先后登陆远程系统,系统会分配不同的会话,从而导致你在一个远程桌面的操作都不见了,虽然你运行的一些程序并没有被系统关闭,但是你无法对他们进行管理。

  • 配置【允许用户通过使用远程桌面服务进行远程连接】,启用即可。

 

 

  • 破解远程登录用户限制

  • 下载解除远程桌面多用户连接限制补丁  下载地址:

https://download.csdn.net/download/qyy_nice/10924112

解压其中的RDP压缩包,然后以管理员身份运行install.bat安装,安装完成后,运行RDPConf.exe,查看各个组件运行状态,状态全部为绿色就可以使用多用户远程桌面了。

如果端口监听为Nothing listening, 或者出现Listening [not supported], 则需要运行一下update.bat。

对于大部分计算机以上方法是完全可行的,但是我的控制台版本是1809系列,操作系统为17763,以上方法不行.

 

那么根据RDP补丁的原理是修改termsrv.dll和termsrv.dll.mui这两个远程服务文件达到多用户登陆目的。我把本系统的termsrv.dll和termsrv.dll.mui两个文件提取出来,并且覆盖了本机的文件,发现已经可以远程多用户登陆了。

破解文件在上面下载文件中的第二个压缩包内。

termsrv.dll文件在C:\Windows\System32内

termsrv.dll.mui文件在C:\Windows\System32\zh-CN内

覆盖完成后,运行RDPConf.exe。效果如下:

  • 远程登录

在另外一台电脑上,打开远程桌面连接(找不到可以在小娜中搜索),填写服务器的Ip地址,账号,点击连接后输入密码,效果如下。打开一些应用后,断开连接,过一段时间再次登录时发现界面保持不变。

OpenWRT 19.06.7 最新官方固件添加CPU频率,温度,接口速率,磁盘使用信息

跳转到指定楼层

1#

 发表于 2021-1-24 21:45 | 只看该作者 |只看大图 回帖奖励
本帖最后由 a798047000 于 2021-2-1 13:10 编辑

修改 /usr/libexec/rpcd/luci 添加如下代码

  1. getCoreInfo = {
  2.         call = function()
  3.             local sys = require “luci.sys”
  4.             local rv = {}
  5.             local freqs = string.split(string.trim(sys.exec(“cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq”)),”\n”)
  6.             local temps = string.split(string.trim(sys.exec(“sensors | grep ‘Core’ | cut -c10-24″)),”\n”)
  7.             local i
  8.             for i = 1, #freqs do
  9.                 local freq = string.trim(freqs[i])
  10.                 local temp = string.trim(temps[i])
  11.                 rv[#rv + 1] = {
  12.                     core = “Core ” .. i,
  13.                     freq = string.format(“%.2f”, freq / 1000) .. ” MHz”,
  14.                     temp = temp
  15.                 }
  16.             end
  17.             return {coreinfo = rv}
  18.         end
  19.     },
  20.     getDiskInfo = {
  21.         call = function()
  22.             local sys = require “luci.sys”
  23.             local rv = {}
  24.             local lines = string.split(string.trim(sys.exec(“/bin/df -h | sed ‘s/\\s\\+/ /g’ | uniq”)),”\n”)
  25.             local i
  26.             for i = 2, #lines do
  27.                 local tokens = string.split(lines[i], ” “)
  28.                 local block = string.trim(tokens[1])
  29.                 — ignore block not start with /
  30.                 if (string.sub(block, 1, 1) == “/”) then
  31.                     rv[#rv + 1] = {
  32.                         block = block,
  33.                         size = string.trim(tokens[2]),
  34.                         used = string.trim(tokens[3]),
  35.                         available = string.trim(tokens[4]),
  36.                         used_percent = string.trim(tokens[5]),
  37.                         mounte_point = string.trim(tokens[6])
  38.                     }
  39.                 end
  40.             end
  41.             return {diskinfo = rv}
  42.         end
  43.     },
  44.     getETHInfo = {
  45.         call = function()
  46.             local sys = require “luci.sys”
  47.             local rv = {}
  48.             local ethinfo = sys.exec(“/usr/bin/ethinfo”)
  49.             local lines = string.split(string.trim(ethinfo), “\n”)
  50.             local i
  51.             for i = 1, #lines do
  52.                 local line = string.trim(lines[i])
  53.                 if line == “” then
  54.                 else
  55.                     local tokens
  56.                     tokens = string.split(line, ” “)
  57.                     rv[#rv + 1] = {
  58.                         name = tokens[1],
  59.                         status = tokens[2],
  60.                         speed = tokens[3],
  61.                         duplex = tokens[4]
  62.                     }
  63.                 end
  64.             end
  65.             return {ethinfo = rv}
  66.         end
  67.     }

复制代码


安装 lm-sensors 执行命令

  1. opkg update
  2. opkg install lm-sensors

复制代码

添加文件 /usr/bin/ethinfo 写入

  1. #!/bin/sh
  2. a=$(ip address | grep ^[0-9] | awk -F: ‘{print $2}’ | sed “s/ //g” | grep ‘^[e]’ | grep -v “@” | grep -v “\.”)
  3. b=$(echo “$a” | wc -l)
  4. for i in $(seq 1 $b)
  5. do
  6.         c=$(echo “$a” | sed -n ${i}p)
  7.         d=$(ethtool $c)
  8.         e=$(echo “$d” | grep “Link detected” | awk -F: ‘{printf $2}’ | sed ‘s/^[ \t]*//g’)
  9.         f=$(echo “$d” | grep “Speed” | awk -F: ‘{printf $2}’ | sed ‘s/^[ \t]*//g’ | tr -d “Unknown!”)
  10.         [ -z “$f” ] && f=”-“
  11.         g=$(echo “$d” | grep “Duplex” | awk -F: ‘{printf $2}’ | sed ‘s/^[ \t]*//g’)
  12.         [ “$g” != “Full” -a “$g” != “Half” ] && g=”-“
  13.         echo “$c $e $f $g”
  14. done

复制代码

并给执行权限,执行

  1. chmod 755 /usr/bin/ethinfo

复制代码

修改 /usr/share/rpcd/acl.d/luci-base.json 找到

  1. “luci”: [ “getConntrackList”, “getInitList”, “getLocaltime”, “getProcessList”, “getRealtimeStats”, “getTimezones”, “getLEDs”, “getUSBDevices”, “getSwconfigFeatures”, “getSwconfigPortState”, “getBlockDevices”, “getMountPoints” ],

复制代码

添加 “getCoreInfo”, “getETHInfo”, “getDiskInfo” 改完后是这样的

  1. “luci”: [ “getConntrackList”, “getInitList”, “getLocaltime”, “getProcessList”, “getRealtimeStats”, “getTimezones”, “getLEDs”, “getUSBDevices”, “getSwconfigFeatures”, “getSwconfigPortState”, “getBlockDevices”, “getMountPoints”, “getCoreInfo”, “getETHInfo”, “getDiskInfo” ],

复制代码

然后将压缩包内的3个文件放入 /www/luci-static/resources/view/status/include/

游客,如果您要查看本帖隐藏内容请回复

最后别忘了重启 rpcd 和 uhttpd (或nginx,如果你用nginx替代了uhttpd的话) 服务

  1. service rpcd restart
  2. service uhttpd restart

复制代码

最终效果如图

QQ20210124-214454@2x.png (251.6 KB, 下载次数: 0)

下载附件  保存到相册

2021-1-24 21:45 上传


以上方案是直接修改系统文件实现的,没有改源码重新编译,如果想要在源码内修改,可以找到源码下相应的路径和文件,修改即可

由于我这里是直接修改系统文件的,因此没有国际化(翻译),中文文本是直接以unicode编码写到js文件里的

如果需要加入源码编译,建议将对应文本改为英文,然后在po文件内添加相应的翻译文本即可
此帖部分代码来自于 https://www.right.com.cn/forum/thread-1358471-1-1.html  感谢!

多说一句,如果更新了luci-base包,可能会导致修改失效,这主要是因为更新的包覆盖了修改后的文件,这时一般只需要重新在rpc中添加lua方法,然后再json中注册,重启rpcd,就能重新work。如果不行,那就对照教程完整的再来一次吧。

PVE安装后要处理的几个问题(三)添加硬盘

Proxmox(PVE)安装时候只有一块硬盘,我使用了ssd作为系统盘,并安装各种系统在ssd上面,但是想把数据存放在普通的机械硬盘上,这样我们就需要添加另一块硬盘了!

本文以PVE 5.3-8为例,首选你装好硬盘启动后查看下硬盘的名称

image.png

如上图所示,我用来当数据盘的设备名称为 sdc

也可以到终端内使用命令查看

ls /dev/sd*

如果你是IDE硬盘,应该没有了吧,使用以下命令查看

ls /dev/hd*

image.png

上图是查询结果,如果/dev/sdb这种样子,后面没有sdb1等数字,说明硬盘还没有分区(我上面显示/dev/sdb1  /dev/sdb2  /dev/sdb3说明已经分好区了)

之后我们要把这个硬盘分区,并格式化为ext4格式

fdisk /dev/sdc

进入fdisk界面,按下面方式操作

Select (default p): (直接按下enter)

Partition number (1-4, default 1): (直接按下enter)

First sector (2048-167772159, default 2048): (直接按下enter)

Last sector, +sectors or +size{K,M,G} (2048-167772159, default 167772159): (直接按下enter)

Command (m for help): w

image.png

 

上面的sector会根据你硬盘大小改变,我们分一个区,所以直接默认回车就可以

分区之后就会多出一个 /dev/sdb1,之后我们格式化为ext4格式

mkfs -t ext4 /dev/sdc1

格式化需要一些时间,等待一下就可以,不要着急,完成后出现done

image.png

如上图样子就格式化好了!之后我们要挂载到pve上面,先新建一个挂载目录

mkdir -p /mnt/sdc1

然后把硬盘挂载信息写入 /etc/fstab

echo /dev/sdc1 /mnt/sdc1 ext4 defaults 1 2 >> /etc/fstab

因为此时/目录是只读模式,进行修改/etc/fstab时,提示无法保存(只读),这时需要将/目录重新挂载为可读写模式 ,用命令

mount -o remount,rw,auto /

然后再对/etc/fstab进行修改就可以了。重启后系统正常启动。

之后重启PVE即可

开机添加目录

image.png

image.png

添加完毕,就可以在节点里看到你刚刚添加的目录了

image.png

 

Openwrt获取当前连接设备信息列表

查看连接上openwrt的设备IP信息,mac地址,方式有两种:

方式1:

Bash
cat /proc/net/arp

结果:

Bash
IP address       HW type     Flags       HW address            Mask     Device
192.168.0.1      0x1         0x2         **:95:**:5c:**:79     *        eth0.2
192.168.1.242    0x1         0x2         **:6c:**:77:**:40     *        br-lan
192.168.0.124    0x1         0x0         **:00:**:00:**:00     *        eth0.2
192.168.1.198    0x1         0x2         **:8d:**:5a:**:3c     *        br-lan

Flags标志可以表示是否在线状态,0x0表示离线,标志0x2表示在线

Device表示接口的名称

方式2:

Bash
cat /tmp/dhcp.leases

结果

Bash
1505227895   **:6c:**:77:**:40   192.168.1.242   android-5734b930181b5156   *
1505225907   **:8d:**:5a:**:3c   192.168.1.198   DESKTOP-AFGM9OL   01:40:8d:5c:5a:a0:3c

可以看到mac地址,IP,设备名等信息

还有个查看wifi连接设备的命令

Bash
#ra0 是设备的名称,根据实际情况也可能是wlan0或者其他名称
iwinfo ra0 assoclist

得到结果

Bash
**:**:**:C6:76:26  -44 dBm / -57 dBm (SNR 13)  37000 ms ago
    RX: 65.0 MBit/s, MCS 7, 20MHz                      0 Pkts.
    TX: 65.0 MBit/s, MCS 7, 20MHz                      0 Pkts.

**:**:**:FF:91:98  -44 dBm / -57 dBm (SNR 13)  6000 ms ago
    RX: 65.0 MBit/s, MCS 7, 20MHz                      0 Pkts.
    TX: 65.0 MBit/s, MCS 7, 20MHz                      0 Pkts.

LEDE / OPENWRT 自动清理内存

一、LINUX常用

1.清理前内存使用情况

free -m
  • 1

2.开始清理

echo 1 > /proc/sys/vm/drop_caches
  • 1

3.清理后内存使用情况

free -m
  • 1

4.完成!

二、OPENWRT
使用脚本自动配置openwrt时,ssh终端收到错误提示;****out of memory。各种无响应,郁闷之下发扬搬运精神,于是有了下面的脚本

#!/bin/sh

used=`free -m | awk ‘NR==2’ | awk ‘{print $3}’`

free=`free -m | awk ‘NR==2’ | awk ‘{print $4}’`

echo “===========================” >> /var/log/mem.log

date >> /var/log/mem.log

echo “Memory usage | [Use:${used}KB][Free:${free}KB]” >> /var/log/mem.log

if [ $free -le 153600 ] ; then

sync && echo 1 > /proc/sys/vm/drop_caches

sync && echo 2 > /proc/sys/vm/drop_caches

sync && echo 3 > /proc/sys/vm/drop_caches

echo “OK” >> /var/log/mem.log

else

echo “Not required” >> /var/log/mem.log

fi

Vmware 平台虚拟机导入到PVE平台上

 

PVE(Proxmox VE)是新的开源虚拟化平台,具有较多优点,如群集功能、容器等,但是实际操作中也有不少bug或不如意的地方。

现有一台vmware虚拟化平台的windows 2012R2 虚拟机,为了不重新安装操作系统和应用,因此希望通过直接转化的方法导入到PVE主机内。

检查pve资料,pve说可以通过两种方式导入,一种是通用ovf格式,另一种是直接加载vmdk磁盘。后来确认两种方式结果是几乎一样的。

我总结的导入过程如下:

1、将vmware下的windows2012R2虚拟机导出为OVF (略),但是要注意,不能导出成单个的ova文件,因为PVE中不认识达成包的OVA文件。但是导出ovf会生产三个文件,都需要拷贝出来。

2、将生成的三个ovf文件导入到pve的local存储上。正常可以使用local存储上“上传”的方法,选择*.*文件格式。也可以使用ssh工具,通过SFTP协议将文件上传只PVE 的ISO目录,该目录位于PVE机器的/var/lib/vz/template/iso   。

(注意:ssh secure shell client 3.2.9版本不行哦,我是用secure CRT 中SFTP上传的)

 

3、上传后就用PVE介绍的方式来导入虚拟机,说一种简单一点的方法,执行以下命令:

qm importovf 999  WindowsServer2012.ovf  local-lvm

其中999是导入虚拟机的ID,WindowsServer2012.ovf是虚拟机导入文件,local-lvm是放置虚拟机的磁盘卷。导入成功后,最后有100%的提示。

 

4、启动虚拟机,发现能看到windows 2012窗口,提示修复,反复重启,无法进入最后的操作系统界面,按照提示操作也几乎无法进行下去。

检查PVE文档,官网这样说:“除了格式问题之外,如果模拟的硬件从一个虚拟机监控程序到另一个虚拟机监控程序的变化太大,则从其他虚拟机监控程序导入磁盘映像可能会失败。Windows VM对此特别关注,因为OS对硬件的任何更改都很挑剔。可以通过在导出之前安装Internet上可用的MergeIDE.zip实用程序来解决此问题,并在引导导入的Windows VM之前选择IDE的硬盘类型。”

5、文档提示用IDE硬盘,就把硬盘类型从scsi改成IDE。

把原有硬盘从scsi上卸除。把硬盘挂载到ide0的总线上了,命令如下:

qm set 999 –ide0 local-lvm:vm-999-disk-0

 

6、可以挂PE,可对认到的IDE硬盘进行CHKDSK 的磁盘扫描,去除坏块等。方法如下:

chkdsk  /f:   e:   , 修正了一些小故障,重启还是不行,继续找问题。

 

7、突然想到应该要进安全模式,去除不合理的驱动,这样系统应该就能起来了。但是win2012启动时候缺省不响应F8,无法进入安全模式。

8、等待启动进入到了高级模式,找到命令行,在命令式模式下键入:bcdedit /set {default} bootmenupolicy legacy    这条命令是允许在win2012菜单出来之前可以按F8进入安全模式。

 

9、重启,在菜单出来之前按键F8进入安全模式。

10、可以进入到windows的安全模式,问题初步解决。找到“计算机管理”中的“设备管理器”,把里面没有用的驱动全部删除掉,特别是有vmware和HyperV字样的驱动,直至没有黄色的感叹号出现。

11、退出安全模式,再重新启动,终于出现了久违的Windows 2012 R2的画面。
————————————————
linux 迁移

VMware完美迁移PVE方法(两条命令解决)

未来村长 2021-05-05 15:07:40 20 收藏
分类专栏: 虚拟化 文章标签: 虚拟机 vmware pve
版权
一、为什么要迁移
因为VMware是收费的,PVE是免费的,就是这么简单粗暴,没有太多理由。
Proxmox优势:
Proxmox的主要特性,去中心化、超融合、高可用、开源低成本、易于实施管理,前面几个特性都和open stack一样,但是最后一点易于实施管理,open stack却做得不是特别好,对于易于实施管理这一点,主要有以下几个方面(引述):
1、proxmox以iso文件提供下载,刻录到u盘,安装方便高效。
2、创建集群,只需登陆每个系统执行一条指令,马上就能看到效果。
3、支持分布式存储,创建ceph存储池,也是寥寥几步就可完成,并很快可以在管理界面看到效果。
4、轻松实现高可用,web界面组成对象高可用(ha),也是易如反掌。
5、方便扩容,重复执行相同创建扩容命令即可完成。
6、统一界面。一个web入口,管理节点、存储、网络、虚拟机等所有资源,完成绝大部分用户操纵,无需要安装客户端。

1.迁移方法
(1)首先,把镜像从VMware虚拟机导出OVF格式
我用的是浏览器,客户端方法一样

(2)镜像已经导出成功,然后把导出来的镜像上传到PVE的镜像存储里面,上传的话,可以用FTP等,我用的是finalshell直接拉进去,保存路径是/var/lib/vz/template/iso/,后面根据自己实际保存路径来分。

 

(3)然后打开PVE,新建一个空白虚拟机,配置根据实际需要来配就行。

 

 

 

 

 

(4)然后用命令登录到PVE的节点node,用命令把镜像导入到刚才新建的虚拟机121里面,知道100%完成。
qm importdisk 121 /var/lib/vz/template/iso/test.vmdk local-zfs
qm set 121 –ide0 local-zfs:vm-121-disk-0
1
2
这里类型根据你虚拟机硬盘类型来选ide0还是scsi0,我就在这里翻车了,排查了很久才找到原因,所以,这里要注意。

 

(5)然后修改下刚才新建虚拟机的引导,放到第一个,不然的话,开机会找不到引导,一直重启。

 

(6)然后再开机,刚才导入进来的镜像已经可以开机运行了。

————————————————

SEO-您是否禁止了mj12bot蜘蛛的访问

MJ12bot这个蜘蛛是大家都怎么处理的?是否对SEO有帮助,他一直频繁的访问网站,是否应该屏蔽掉他呢,我的选择是好不犹豫的直接干掉他;

  • MJ12bot遵循robots.txt标准,惹需屏蔽他,直接在 robots.txt 添加以下代码;

过去几个月总是在过一段时间后收到服务器资源负载过高的警告,基本上每次上机检查日志都会发现某个网站被奇怪的恶意爬虫给完整检查了一遍。而且不知道为什么 MJ12bot 总是会检查一些无限重定向的链接,导致服务器资源被无意义地消耗。


几个资源消耗比较高的爬虫包括:

  • dotbot
  • SemrushBot
  • MJ12bot
    • 我特别建议屏蔽 MJ12bot,因为一些版权方会使用这家的爬虫来批量检查网站中是否包含侵犯版权的文件
  • SMTBot

对于这些爬虫建议直接在 robots.txt 中屏蔽掉它们,目前复查日志发现至少它们确实是遵守 robots.txt 规则的

  • User-agent: dotbot
  • Disallow: /
  • User-agent: SemrushBot
  • Disallow: /
  • User-agent: MJ12bot
  • Disallow: /
  • User-agent: SMTBot
  • Disallow: /
  • User-agent: PetalBot
  • Disallow: /
  • User-agent: AhrefsBot
  • Disallow: /
  • User-agent: CheckMarkNetwork
  • Disallow: /
  • User-agent: DigiCert DCV Bot
  • Disallow: /

OpenWRT分配挂载剩余磁盘空间

软路由用的是60G的固态硬盘,而openwrt占用的空间很少,将剩下的空间划分出来,做可道云空间,存储办公文档,还是不错的。
首先,ssh连接,然后输入 fdisk /dev/sda

image

继续输入w,保存分区表
image

开始格式化分区,输入mkfs.ext4 /dev/sda3
image

挂载分区
登录路由器:系统 > 挂载点> 添加
启用此挂载点:勾选
UUID:选择要挂载的分区
挂载点:选择(自定义),输入 /mnt/sda3回车。
image

Ubuntu安装Nginx和正确卸载Nginx Nginx相关

1.Ubuntu下安装Nginx比较简单

敲入下列命令即可:

    sudo apt-get update
    sudo apt-get install nginx

 

 

2.Ubuntu下卸载,稍不注意就会入坑

 

复制代码
    sudo apt-get remove nginx nginx-common # 卸载删除除了配置文件以外的所有文件。

    sudo apt-get purge nginx nginx-common # 卸载所有东东,包括删除配置文件。

    sudo apt-get autoremove # 在上面命令结束后执行,主要是卸载删除Nginx的不再被使用的依赖包。

    sudo apt-get remove nginx-full nginx-common #卸载删除两个主要的包。

  sudo service nginx restart  #重启nginx
复制代码

 

上面的命令基本上都能解决你在Ubuntu下安装卸载Nginx的问题。

 

 

3.查看nginx进程

复制代码
ps aux|grep nginx

在虚拟环境下安装uwsgi
pip install uwsgi

######启动Nginx服务
[root@typecodes ~]# service nginx start
######停止Nginx服务
[root@typecodes ~]# service nginx stop
######重启Nginx服务
[root@typecodes ~]# service nginx restart
######Nginx服务的状态
[root@typecodes ~]# service nginx status
######在Nginx服务启动的状态下,重新加载nginx.conf这个配置文件
[root@typecodes ~]# service nginx reload



复制代码

 

 

 

 

 

 

Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式。

在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求。nginx把所有静态请求自己来处理(这是NGINX的强项)。然后,NGINX将所有非静态请求通过uwsgi传递给Django,由Django来进行处理,从而完成一次WEB请求。

可见,uwsgi的作用就类似一个桥接器。起到桥梁的作用。

Linux的强项是用来做服务器,所以,下面的整个部署过程我们选择在Ubuntu下完成。

 

一、安装Nginx                                                                        

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。

Nginx同样为当前非常流行的web服务器。利用其部署Django,我们在此也做简单的介绍。

Nginx官网:http://nginx.org/

打开ubuntu控制台(ctrl+alt+t)利用Ubuntu的仓库安装。

fnngj@ubuntu:~$ sudo apt-get install nginx  #安装

启动Nginx:

fnngj@ubuntu:~$ /etc/init.d/nginx start  #启动
fnngj@ubuntu:~$ /etc/init.d/nginx stop  #关闭
fnngj@ubuntu:~$ /etc/init.d/nginx restart  #重启

 

修改Nginx默认端口号,打开/etc/nginx/nginx.conf 文件,修改端口号。

复制代码
复制代码
 server {
    listen       8088;    # 修改端口号
    server_name  localhost;

    #charset koi8-r; 

    #access_log  logs/host.access.log  main;

    location / {
        root   html;
        index  index.html index.htm;
    }
复制代码
复制代码

大概在文件36行的位置,将默认的80端口号改成其它端口号,如 8088。因为默认的80端口号很容易被其它应用程序占用。

然后,通过上面命令重启nginx。访问:http://127.0.0.1:8088/

如果出现如上图,说明Nginx启动成功。

 

二、安装uwsgi

通过pip安装uwsgi。

root@ubuntu:/etc# python3 -m pip install uwsgi

 

测试uwsgi,创建test.py文件:

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"]

 

通过uwsgi运行该文件。

fnngj@ubuntu:~/pydj$ uwsgi --http :8001 --wsgi-file test.py

 

接下来配置Django与uwsgi连接。此处,假定的我的django项目位置为:/home/fnngj/pydj/myweb

fnngj@ubuntu:~/pydj$ uwsgi --http :8001 --chdir /home/fnngj/pydj/myweb/ --wsgi-file myweb/wsgi.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191

 

常用选项:

http : 协议类型和端口号

processes : 开启的进程数量

workers : 开启的进程数量,等同于processes(官网的说法是spawn the specified number ofworkers / processes)

chdir : 指定运行目录(chdir to specified directory before apps loading)

wsgi-file : 载入wsgi-file(load .wsgi file)

stats : 在指定的地址上,开启状态服务(enable the stats server on the specified address)

threads : 运行线程。由于GIL的存在,我觉得这个真心没啥用。(run each worker in prethreaded mode with the specified number of threads)

master : 允许主进程存在(enable master process)

daemonize : 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器(daemonize uWSGI)。实际上最常用的,还是把运行记录输出到一个本地文件上。

pidfile : 指定pid文件的位置,记录主进程的pid号。

vacuum : 当服务器退出的时候自动清理环境,删除unix socket文件和pid文件(try to remove all of the generated file/sockets)

 

三、Nginx+uwsgi+Django                                         

接下来,我们要将三者结合起来。首先罗列一下项目的所需要的文件:

myweb/

├── manage.py

├── myweb/

│   ├── __init__.py

│   ├── settings.py

│   ├── urls.py

│   └── wsgi.py

└── myweb_uwsgi.ini

在我们通过Django创建myweb项目时,在子目录myweb下已经帮我们生成的 wsgi.py文件。所以,我们只需要再创建myweb_uwsgi.ini配置文件即可,当然,uwsgi支持多种类型的配置文件,如xml,ini等。此处,使用ini类型的配置。

复制代码
复制代码
# myweb_uwsgi.ini file
[uwsgi]

# Django-related settings

socket = :8000

# the base directory (full path)
chdir           = /home/fnngj/pydj/myweb

# Django s wsgi file
module          = myweb.wsgi

# process-related settings
# master
master          = true

# maximum number of worker processes
processes       = 4

# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true
复制代码
复制代码

这个配置,其实就相当于在上一小节中通过wsgi命令,后面跟一堆参数的方式,给文件化了。

socket  指定项目执行的端口号。

chdir   指定项目的目录。

module  myweb.wsgi ,可以这么来理解,对于myweb_uwsgi.ini文件来说,与它的平级的有一个myweb目录,这个目录下有一个wsgi.py文件。

其它几个参数,可以参考上一小节中参数的介绍。

 

接下来,切换到myweb项目目录下,通过uwsgi命令读取myweb_uwsgi.ini文件启动项目。

复制代码
复制代码
fnngj@ubuntu:~$ cd /home/fnngj/pydj/myweb/
fnngj@ubuntu:~/pydj/myweb$ uwsgi --ini myweb_uwsgi.ini 
[uWSGI] getting INI configuration from myweb_uwsgi.ini
*** Starting uWSGI 2.0.12 (32bit) on [Sat Mar 12 13:05:06 2016] ***
compiled with version: 4.8.4 on 26 January 2016 06:14:41
os: Linux-3.19.0-25-generic #26~14.04.1-Ubuntu SMP Fri Jul 24 21:18:00 UTC 2015
nodename: ubuntu
machine: i686
clock source: unix
detected number of CPU cores: 2
current working directory: /home/fnngj/pydj/myweb
detected binary path: /usr/local/bin/uwsgi
!!! no internal routing support, rebuild with pcre support !!!
chdir() to /home/fnngj/pydj/myweb
your processes number limit is 15962
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uwsgi socket 0 bound to TCP address :8000 fd 3
Python version: 3.4.3 (default, Oct 14 2015, 20:37:06)  [GCC 4.8.4]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x8b52dc0
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 319920 bytes (312 KB) for 4 cores
*** Operational MODE: preforking ***
WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0x8b52dc0 pid: 7158 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 7158)
spawned uWSGI worker 1 (pid: 7160, cores: 1)
spawned uWSGI worker 2 (pid: 7161, cores: 1)
spawned uWSGI worker 3 (pid: 7162, cores: 1)
spawned uWSGI worker 4 (pid: 7163, cores: 1)
复制代码
复制代码

注意查看uwsgi的启动信息,如果有错,就要检查配置文件的参数是否设置有误。

 

再接下来要做的就是修改nginx.conf配置文件。打开/etc/nginx/nginx.conf文件,添加如下内容。

复制代码
复制代码
……
server {
    listen         8099; 
    server_name    127.0.0.1 
    charset UTF-8;
    access_log      /var/log/nginx/myweb_access.log;
    error_log       /var/log/nginx/myweb_error.log;

    client_max_body_size 75M;

    location / { 
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:8000;
        uwsgi_read_timeout 2;
    }   
    location /static {
        expires 30d;
        autoindex on; 
        add_header Cache-Control private;
        alias /home/fnngj/pydj/myweb/static/;
     }
 }
……
复制代码
复制代码

listen 指定的是nginx代理uwsgi对外的端口号。

server_name  网上大多资料都是设置的一个网址(例,www.example.com),我这里如果设置成网址无法访问,所以,指定的到了本机默认ip。

在进行配置的时候,我有个问题一直想不通。nginx到底是如何uwsgi产生关联。现在看来大概最主要的就是这两行配置。

include uwsgi_params;

uwsgi_pass 127.0.0.1:8000;

include 必须指定为uwsgi_params;而uwsgi_pass指的本机IP的端口与myweb_uwsgi.ini配置文件中的必须一直。

 

现在重新启动nginx,翻看上面重启动nginx的命令。然后,访问:http://127.0.0.1:8099/

通过这个IP和端口号的指向,请求应该是先到nginx的。如果你在页面上执行一些请求,就会看到,这些请求最终会转到uwsgi来处理。

 

=============

ps: 这个过程本应不算复杂,之前花两天时间没搞定,索性放到了一边,这次又花了两天时间才算搞定。网上搜到的文章比较乱,有些太简单的看不懂,有些又太啰嗦的不知道核心的几步是什么,希望本文能帮到你。

 

Linux中apt与apt-get命令的区别与解释apt方式卸载软件

apt方式卸载删除命令

apt-get –purge remove
删除已安装包(不保留配置文件)。
如软件包a,依赖软件包b,则执行该命令会删除a,而且不保留配置文件

apt-get autoremove
删除为了满足依赖而安装的,但现在不再需要的软件包(包括已安装包)。
如软件包a,依赖软件包b,则执行该命令会同时删除软件包a,b

apt-get remove
删除已安装的软件包(保留配置文件)。
如软件包a,依赖软件包b,则执行该命令会删除a,且保留配置文件

apt-get autoclean
APT的底层包是dpkg, 而dpkg 安装Package时, 会将 *.deb 放在 /var/cache/apt/archives/中.
apt-get autoclean 只会删除 /var/cache/apt/archives/ 已经过期的deb.

apt-get clean
使用 apt-get clean 会将 /var/cache/apt/archives/ 的 所有 deb 删掉.
类似于 rm /var/cache/apt/archives/*.deb