在我的组织中,我们有许多易于使用的基础 AMI,用于不同的服务,例如 ECS 和 Docker。由于我们的许多项目都涉及 CloudFormation,我们正在使用cfn-bootstrap
,它由几个脚本和一个服务组成,这些脚本和服务在启动时运行以安装某些包并为我们执行某些配置管理任务。
在系统启动时,必须执行与以下脚本等效的脚本:
#!/bin/bash
# capture stderr only
output="$(cfn-init -s $STACK_NAME -r $RESOURCE_NAME --region $REGION >/dev/null)"
# if it failed, signal to CloudFormation that it failed and include a reason
returncode=$?
if [[ $returncode == 0]]; then
cfn-signal -e $returncode -r "$output"
exit $returncode
fi
# otherwise, signal success
cfn-signal -s
Run Code Online (Sandbox Code Playgroud)
我想把它作为一个 systemdoneshot
服务来运行After=network.target
,它运行WantedBy=multi-user.target
.
唯一的问题是我希望我的 AMI 是灵活的,并且只有在某个文件存在时才执行它。与其将上述脚本嵌入到 EC2 用户数据中,我还可以让用户数据只定义一个环境文件,该文件定义了我需要的变量,并且如果该环境文件存在,则仅运行我的一次性服务:
#cloud-init
write_files:
- path: /etc/sysconfig/cloudformation
# ...
content: |
CFN_STACK_NAME="stack-name" …
Run Code Online (Sandbox Code Playgroud) 我有两个域指向同一台服务器,一个我们将调用home
,另一个我们将调用web
。
我在端口 80 上为 HTTP 和 443 为 HTTPS 运行 nginx。在我的服务器定义中,我定义了两个服务器:
server {
listen 80;
server_name web;
# ...
}
server {
listen 443;
server_name web;
# ...
}
Run Code Online (Sandbox Code Playgroud)
在实践中,它工作得很好。但是,当我尝试访问home
指向与 相同的 IP 地址的 时web
,我会得到服务,web
而不是得到 404 或类似信息。
如何将 nginx 配置为与服务器名称不匹配的 404 请求?我是否需要定义一个默认服务器,它只会将事情退回到 404 秒?
我刚刚生成了一个 ECDSA 密钥ssh-keygen
:
ssh-keygen -t ecdsa -b 521
Run Code Online (Sandbox Code Playgroud)
然后我继续将此密钥复制到我的服务器:
cat .ssh/id_ecdsa.pub | ssh myserver "tee -a .ssh/authorized_keys"
Run Code Online (Sandbox Code Playgroud)
我已经确认我的密钥在文件中。
但是,当我尝试连接时,我的连接被拒绝:
ssh -v -i .ssh/id_ecdsa myserver
Run Code Online (Sandbox Code Playgroud)
日志:
OpenSSH_5.9p1 Debian-5ubuntu1.1, OpenSSL 1.0.1 14 Mar 2012
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug1: Connecting to myserver [192.168.1.1] port 22.
debug1: Connection established.
debug1: identity file .ssh/id_ecdsa type 3
debug1: Checking blacklist file /usr/share/ssh/blacklist.ECDSA-521
debug1: Checking blacklist file /etc/ssh/blacklist.ECDSA-521
debug1: identity file .ssh/id_ecdsa-cert type -1
debug1: …
Run Code Online (Sandbox Code Playgroud) 在 TCP 连接上使用 SSL 是否有任何带宽开销?我当然理解加密和解密数据包的处理/内存使用开销,但就带宽而言,有什么区别,如果有的话?
例如,给定一个 64KB 的 XML 文件,通过 HTTP 和 HTTPS 传输的文件大小是否有明显差异?(忽略mod_deflate
和mod_gzip
,当然)
根据此处的 Wiki ,您只能允许某些用户使用/etc/vsftp.conf
文件中的以下配置通过 FTP 登录:
userlist_enable=YES
userlist_file=/etc/vsftp.user_list
userlist_deny=NO
Run Code Online (Sandbox Code Playgroud)
我已经将我的系统配置为使用此配置,并且我只有一个用户想要通过 FTP 公开streams
,因此我/etc/vsftp.user_list
看起来像这样:
streams
Run Code Online (Sandbox Code Playgroud)
有趣的是,一旦启用用户列表,我就无法登录。如果我更改userlist_enable
为NO
,则一切正常,但是如果我启用它,则无法全部登录,它只是不断尝试重新连接。我没有收到登录失败消息,它只是在使用lftp
.
我的/etc/vsftp.conf
文件位于引擎收录在这里我/etc/vsftp.user_list
可以在这里。
我在这里做错了什么?我只想让streams
用户能够登录。
有趣的是,在我安装了 nginx 的 Ubuntu 衍生产品上apt
,www-data
用户有一个 shell:
$ cat /etc/passwd
www-data:x:33:33:www-data:/var/www:/bin/sh
Run Code Online (Sandbox Code Playgroud)
这不应该设置为类似的东西/bin/false
吗?即使用户无法登录,默认为这样的系统用户提供shell不是很危险吗?
通常,像 Amazon 的 Elastic Load Balancers 这样的负载均衡器使用具有多个 A 记录的 DNS 记录集来提供多个负载均衡器实例,这些实例可以处理到请求端点的流量:
$ dig +short my-fancy-elb.us-east-1.elb.amazonaws.com
10.0.1.1
10.0.1.2
Run Code Online (Sandbox Code Playgroud)
如果我尝试以详细模式卷曲此 URL,我会注意到curl
似乎对两个 IP 地址进行循环尝试:
$ curl -ivs http://my-fancy-elb.us-east-1.elb.amazonaws.com | grep -i 'connected'
* Connected to my-fancy-elb.us-east-1.elb.amazonaws.com (10.0.1.1)
$ curl -ivs http://my-fancy-elb.us-east-1.elb.amazonaws.com | grep -i 'connected'
* Connected to my-fancy-elb.us-east-1.elb.amazonaws.com (10.0.1.2)
Run Code Online (Sandbox Code Playgroud)
curl
对记录集中描述的 A 记录进行循环的事实是由curl
二进制本身完成的还是 Linux 内核为它做的?
TCP 存在于第 4 层,DNS 存在于第 7 层,所以我想各个二进制文件和库必须实现自己的负载平衡和故障转移:获取给定域名的 DNS 记录集并选择一个 TCP 地址以从那个集合连接到。
我可以合理地期望编程语言、浏览器和像 curl 这样的库会为我在 A 记录上进行负载平衡和故障转移吗?
我正在尝试让 OpenVPN 通过 PAM 通过 LDAP 向 Active Directory 服务器验证用户。
以下是我的配置文件的相关部分:
/etc/openvpn/server.conf:
# ...
plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so ldap-login
Run Code Online (Sandbox Code Playgroud)
/etc/nslcd.conf:
uri ldap://prod-adc1.mydomain.local
base DC=MyDomain,DC=Local
uid nslcd
gid ldap
Run Code Online (Sandbox Code Playgroud)
/etc/pam.d/ldap-login:
auth sufficient pam_ldap.so minimum_uid=1000 use_first_pass
auth required pam_deny.so
password sufficient pam_ldap.so minimum_uid=1000 use_first_pass
password required pam_deny.so
Run Code Online (Sandbox Code Playgroud)
当我尝试进行身份验证时,我在日志中看到以下内容:
/var/log/secure:
Dec 4 22:22:42 localhost openvpn[25505]: pam_ldap(ldap-login:auth): failed to get password: Authentication failure
Run Code Online (Sandbox Code Playgroud)
/var/log/messages:
Dec 4 22:38:28 localhost openvpn[25504]: 1.2.3.4:37503 TLS: Initial packet from [AF_INET]1.2.3.4:37503, sid=c2d806cc 5c7c7ace
Dec 4 22:38:28 localhost …
Run Code Online (Sandbox Code Playgroud) 我在这里为一个客户工作,他为我设置了一个 EC2 实例进行配置。我已经安装了要求的软件,现在我需要做的就是打开一些端口。我目前通过 SSH 连接到机器,它运行的是 Ubuntu 10.04。
我已经安装了ec2-ami-tools
和ec2-api-tools
软件包,并尝试运行以下内容,正如其他地方所推荐的那样:
ec2-authorize -p 1024 default
Run Code Online (Sandbox Code Playgroud)
不幸的是,这只是失败并给我留下了这个令人讨厌的错误消息:
Required option '-K, --private-key KEY' missing (-h for usage).'
Run Code Online (Sandbox Code Playgroud)
显然,我需要一个密钥来执行此操作,因此我将随实例一起收到的 PEM 密钥复制到服务器并使用该密钥再次运行它:
ec2-authorize -p 1024 -K mykey.pem default
Run Code Online (Sandbox Code Playgroud)
现在它要求证书:
Reqired option `-C, --cert CERT' missing (-h for usage).`
Run Code Online (Sandbox Code Playgroud)
啊。我真的没有证书,所以它到底要我做什么?我无权访问 EC2 Web 界面,那么如何从 Ubuntu 服务器本身打开端口?
我似乎无法在我的 Apache VirtualHost 中获得符号链接,无论我尝试什么,我在错误日志中看到以下错误:
Symbolic link not allowed or link target not accessible: /var/www/carddesigner
Run Code Online (Sandbox Code Playgroud)
我可以毫无问题地从 Linux 浏览实际的符号链接:
$ ls -l /var/www | grep "carddesigner"
lrwxrwxrwx 1 rfkrocktk rfkrocktk 64 2011-02-28 16:52 carddesigner -> /home/rfkrocktk/Documents/Projects/Work/carddesigner/build/main/
Run Code Online (Sandbox Code Playgroud)
此外,我确保我的 VirtualHost 允许 FollowSymLinks 选项:
/etc/apache2/sites-enabled/000-localhost:
<VirtualHost 127.0.0.1:80>
ServerAdmin ##########
DocumentRoot /var/www
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny …
Run Code Online (Sandbox Code Playgroud) 我正在构建一个服务,我需要在文件系统上存储大量文件。过去我听说处理大量文件时最好按文件夹分隔文件。这对于 ext3、ext4 和 btrfs 等现代 Linux 文件系统来说真的准确吗?如果是这样,我应该分割多少文件?我应该将 1000 个文件保存在一个文件夹中吗?
我目前的设置将它们分为数百、数千、数万和数十万,如下所示:
stream id: 123456
1/2/3/4/123456.file
stream id: 654321
6/5/4/3/654321.file
stream id: 5
0/0/0/0/5.file
Run Code Online (Sandbox Code Playgroud)
这对我的申请有意义吗?