linux命令搭建服务 linux服务器搭建与管理案例教程

如何实现在Linux下创建服务程序Linux系统能提供强大可靠的网络服务,并有管理程序对服务进行管理 。例如我们熟悉的Web、FTP和电子邮件等,它们既可以单独运行,也可以被守护进程inetd调用,而且运行得都非常好 。但我们不能仅停留在赞叹中 , 下面就给出两个服务程序程序和一个客户程序的例子 , 介绍服务程序和客户程序之间是如何沟通的 。另外还要编辑配置一些文件,让服务程序也能接受服务管理程序管理 。
这两个服务程序功能相同,但一个是独立服务程序,另一个是被inetd调用的服务程序 。这是TCP/IP网络服务的两大类,这里将两个程序放在一起是为了比较程序结构和运行方式 。两服务程序都在Red Hat Linux 7.1和TurboLinux 7.0上调试通过 。
独立服务器
TCP和UDP是两大TCP/IP数据传输方式,套接口是建立服务器客户机连接的机制,首先介绍它们建立通信联系的过程,然后给出一个TCP服务程序例子 。
1.TCP套接口通信方式
对于TCP服务器端,服务程序首先调用建立套接口的函数socket(),然后调用绑定服务IP地址和协议端口号函数bind() 。绑定成功后调用被动监听函数listen()等待客户连接 , 还要调用获取连接请求函数accept(),并一直阻塞到客户连接请求的到达 , 这个函数获取客户机IP地址和协议端口号 。
对于TCP客户端,客户程序启动后后调用建立套接口函数socket(),然后调用连接函数connect(),此函数与服务器通过三次握手建立连接 。
服务器和客户机建立连接后 , 就可以使用读函数read()和写函数write()收发数据了 。数据交换完成后便各自调用关闭套接口函数close()删除套接口 。TCP套接口通信方式见图1所示 。
图1 TCP套接口通信方式
2.UDP套接口通信方式
UDP程序与TCP的区别是无需建立连接 。服务器首先启动,然后等待用户请求 。客户机启动后便直接向服务器请求服务,服务器接到请求后给出应答 。
对于UDP服务器端 , 服务程序首先调用套接口函数socket(),然后调用绑定IP地址和协议端口号函数bind() 。之后调用函数recvfrom()接收客户数据,调用sendto()向客户发送数据 。
对于UDP客户端,客户机程序启动后调用套接口函数socket() , 然后调用sendto()向服务器发送数据 , 调用recvfrom()接收服务器数据 。
双方数据交换成功后,各自调用关闭套接口函数close()关闭套接口 。UDP套接口通信方式见图2所示 。
图2 UDP套接口通信方式
下面给出独立服务程序的例子 。这个程序虽然简单,但是与复杂程序有着相同的结构 。
//程序名:server.c
//功能:服务器从客户机读入一个字符,并将排在此字符后面的字符回送客户机
//服务器端口:9000
#include "sys/types.h"
#include "sys/socket.h"
#include "stdio.h"
#include "netinet/in.h"
#include "arpa/inet.h"
#include "unistd.h"
int main()
{
int pid; //用于存放fork()执行结果
int server_sockfd,client_sockfd; //用于服务器和客户机套接口描述符
int bind_flag,listen_flag; //用于存放bind()和listen()执行结果
int server_address_length,client_address_length; //作为服务器客户机地址长变量
struct sockaddr_in server_address; //作为服务器地址结构变量(含地址和端口)
struct sockaddr_in client_address; //作为客户机地址结构变量(含地址和端口)
if((pid=fork())!=0) //用fork()产生新进程
exit(0) ;
setsid() ; //以子进程开始下面的程序
函数socket() , 创建一个套接口 , 成功则返回套接口描述符 。
server_sockfd=socket(AF_INET,SOCK_STREAM,0);
if(server_sockfd0)
{
printf(“socket error /n”);
exit(1);
}
server_address.sin_family=AF_INET;
函数htonl()用于将32位主机字节顺序转换为网络字节顺序,其中参数INADDR_ANY表示任何IP地址 。
server_address.sin_addr.s_addr=htonl(INADDR_ANY);
函数htons()用于将16位主机字节顺序转换为网络字节顺序,其中的参数是绑定的端口号 , 读者可根据环境自行改动 , 目的是不与其它服务端口冲突 。
server_address.sin_port=htons(9000);
server_address_length=sizeof(server_address);
函数bind()用于绑定本地地址和服务端口号,若调用成功返回值为0 。
bind_flag=bind(server_sockfd,/
(struct sockaddr *)server_address,/
server_address_length);
if(bind_flag0)
{
printf(“bind error /n”);
exit(1);
}
函数listen() , 指明服务器的队列长度,被动等待客户连接,调用成功返回值为0 。
listen_flag=listen(server_sockfd,5);
if(listen_flag0)
{
printf(“listen error /n”);
exit(1);
}
while(1)
{
char ch;
函数accept()等待和获取用户请求,为每个新连接请求创建一个新的套接口,调用成功返回新套接口描述符 。
client_sockfd=accept(server_sockfd,/
(struct sockaddr *)client_address,/
client_address_length);
函数read()和write()用于在服务器和客户机之间传送数据 , 调用成功返回读和写的字节数 。
函数close() , 用于程序使用完一个套接口后关闭套接口,调用成功返回值0 。其中的参数为accept()创建的套接口的描述符client_sockfd 。
read(client_sockfd,ch,1);
printf(“cli_ch=%c”,ch);
ch;
write(client_sockfd,ch,1);
close(client_sockfd);
}
}
程序完成后就可以使用命令进行编译 。在命令行中输入“gcc -o server server.c”,将server.c编译成可执行程序server,这时便可用客户程序进行测试 。在命令行执行“./server”启动服务程序,执行“netstat -na”查看有无server的服务端口 。如果存在,则执行下面编写的客户程序“./client” 。不过这仅是手工启动的方法 , 下面给出用服务管理程序管理server程序的方法 。只要在目录/etc/rc.d/init.d下放入服务程序的脚本就能被服务程序读到 。在命令行执行“touch server”创建文件server,并将文件属性改成可执行 。在管理程序中并不能看到此服务名 , 脚本文件必须有一些结构才能被管理程序认为是服务程序脚本 。
为了减少工作量 , 拷贝/etc/rc.d/init.d下脚本httpd,将拷贝脚本名命名为server,然后对其编辑 。
(1)执行“cp httpd server” 。
(2)用文本编辑器vi(其它编辑器亦可)将server打开进入编辑状态 。首先用字符串server替换httpd 。然后找到daemon server行,如果编写的程序放在变量PATH目录中,不需要修改此行;如果把服务程序放在其它目录中,就要写服务的全路径 。例如程序在/root的目录中,就要写成daemon /root/server,还要删除“rm -f /var/run/server.pid”这一行 。
(3)执行“chmod 755 server”,将server属性设定为可执行 。
此时就可以用chkconfig、ntsysv等工具 , 在希望的运行级中增加这个新服务程序,然后测试客户机与服务器能否通信 。
被xinetd调用的服务程序
在Linux系统中,有很多服务是被xinetd(较早版本使用的是inetd)超级守护服务器启动的 。其实凡是基于TCP和UDP的服务都可使用超级守护进程启动,只是在服务量很大影响效率的情况下不被采用 。
1.依赖xinetd启动的服务建立通信过程
为了与独立服务器程序比较,我们看一下依赖xinetd的服务器是如何启动的 。
(1)xinetd启动时读取/etc/xinetd目录中的文件(早期版本为/etc/inetd文件),根据其中的内容给所有允许启动的服务创建一个指定类型的套接口,并将套接口放入select()中的描述符集合中 。
(2)对每个套接口绑定bind(),所用的端口号和其它参数来自/etc/xinetd目录下每个服务的配置文件 。
(3)如果是TCP套接口就调用函数listen(),等待用户连接 。如果是UDP套接口,就不需调用此函数 。
(4)所有套接口建立后,调用函数select()检查哪些套接口是活动的 。
(5)若select()返回TCP套接口,就调用accept()接收这个连接 。如果为UDP,就不需调用此函数 。
(6)xinetd调用fork()创建子进程,由子进程处理连接请求 。
◆ 子进程关闭所有其它描述符,只剩下套接口描述符 。这个套接口描述符对于TCP是accept()返回的套接口,对于UDP为最初建立的套接口 。然后子进程连续三次dup()函数,将套接口描述符复制到0、1和2,它们分别对应标准输入、标准输出和标准错误输出,并关闭套接口描述符 。
◆ 子进程查看/etc/xinetd下文件中的用户,如果不是root用户,就用调用命令setuid和setgid将用户ID和组ID改成文件中指定的用户 。
(7)对于TCP套接口 , 与用户交流结束后父进程需要关闭已连接套接口 。父进程重新处于select()状态,等待下一个可读的套接口 。
最后调用配置文件中指定的外部服务程序,外部程序启动后就可与用户进行信息传递了 。
2.为xinetd编写专门的服务程序
除了独立服务程序能被xinetd启动外 , 还可以为xinetd编写专门的程序 。此处的例子程序与上面server.c功能相同 。不过两者的程序区别是很大的,此例的代码仅相当于上面传输数据的部分 。我们还将程序名定为server.c,所以不能放在相同目录中,同名仅是为了和上面程序对照 。
#include "unistd.h"
int main()
{
char ch;
read(0,ch,1);
ch;
write(1,ch,1);
}
将程序编译成可执行文件 , 并做些设置就可被xinetd启动 。注意不要和上面的独立服务程序server一起启动 , 因为客户程序写得比较简单,访问的是固定端口,服务器都设成了相同的端口号 。
(1)编辑/etc/services文件,在行末增加一条记录:
server 9000/tcp
(2)在目录/etc/xinetd.d下编写文件server,内容为:
service server
{
disable = no
socket_type = stream
protocol = tcp
wait = no
user = root
server = /home/test/server (此处设置成自己程序所在的目录)
}
如果使用的是较早版本 , 则需在/etc/inetd.conf文件中添加下面的行:
server tcp nowait root /path/to/yourdirectory/server
(3)执行/etc/rc.d/initd.d/xinetd restart重新启动xinetd服务器 。早期版本执行/etc/rc.d/initd.d/inetd restart重新启动inetd 。
(4)执行netstat -an查看有没有server程序使用的端口号 , 如果有就可使用下面客户机程序进行测试了 。
客户机程序
下面就客户机函数做一简单介绍 。
//程序名client.c
/*功能:从客户的控制台输入一个字符,然后将这个字符送到服务器,并将服务器返回的字符显示出来*/
#include "sys/types.h"
#include "sys/socket.h"
#include "stdio.h"
#include "netinet/in.h"
#include "arpa/inet.h"
#include "unistd.h"
int main()
{
int sockfd;//
int address_len;
int connect_flag;
struct sockaddr_in address;
int connect_result;
char client_ch,server_ch;
函数socket()用于建立一个套接口 , 创建成功返回套接口描述符 。
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd0)
{
printf(“sockfd error /n”);
}
address.sin_family=AF_INET;
address.sin_addr.s_addr=inet_addr(“192.168.0.1”);/*读者根据自己环境改成服务器地址*/
address.sin_port=htons(9000);
address_len=sizeof(address);
函数connect()用于与服务器建立一个主动连接,调用成功返回值为0 。
connect_flag=connect(sockfd,(struct sockaddr *)address,address_len);
if(connect_flag==-1)
{
perror(“client”);
exit(1);
}
printf(“Input a character :”);
函数scanf()用于从控制台输入一个字符,并将字符存入client_ch的地址 。函数write()和read()用于传输数据 。函数printf()在客户机屏幕上显示服务器传回的字符 。函数close()关闭套接口 。
scanf(“%c”,client_ch);
write(sockfd,client_ch,1);
read(sockfd,server_ch,1);
printf(“character from server : %c/n”,server_ch);
close(sockfd);
exit(0);
}
执行命令“gcc -o client client.c”,将client.c编译成client 。执行“./client”,在程序提示下输入一个字符,就能看到服务器传回的字符 。
以上介绍的仅是简单的例子 。平时见到的服务程序远比它复杂 , 而且很多是多协议服务程序或是多协议多服务程序 。多协议服务程序就是在main()中分别创建供服务的TCP和UDP套接口 。为每个服务分别写出相应程序好处是便于控制,但是这样每个服务都启动两个服务器,而它们的算法响应是一样的,就要耗费不必要的资源,并且出了问题排错也较困难 。多服务是将不同的服务集成在一起由一个程序完成,可用一个数组表示服务,数组中的每一项表示某协议某服务的一种 , 这样很容易扩展程序的服务功能 。
如何搭建linux服务器;如何搭建linux的服务器?我们一起来了解一下吧 。
1、浏览器搜索Nginx下载Nginx软件包 ,
2、安装Nginx之前需要安装Nginx所需要的依赖包,使用命令如下:
$sudoaptinstalllibpcre3libpcre3-devzlib1g-devopenssllibssl-dev
3、解压Nginx软件包,Nginx的解压使用如下命令:
$tarzxvfnginx-1.17.8.tar.gz
4、配置Nginx,Nginx的配置主要是安装之前配置Nginx的安装路径,启用和禁用Nginx的某些模块 。所以,Nginx的配置是很重要的一个步骤 。具体使用的命令如下:
$cdnginx-1.17.8/
$./configure--prefix=/usr/local/nginx
5、对Nginx进行编译与安装,具体的使用如下的命令:
$cdnginx-1.17.8/
$makemakeinstall
6、启动服务器
$sudo/usr/local/nginx/sbin/nginx
在浏览器中输入http://192.168.221.123
本文章基于ThinkpadE15品牌、centos7系统撰写的 。
搭建Linux系统的VPS的步骤教程Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。有用户想要在Linux上搭建vps这篇文章主要介绍了实例讲解搭建Linux系统的VPS的步骤,包括防火墙和SSH等基本软件的部署方法,非常细致,需要的朋友可以参考下
前期准备
需要购买一台拥有 root 权限的 VPS ,我选择的是 搬瓦工 ,当时购买的是 512 M 内存 5 G SSD,500 G 流量/月 , 9.99 刀每年,但是好像现在这种低价套餐已经结束了 。有意的朋友可以看一下其他的套餐或者别的公司的 VPS 。有的朋友说 DigitalOcean 的速度非常快 , 看YouTube直接 1440p,但是我还没测试过,目前搬瓦工的速度能满足我的需求,而且 DO 的价格比较昂贵 。
服务器购买后,安装 CentOS7 , 因为以下教程都是基于 CentOS7 的,安装新的 OS 后,搬瓦工会告诉你 SSH 的端口和 root 的密码,这些是自己无法自定义的,要记住了如果实在忘了也可以重置 root 密码,或者直接使用搬瓦工提供的在线SSH登录来操作也可,就是反应比较慢,所以我们以后还是常用 ssh 登录来配置 VPS,Mac 下直接使用终端就好,win 下自行寻找一个 ssh 工具就好 。
登录 ssh 的命令:
复制代码代码如下:
$ ssh -p vps 端口号root@vpsIP 地址
登录上以后就相当于在本地操作一样了,你可以使用各种 Linux 命令来操作了 。
配置防火墙
如果 SSH 无法登录,那说明防火墙关闭了 SSH 端口,需要通过在线 SSH 登录进去关闭防火墙重新配置 。
清除防火墙配置
复制代码代码如下:
$ iptables -F
清除 iptabels 所有表项,同时 nat 设置也没了 , 但是我们后续的脚本里会配置的,不用担心 。如果 SSH 登录正常就不用管防火墙 。
安装 firewalld
复制代码代码如下:
$ yum install firewalld firewall-config
$ systemctl start firewalld
P.S. 我在安装完 firewalld 之后然后启动服务的时候一直显示失败,然后重启了一遍服务器就可以正常的启动 firewalld 服务了,有类似情况的朋友可以重启一下服务器 。
修改 SSH 端口
复制代码代码如下:
$ vi /usr/lib/firewalld/services/ssh.xml
会出现以下的内容:
复制代码代码如下:
SSH
Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.
将 port=”22”,修改成搬瓦工提供给你的端口号,然后重载 firewalld 就 OK 。
vi 的命令: 按 “i” 是编辑模式,编辑后按 “esc” 退出编辑模式,然后按 Shift 输入“:” 和 “wq” 保存退出 vi 。
复制代码代码如下:
$ firewall-cmd --permanent --add-service=ssh
$ firewall-cmd --reload
OK,现在准备工作都已就绪,安装了源,安装配置了防火墙,下一步开始搭建服务了 。
搭建 Shadowsocks 服务
这个服务是最简单也是最常用的 。
安装组件
复制代码代码如下:
$ yum install m2crypto python-setuptools
$ easy_install pip
$ pip install shadowsocks
安装时部分组件需要输入 Y 确认 。小内存 VPS 可以分别安装组件 。
安装完成后配置服务器参数
复制代码代码如下:
$ vi /etc/shadowsocks.json
写入如下配置:
复制代码代码如下:
{
"server":"0.0.0.0" ,
"server_port":8388 ,
"local_address": "127.0.0.1",
"local_port":1080,
"password":"mypassword",
"timeout":300,
"method":"aes-256-cfb",
"fast_open": false ,
"workers": 1
}
将上面的 mypassword 替换成你的密码, server_port 也是可以修改的 , 例如 443 是 Shadowsocks 客户端默认的端口号 。
如果需要修改端口,需要在防火墙里打开响应的端口,用 firewalld 操作就比较简单了:
复制代码代码如下:
$ vi /usr/lib/firewalld/services/ss.xml
下面代码粘贴到里面:
复制代码代码如下:
SS
Shadowsocks port
保存退出,然后重启 firewalld 服务:
复制代码代码如下:
$ firewall-cmd --permanent --add-service=ss
$ firewall-cmd --reload
运行命令,启动 Shadowsocks 服务
运行下面的命令:
复制代码代码如下:
$ ssserver -c /etc/shadowsocks.json
至此 shadowsocks 搭建完成,shadowsocks 已经可以使用,如果你没有过高的要求,下面的步骤可以省略,下面是后台运行 Shadowsocks 的步骤 。
安装 supervisor 实现后台运行
运行以下命令下载 supervisor:
复制代码代码如下:
$ yum install python-setuptools
$ easy_install supervisor
然后创建配置文件:
复制代码代码如下:
$ echo_supervisord_conf/etc/supervisord.conf
修改配置文件:
复制代码代码如下:
$ vi /etc/supervisord.conf
在文件末尾添加:
复制代码代码如下:
[program:ssserver]command = ssserver -c /etc/shadowsocks.json
autostart=true
autorestart=true
startsecs=3
设置 supervisord 开机启动,编辑启动文件:
复制代码代码如下:
$ vi /etc/rc.local
在末尾另起一行添加:
复制代码代码如下:
$ supervisord
保存退出(和上文类似) 。另 centOS7 还需要为 rc.local 添加执行权限:
复制代码代码如下:
$ chmodx /etc/rc.local
至此运用 supervisord 控制 Shadowsocks 开机自启和后台运行设置完成 。重启服务器即可 。
搭建 Strongswan 实现在 iOS 上连接 VPN
补充:Linux基本命令
1.ls命令:
格式::ls [选项] [目录或文件]
功能:对于目录,列出该目录下的所有子目录与文件;对于文件,列出文件名以及其他信息 。
常用选项:
-a :列出目录下的所有文件,包括以 . 开头的隐含文件 。
-d :将目录像文件一样显示,而不是显示其他文件 。
-i :输出文件的i节点的索引信息 。
-k :以k字节的形式表示文件的大小 。
-l :列出文件的详细信息 。
-n :用数字的UID,GID代替名称 。
-F : 在每个文件名后面附上一个字符以说明该文件的类型 , “*”表示可执行的普通文 件;“/”表示目录;“@”表示符号链接;“l”表示FIFOS;“=”表示套接字 。
2.cd命令
格式:cd [目录名称]
常用选项:
cd .. 返回上一级目录 。
cd ../.. 将当前目录向上移动两级 。
cd - 返回最近访问目录 。
3.pwd命令
格式: pwd
功能:显示出当前工作目录的绝对路径 。
相关阅读:Linux主要特性
完全兼容POSIX1.0标准
这使得可以在Linux下通过相应的模拟器运行常见的DOS、Windows的程序 。这为用户从Windows转到Linux奠定了基础 。许多用户在考虑使用Linux时,就想到以前在Windows下常见的程序是否能正常运行,这一点就消除了他们的疑虑 。
多用户、多任务
Linux支持多用户,各个用户对于自己的文件设备有自己特殊的权利,保证了各用户之间互不影响 。多任务则是现在电脑最主要的一个特点,Linux可以使多个程序同时并独立地运行 。
良好的界面
Linux同时具有字符界面和图形界面 。在字符界面用户可以通过键盘输入相应的指令来进行操作 。它同时也提供了类似Windows图形界面的X-Window系统,用户可以使用鼠标对其进行操作 。在X-Window环境中就和在Windows中相似,可以说是一个Linux版的Windows 。
支持多种平台
Linux可以运行在多种硬件平台上,如具有x86、680x0、SPARC、Alpha等处理器的平台 。此外Linux还是一种嵌入式操作系统,可以运行在掌上电脑、机顶盒或游戏机上 。2001年1月份发布的Linux 2.4版内核已经能够完全支持Intel 64位芯片架构 。同时Linux也支持多处理器技术 。多个处理器同时工作,使系统性能大大提高 。
搭建Linux系统的VPS的步骤

    推荐阅读